PHP+TP框架實現微信網頁授權,獲取用戶信息

一.準備工作.

1.將需要使用到的微信配置放在config.php配置文件中方便獲取.(我使用的是微信測試號)

 

return array(
   //'配置項'=>'配置值'
    'appID'=>'wxf58**********f2e',
    'appSecret'=>'2dd3de4141aadd088**********6264b'
);

2.更改網頁授權的回調域名爲我們當前項目的域名。(注意這個域名要是能線上訪問的)

 

準備工作完成.

 

二.驗證用戶是否進行過微信登陸.

1.新建微信授權類AuthController,該類用於完成微信授權,將用戶的信息保存在數據庫,將每個用戶在數據庫中的唯一標識user_id保存在session 中.

2.新建驗證用戶是否進行過微信授權的基類BaseController,該類是每個控制器的基類,除認證類外.

3.使用基類BaseController驗證用戶是否進行過微信授權,如果沒有,則進行微信授權.

 

class BaseController extends Controller{
    //使用tp框架提供的構造函數驗證session中是否有用戶的信息的唯一標識user_id
    public function _initialize(){
        $user_id = session('user_id');
        if(!$user_id){
            //獲取當前網頁,授權後跳回
            $path =  $_SERVER['REQUEST_URI'];
            //跳轉到微信授權
            header('Location:/home/auth/index?path='.$path);
        }
    }
}

 

三.網頁授權,獲取用戶的基本信息.授權在AuthController類中。

1.用戶授權,獲取code.

 

//用戶授權獲取code
public function index(){
    //授權完跳轉的網址
    $path = $_REQUEST['path'];
    //用戶同意授權後回調的網址.必須使用url對回調網址進行編碼,我們也將授權完跳轉對網址,
    $redirect_uri = urlencode('http://'.$_SERVER['HTTP_HOST'].'/home/auth/callback');
    header('Location:https://open.weixin.qq.com/connect/oauth2/authorize?appid='
    .C('appID').'&redirect_uri='.$redirect_uri.'&response_type=code&scope=snsapi_userinfo&state='.$path.
        '#wechat_redirect');
}

 

注意:redirect_uri 回調網址需要使用urlencode進行編碼,scope參數值爲snsapi_userinfo時是用戶確實授權才能獲取到用戶到基本信息,當回調的時候會帶上code參數和state參數,所以這裏我將state參數值設置爲授權完成後跳轉到原網頁到網址。

 

 

2.用戶授權跳轉到回調網址後,我們根據獲取到code換取網頁授權access_token,獲取網頁授權access_token和openid獲取用戶的基本信息,保存在數據庫中。

 

//獲取code後的回調函數
public function callBack(){
    //獲取到的code
    $code = $_REQUEST['code'];

    //授權結束後的回調網址
    $path = $_REQUEST['state'];

    //獲取access_token
    $curl = curl_init();

    curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/sns/oauth2/access_token?appid='
        .C('appID').'&secret='.C('appSecret').'&code='.$code.'&grant_type=authorization_code ');

    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);

    //獲取access_token和openid,轉換爲數組
    $data = json_decode(curl_exec($curl),true);

    //如果獲取成功,根據access_token和openid獲取用戶的基本信息
    if($data != null && $data['access_token']){

        //獲取用戶的基本信息,並將用戶的唯一標識保存在session中
        curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/sns/userinfo?access_token='
            .$data['access_token'].'&openid='.$data['openid'].'&lang=zh_CN');

        $user_data = json_decode(curl_exec($curl),true);

        if($user_data != null && $user_data['openid']){

            curl_close($curl);
            //將用戶信息存在數據庫中,同時將用戶在數據庫中唯一的標識保存在session中
            $array = [];

            $array['openid'] = $user_data['openid'];
            $array['nickname'] = $user_data['nickname'];
            $array['headimgurl'] = $user_data['headimgurl'];

            //我這裏只存儲了用戶的openid,nickname,headimgurl
            $model = M('user');
            //先判斷用戶數據是不是已經存儲了,如果存儲了獲取用戶在數據庫中的唯一標識
            $user_id = $model->where(['openid'=>$array['openid']])->getField('user_id');
            if($user_id){
                session('user_id',$user_id);
            }else{
                $user_id = $model->add($array);
                //將用戶在數據庫中的唯一表示保存在session中
                session('user_id',$user_id);
            }
            //跳轉網頁
            header('Location:'.$path);
        }else{

            curl_close($curl);

            exit('獲取用戶信息失敗!');

        }
    }else{

        curl_close($curl);

        exit('微信授權失敗');
    }
}

 

 

 

以上是微信網頁授權的整個流程。同時保持了用戶一直在授權後的登錄狀態。

 

如果有錯誤,請大家指出,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章