第三方平台代替小程序实现登录功能流程梳理和实现
2019-11-06 本文已影响0人
沙蒿同学
image.png
整体流程
微信小程序登录流程时序图详细说明
现在用户初次进入小程序中先需要用户进行授权操作,其实就是“登录”,然后拿到“用户信息”的操作。上面wx.login()只是拿到了登录code,并没有获取用户信息。一般小程序登录接口会给code和用户加密敏感信息相关字段。
参数 | 类型 | 说明 |
---|---|---|
appId | string | 小程序的app_id |
code | string | 登录code |
rawData | string | 不包括敏感信息的原始数据字符串,用于计算签名 |
signature | string | 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见 用户数据的签名验证和加解密 |
encryptedData | string | 包括敏感数据在内的完整用户信息的加密数据,详见 用户数据的签名验证和加解密 |
iv | string | 加密算法的初始向量,详见 用户数据的签名验证和加解密 |
接收到参数后,从时序图可以知道。要拿code调用微信接口获取session_key和openid这些加密信息,然后对其进行解密,解密就用官方的解密sdk就好,最好保存小程序粉丝信息,返回自定义登录token给前端,下次前端请求接口的时候需要在请求头把自定义的tokne给过来验证。
- 小程序登录调用地址
GET https://api.weixin.qq.com/sns/component/jscode2session?appid=APPID&js_code=JSCODE&grant_type=authorization_code&component_appid=COMPONENT_APPID&component_access_token=COMPONENT_ACCESS_TOKEN
- 参数
'appid' => appid, //小程序appid
'js_code' => code, //登录code
'grant_type' => 'authorization_code', //固定值
'component_appid' => WX_APP_ID, //第三方平台 appid
'component_access_token' => $comAccToke //第三方平台接口凭证
代码实现
$this->request()->getParams() 是封装好的获取参数的方法,可自行替代
getComAccessToken() 是封装好的获取第三方接口调用凭证的方法,可自行替代
httpsCurl() 是封装好的请求微信的方法,可自行替代
WX_APP_ID 是全局参数第三方平台的app_id
PS:这里的代码仅仅只是把整个业务流程写在一起,方便阅读,实际场景中代码当然不会这样子写
/**
* Created by 沙蒿.
* @desc 小程序用户授权登录
*/
public function wxLogin()
{
//接收参数
$request = $this->request()->getParams();
$filter = [];
$filter['appid'] = $request['appid'];
$filter['code'] = $request['code'];
$filter['userInfo'] = $request['userInfo'];
$filter['rawData'] = $request['rawData'];
$filter['signature'] = $request['signature'];
$filter['encryptedData'] = $request['encryptedData'];
$filter['iv'] = $request['iv'];
//校验参数
$check = $this->checkAppLogin($filter);
//获取第三方接口调用凭证(令牌)
$comAccToken = $this->getComAccessToken();
//调用微信服务器接口,获,openId + sessionKey + (unionId)
$url = 'https://api.weixin.qq.com/sns/component/jscode2session';
$loginInfo = CommonService::getInstance()->httpsCurl($url, 'get', 'json', [
'appid' => $filter['appid'],
'js_code' => $filter['code'],
'grant_type' => 'authorization_code',
'component_appid' => WX_APP_ID,
'component_access_token' => $comAccToken
]);
//sha1散列算法加密,验证signature
$signature = sha1($filter['rawData'] . $loginInfo['session_key']);
//加密数据解密算法,解密获取用户敏感信息
include_once ROOT_PATH . 'wxBizDataCrypt.php';
$decrypt = new \WXBizDataCrypt($filter['appid'], $loginInfo['session_key']);
$errCode = $decrypt->decryptData($filter['encryptedData'], $filter['iv'], $userInfo);
//保存用户粉丝到用户服务,并调用帐号服务获取token
return $this->saveMiniAppFans($userInfo, $filter['appid'], $loginInfo['session_key']);
}