1. 程式人生 > >PHP做後臺實現微信小程式登入

PHP做後臺實現微信小程式登入

微信小程式登入

微信小程式官方給了十分詳細的登陸時序圖,當然為了安全著想,應該加上簽名加密。

這裡寫圖片描述

微信小程式端

1).呼叫wx.login獲取 code 。
2).呼叫wx.getUserInfo獲取簽名所需的 rawData , signatrue , encryptData 。
3).發起請求將獲取的資料傳送的後臺。

login: function(e) {
        var that = this;
        wx.login({
          success: function(res){
            var code = res.code;  //獲取code
wx.getUserInfo({ //得到rawData, signatrue, encryptData success: function(data){ var rawData = data.rawData; var signature = data.signature; var encryptedData = data.encryptedData; var iv = data.iv; wx.request({ url: '你自己的後臺地址'
, data: { "code" : code, "rawData" : rawData, "signature" : signature, 'iv' : iv, 'encryptedData': encryptedData }, method: 'GET', success: function
(info){
console.log(info); } }) } }) }, }) }

服務端

1.解壓後會出現不同語言的檔案包,這裡用的是PHP,將資料夾放到vendor目錄下。
2.根據登陸憑證 code 獲取 session_key 和 openid。
3.資料簽名校驗。
4.資料解密。
5.生成第三方3rd_session並返回微信小程式端。


  /*
     *登入(呼叫wx.login獲取)
     * @param $code string
     * @param $rawData string
     * @param $signatrue string
     * @param $encryptedData string
     * @param $iv string
     * @return $code 成功碼
     * @return $session3rd  第三方3rd_session
     * @return $data  使用者資料
 */
    public function login()
    {
        //開發者使用登陸憑證 code 獲取 session_key 和 openid
        $APPID = '';//自己配置
        $AppSecret = '';//自己配置
        $code = input('code');
        $url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $APPID . "&secret=" . $AppSecret . "&js_code=" . $code . "&grant_type=authorization_code";
        $arr = $this->vget($url);  // 一個使用curl實現的get方法請求
        $arr = json_decode($arr, true);
        $openid = $arr['openid'];
        $session_key = $arr['session_key'];
        // 資料簽名校驗
        $signature = input('signature');
        $rawData = Request::instance()->post('rawData');
        $signature2 = sha1($rawData . $session_key);
        if ($signature != $signature2) {
            return json(['code' => 500, 'msg' => '資料簽名驗證失敗!']);
        }
        Vendor("PHP.wxBizDataCrypt");  //載入解密檔案,在官方有下載
        $encryptedData = input('encryptedData');
        $iv = input('iv');
        $pc = new \WXBizDataCrypt($APPID, $session_key);
        $errCode = $pc->decryptData($encryptedData, $iv, $data);  //其中$data包含使用者的所有資料
        $data = json_decode($data);
        if ($errCode == 0) {
            dump($data);
            die;//列印解密所得的使用者資訊
        } else {
            echo $errCode;//列印失敗資訊
        }
    }

    public function vget($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;
    }