關於thinkphp 與微信小程序授權登錄的心得,加上完整代碼

1.小程序端代碼

var app = getApp();
var url = '';
var login = function (code, encrypteData, iv) {
  var that = this
  //創建一個dialog提示
  wx.showToast({
    title: '正在登錄...',
    icon: 'loading',
    duration: 5000
  });
  wx.request({
    url: url,
    method: 'get',
    data: {
      code: code,
      encrypteData: encrypteData,
      iv: iv
    },
    header: {
      'Content-Type': 'application/json'
    },
    success: function (res) {
      wx.hideToast()
      //console.log('服務器返回' + res.data)
      app.globalData.userInfo = res.data
    },
    fail: function () {
      wx.showToast({
        title: '網絡錯誤!',
        duration: 2000
      })
    },
    complete: function () {

    }
  })
}
Page({
  data: {
    //判斷小程序的API,回調,參數,組件等是否在當前版本可用。
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  onLoad: function () {
    var that = this
    wx.login({
      success: function (res) { //登錄成功
        //console.log(res)
        if (res.code) {
          var code = res.code
          wx.getUserInfo({ //getUserInfo流程
            success: function (data) { //getUserInfo獲取用戶信息成功
              //console.log(data)
              //encrypteData加密密文,iv偏移向量,encodeURIComponent把加密字符串解密成URI字符串
              var encryptedData = encodeURIComponent(data.encryptedData);
              var iv = data.iv;
              //請求自己的服務器
              login(code, encryptedData, iv);
              //已經授權的用戶
              wx.switchTab({
                url: '../rec/rec',
              })
            }
          })
        } else {
          console.log('用戶沒有進行授權!' + res.errMsg)
        }
      }
    });
  },
  bindGetUserInfo: function (e) {
    //console.log(e)
    if (e.detail.userInfo) {
      //用戶按了允許授權的按鈕
      var that = this
      wx.login({
        success: function (res) {
          if (res.code) {
            var code = res.code
            wx.getUserInfo({
              success: function (data) {
                var encryptedData = encodeURIComponent(data.encryptedData);
                var iv = data.iv;
                //請求自己的服務器
                login(code, encryptedData, iv);
              }
            })
          }
        }
      })
      //授權成功後,跳轉進入小程序首頁
      wx.switchTab({
        url: '../rec/rec'
      })
    } else {
      //用戶按了拒絕按鈕
      wx.showModal({
        title: '警告',
        content: '您點擊了拒絕授權,將無法進入小程序,請授權之後再進入!!!',
        showCancel: false,
        confirmText: '返回授權',
        success: function (res) {
          if (res.confirm) {
            console.log('用戶點擊了“返回授權”')
          }
        }
      })
    }
  },
})

2.php 端代碼

public function wxlogin(){
         $get = input('get.');
         $param['appid'] = '';    //小程序id
         $param['secret'] = '';    //小程序密鑰
         $param['js_code'] = str_replace(' ','+',$get['code']);
         $param['grant_type'] = 'authorization_code';


          function httpCurl($url, $params, $method = 'POST', $header = array(), $multi = false){
        date_default_timezone_set('PRC');
        $opts = array(
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_HTTPHEADER     => $header,
            CURLOPT_COOKIESESSION  => true,
            CURLOPT_FOLLOWLOCATION => 1,
            CURLOPT_COOKIE         =>session_name().'='.session_id(),
        );
        /* 根據請求類型設置特定參數 */
        switch(strtoupper($method)){
            case 'GET':
                // $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
                // 鏈接後拼接參數  &  非?
                $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
                break;
            case 'POST':
                //判斷是否傳輸文件
                $params = $multi ? $params : http_build_query($params);
                $opts[CURLOPT_URL] = $url;
                $opts[CURLOPT_POST] = 1;
                $opts[CURLOPT_POSTFIELDS] = $params;
                break;
            default:
                throw new Exception('不支持的請求方式!');
        }
        /* 初始化並執行curl請求 */
        $ch = curl_init();
        curl_setopt_array($ch, $opts);
        $data  = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);
        if($error) throw new Exception('請求發生錯誤:' . $error);
        return  $data;
    }


         $http_key = httpCurl('https://api.weixin.qq.com/sns/jscode2session', $param, 'GET');
    $session_key = json_decode($http_key,true);
    //print_r(http_build_query($param));
    if (!empty($session_key['session_key'])) {
        $appid = $param['appid'];
        $encrypteData = urldecode($get['encrypteData']);
        $iv = str_replace(' ','+',$get['iv']);


         function decryptData( $appid , $sessionKey, $encryptedData, $iv ){
        $OK = 0;
        $IllegalAesKey = -41001;
        $IllegalIv = -41002;
        $IllegalBuffer = -41003;
        $DecodeBase64Error = -41004;
    
        if (strlen($sessionKey) != 24) {
            return $IllegalAesKey;
        }
        $aesKey=base64_decode($sessionKey);
    
        if (strlen($iv) != 24) {
            return $IllegalIv;
        }
        $aesIV=base64_decode($iv);
    
        $aesCipher=base64_decode($encryptedData);
    
        $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        $dataObj=json_decode( $result );
        if( $dataObj  == NULL )
        {
            return $IllegalBuffer;
        }
        if( $dataObj->watermark->appid != $appid )
        {
            return $DecodeBase64Error;
        }
        $data = json_decode($result,true);
    
        return $data;
    }

 

 

        $errCode = decryptData($appid, $session_key['session_key'], $encrypteData, $iv);
        //把appid寫入到數據庫中
        $data['appid'] = $errCode['openId'];
        $data['nicheng'] = $errCode['nickName'];
        $data['publishtime'] = time();
        $data['sex'] = $errCode['gender'];
        if (false == Db::name('message_user')->where(['appid' => $data['appid']])->find()) {
            Db::name('message_user')->insert($data);
            $value = Db::name('message_user')->where(['appid' => $data['appid']])->field('appid,nicheng,publishtime,sex')->select();
        }else{
            $value = Db::name('message_user')->where(['appid' => $data['appid']])->field('appid,nicheng,publishtime,sex')->select();
        }
        $array = array_merge_recursive($errCode, $value);
        return json($array);
    }else{
        echo '獲取session_key失敗!';
    }
           // return json(['status' =>1]);
     }

3.結果

發佈了34 篇原創文章 · 獲贊 3 · 訪問量 6536
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章