ThinkPHP5-微信小程式獲取使用者授權登入資訊

lanffff發表於2019-07-02

因為最近在用TP5開發小程式,所以就上網搜尋了一下TP框架對應的微信小程式獲取授權資訊的依賴,但是結果不太理想,於是就借鑑了laravel的iwanli/wxxcx依賴,自己手動寫了一個TP5的獲取資訊介面,下面分享一下具體的實現流程。

1.梳理

首先要知道的是,小程式開發中,微信小程式授權時後臺會獲取的引數:

  • encryptedData:加密後的使用者資訊
  • code:登入憑證碼
  • iv:偏移向量,在解密是要用到的

這三個引數是通過小程式前端傳送到後臺的。

之後需要去微信小程式官方文件裡面下載解密 sdk

下載完畢之後,解壓並放入TP5專案的extend資料夾裡面。

2.實現流程

首先在控制器中引用,以本人程式碼為例。

.
.
.
//引用解密元件
use wxxcx\wxBizDataCrypt;

.
.
.
    public function demo()
    {
        // 前臺引數
        $encryptedData = input('get.encryptedData');
        $code          = input('get.code');
        $iv            = input('get.iv');

        // 小程式 appid 和 appsecret
        $appid     = 'wx4f4bc4dec97d474b';
        $appsecret = '#################';

        // step1
        // 通過 code 用 curl 向騰訊伺服器傳送請求獲取 session_key
        $session_key = $this->sendCode($appid, $appsecret, $code);

        // step2
        // 用過 session_key 用 sdk 獲得使用者資訊
        $save = [];

        // 相關引數為空判斷
        if (empty($session_key) || empty($encryptedData) || empty($iv)) {
            $msg = "資訊不全";
            return $this->ApiSuccess($save, $msg);
        }

        //進行解密
        $userinfo = $this->getUserInfo($encryptedData, $iv, $session_key, $appid);

        // 解密成功判斷
        if (isset($userinfo['code']) && 10001 == $userinfo['code']) {
            $msg = "請重試"; // 使用者不應看到程式細節
            return $this->ApiSuccess($save, $msg);
        }

        session('myinfo', $userinfo);
        $save['openid']    = &$userinfo['openId'];
        $save['uname']     = &$userinfo['nickName'];
        $save['unex']      = &$userinfo['gender'];
        $save['address']   = &$userinfo['city'];
        $save['avatarUrl'] = &$userinfo['avatarUrl'];
        $save['time']      = time();
        $map['openid']     = &$userinfo['openId'];

        $msg = "獲取成功";

        //返回使用者資訊
        return $this->ApiSuccess($save, $msg);

    }

    //獲取微信使用者資訊
    private function sendCode($appid, $appsecret, $code)
    {
        // 拼接請求地址
        $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='
            . $appid . '&secret=' . $appsecret . '&js_code='
            . $code . '&grant_type=authorization_code';

        $arr = $this->vegt($url);
        $arr = json_decode($arr, true);

        return $arr['session_key'];
    }

    // curl 封裝
    private function vegt($url)
    {
        $info = curl_init();
        curl_setopt($info, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($info, CURLOPT_HEADER, 0);
        curl_setopt($info, CURLOPT_NOBODY, 0);
        curl_setopt($info, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($info, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($info, CURLOPT_URL, $url);
        $output = curl_exec($info);
        curl_close($info);
        return $output;
    }

    //資訊解密
    private function getUserInfo($encryptedData, $iv, $session_key, $APPID)
    {
        //進行解密
        $pc         = new WXBizDataCrypt($APPID, $session_key);
        $decodeData = "";
        $errCode    = $pc->decryptData($encryptedData, $iv, $decodeData);
        //判斷解密是否成功
        if ($errCode != 0) {
            return [
                'code'    => 10001,
                'message' => 'encryptedData 解密失敗',
            ];
        }
        //返回解密資料
        return json_decode($decodeData, true);
    }
.
.
.

以上就是TP5獲取微信小程式授權使用者資訊的實現流程。

可以將程式碼中vegt方法轉到公共函式庫中

sendCodegetUserInfo可以進行抽象、再次改進,實現功能分離。

以後如果有釘釘小程式,百度小程式等等使用者資訊獲取,都可以用

相關文章