小程序登录官方流程
php(ThinkPHP)实现微信小程序的登录过程
微信小程序登录态验证流程
wulongtao/think-wxminihelper
public function login()
{
$code = input("code", '', 'htmlspecialchars_decode');
$rawData = input("rawData", '', 'htmlspecialchars_decode');
$signature = input("signature", '', 'htmlspecialchars_decode');
$encryptedData = input("encryptedData", '', 'htmlspecialchars_decode');
$iv = input("iv", '', 'htmlspecialchars_decode');
$superior_id = input("superior_id",0);
$return = LoginLogic::getInstance()->wxLogin($code, $rawData, $signature, $encryptedData, $iv,$superior_id);
return $this->result($return);
}
public function wxLogin($code, $rawData, $signature, $encryptedData, $iv, $superior_id)
{
//微信认证服务
$wxLogin = WXLoginHelper::getInstance()->checkLogin($code, $encryptedData, $iv);
Log::info(json_encode($wxLogin));
Log::info(urldecode($rawData));
//判断数据是否正常返回
if (isset($wxLogin['message'])) {
return $wxLogin;
}
//获取openid对应用户信息
$userinfo = UserService::getInstance()->getUserInfoByOpenid($wxLogin['openid']);
//入库
if (empty($userinfo)) {
//解析数据
$wxHelper = WXLoginHelper::getInstance()->checkdecrypt(
$code,
$rawData,
$signature,
$encryptedData,
$iv,
$wxLogin['openid'],
$wxLogin['session_key']
);
if (isset($wxHelper['message'])) {
Log::info('解析失败');
//解析data
$raw = json_decode(urldecode($rawData), true);
$wxHelper = array_merge($raw, $wxHelper);
}
//添加用户信息
$userinfo = UserService::getInstance()->setUserinfo(
$wxHelper['nickName'],
$wxHelper['openId'] ?? $wxLogin['openid'],
($wxHelper['unionId'] ?? $wxLogin['openid'] ?? ''),
$wxHelper['avatarUrl'],
UserConst::TYPE_USER
);
//添加用户amount信息表
if ($userinfo['is_insert']) {
UserAmountModel::getInstance()->setUserAmount($userinfo['id']);
}
//上级关系
UserFrinedModel::getInstance()->setFriend($superior_id, $userinfo['id']);
}
$return['token'] = Jwt::getToken($userinfo);
return $return;
}
WXLoginHelper
think-wxminihelper
基于ThinkPHP5.0的微信小程序composer包。
安装方法:
composer require xxh/think-wxminihelper
WXLoginHelper原理
微信小程序前端部分
/**
* 登录
*/
function wxLogin(func) {
//调用登录接口
//1.小程序调用wx.login得到code.
wx.login({
success: function (res) {
var code = res['code'];
//2.小程序调用wx.getUserInfo得到rawData, signatrue, encryptData.
wx.getUserInfo({
success: function (info) {
console.log(info);
var rawData = info['rawData'];
var signature = info['signature'];
var encryptData = info['encryptData'];
var encryptedData = info['encryptedData']; //注意是encryptedData不是encryptData...坑啊
var iv = info['iv'];
//3.小程序调用server获取token接口, 传入code, rawData, signature, encryptData.
wx.request({
url: constants.LOGIN_URL,
data: {
"code" : code,
"rawData" : rawData,
"signature" : signature,
"encryptData" : encryptData,
'iv' : iv,
'encryptedData': encryptedData
},
success: function(res) {
if(res.statusCode != 200) {
wx.showModal({
title: '登录失败'
});
}
typeof func == "function" && func(res.data);
}
});
}
});
}
});
}