基於TP5的微信的公衆號獲取登陸用戶信息

以前講過微信的公衆號自動登陸的菜單配置,此次記錄一下在TP5項目中獲取自動登陸的用戶信息並存到數據庫的操做php

基本的流程爲:微信設置自動登陸的菜單—>訪問的URL指定的函數裏獲取用戶信息—>將信息存到數據庫中->返回視圖數據庫

也能夠參考下列流程圖:json

 

接下來咱們一步步編寫代碼。api

 

一. 在公衆號內設置菜單,可參考個人另外一篇文章:公衆號打開網頁自動登錄配置

二. 在配置文件(config.php)中加上公衆號信息

// 公衆號配置
    'wechat'           => [ 
        
        // AppId
        'AppId'               => "你的公衆號AppId", // 微信支付APPID
        // AppSecret
        'AppSecret'           => "你的公衆號AppSecret", // 公衆賬號secert (公衆號支付專用)
       
    ],

三. 在指定的URL對應的函數裏編寫代碼

     3.1 引入Session類和配置文件類,實例化配置文件類

use \think\Session;
use \think\Config;
// 獲取配置文件裏的信息
    $wx_config = Config::get('wechat');

     

     3.2 另外編寫一個函數,用於請求微信接口,獲取數據 

// 用於請求微信接口獲取數據
    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;
    }

 

如下流程直接貼所有完整代碼微信

     3.3 獲取頁面url的code參數值,並與AppId和AppSecret組合URL,調用get_by_curl()函數獲取用戶openid和access_token

       這裏的code參數是你以前設定的那個菜單的url在微信內訪問後,會根據用戶信息自動生成,跳轉到你的url後會自動加在url後面session

     3.4 用openid和access_token組合url,調用get_by_curl()函數獲取用戶詳情信息

     3.5 將用戶信息取出,根據openid判斷當前用戶是否存在數據庫中,不存在則新增到數據庫

     3.6 若是當前用戶存在且信息有改變,則改變數據庫中對應的用戶信息

     3.7 將用戶openid做爲標識存到session中

     3.8 返回視圖

// 獲取頁面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

注意:若是沒法得到數據,請檢查AppIDAppSecret是否正確,同時,還要檢查是否給你訪問的網頁域名受權curl

相關文章
相關標籤/搜索