以前講過微信的公衆號自動登陸的菜單配置,此次記錄一下在TP5項目中獲取自動登陸的用戶信息並存到數據庫的操做php
基本的流程爲:微信設置自動登陸的菜單—>訪問的URL指定的函數裏獲取用戶信息—>將信息存到數據庫中->返回視圖數據庫
也能夠參考下列流程圖:json
接下來咱們一步步編寫代碼。api
// 公衆號配置 'wechat' => [ // AppId 'AppId' => "你的公衆號AppId", // 微信支付APPID // AppSecret 'AppSecret' => "你的公衆號AppSecret", // 公衆賬號secert (公衆號支付專用) ],
use \think\Session; use \think\Config;
// 獲取配置文件裏的信息 $wx_config = Config::get('wechat');
// 用於請求微信接口獲取數據 function get_by_curl($url,$post = false){ $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if($post){ curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS,$post); } $result = curl_exec($ch); curl_close($ch); return $result; }
如下流程直接貼所有完整代碼微信
這裏的code參數是你以前設定的那個菜單的url在微信內訪問後,會根據用戶信息自動生成,跳轉到你的url後會自動加在url後面session
// 獲取頁面URL的CODE參數,判斷是否有值 if(isset($_GET['code'])) { // 獲取openid和access_token $app_id = $wx_config['AppId']; $app_secret = $wx_config['AppSecret']; $code = $_GET['code']; // 發送請求,獲取用戶openid和access_token $data = $this->get_by_curl('https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$app_id.'&secret='.$app_secret.'&code='.$code.'&grant_type=authorization_code'); $data = json_decode($data); // 防止第二次訪問動態連接報錯 // 判斷是否獲取到當前用戶的openid if(isset($data->openid)){ $open_id = $data->openid; $access_token = $data->access_token; // 獲取當前用戶信息 $user_info = $this->get_by_curl('https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$open_id.'&lang=zh_CN'); $user_info = json_decode($user_info); // 取出用戶信息 /* *user_openid :用戶openId *user_nickname :用戶暱稱 *user_sex :性別 *user_province :省 *user_city :城市 *user_headimgurl :用戶頭像url */ $user_openid = $user_info->openid; $user_nickname = $user_info->nickname; $user_sex = $user_info->sex; $user_province = $user_info->province; $user_city = $user_info->city; $user_headimgurl = $user_info->headimgurl; // 如下操做可按照本身的需求編寫,這裏只作例子 // 判斷用戶是否存在 $data_user = model('app\admin\model\User') ->where('open_id','=',$user_openid) ->find(); if(empty($data_user)){ $new_user = model('app\admin\model\User'); $new_user->data([ 'open_id' => $user_openid, 'name' => $user_nickname, 'sex' => $user_sex, 'province' => $user_province, 'city' => $user_city, 'headimgurl' => $user_headimgurl, 'join_time' => time(), ]); // 新增用戶到數據庫 $new_user->save(); } $cur_user = model('app\admin\model\User') ->where('open_id','=',$user_openid) ->find(); // 判斷當前用戶是否修改過信息,如有變更則更新 if(strcmp($cur_user->name,$user_nickname)!=0||strcmp($cur_user->headimgurl,$user_headimgurl)!=0){ $cur_user->name = $user_nickname; $cur_user->headimgurl = $user_headimgurl; // 更新當前用戶信息 $cur_user->save(); } // 將當前用戶openid做爲標識存到session裏 Session::set('open_id', $cur_user->open_id); } }
return $this->view->fetch('index');
至此就完成了公衆號網頁獲取當前用戶信息,並保存到數據庫的操做app
注意:若是沒法得到數據,請檢查AppID和AppSecret是否正確,同時,還要檢查是否給你訪問的網頁域名受權了curl