因為最近在用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
方法轉到公共函式庫中
sendCode
和getUserInfo
可以進行抽象、再次改進,實現功能分離。
以後如果有釘釘小程式,百度小程式等等使用者資訊獲取,都可以用