编什么程

第三方平台代替小程序实现登录功能流程梳理和实现

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']);
    }
上一篇下一篇

猜你喜欢

热点阅读