微信小程序登录会话流程学习

282 阅读3分钟

具体伪代码如下:

 /**
 * 我把这一步封装成一个函数,以后再调用那些需要登录后才有权限访问的后台服务时.
 * 可以使用使用这个函数操作,基本逻辑,还可以进行扩展
 * @url      : 开发者服务器登录服务接口 可设置默认值
 * @key      : 存入本地缓存的第三方自定义登录session的键值
 * @callback : 需要用到登录服务的回调函数(或函数集合)
 */
function  Login(key,url,callback){
     // 首先使用wx.login获取登录凭证code并发送给开发者服务器
     wx.login({
      success: function(res) {
        if (res.code) {
          //发送code给开发者服务器以获取session_key和openid
          wx.request({
            url:url,
            data: {
              code: res.code
            },
            //发送至开发者服务器成功
            success: function(res) {
                //开发者服务器获得session_key和openid成功并返回了
                //第三方自定义session或者解密数据等json格式数据res给客户端
                if(res.has3rdSession){
                    //登录成功,将第三方session存入本地缓存
                    console.log("登录成功")
                    wx.setStorageSync(key,res.3rdSession)
                    //设置登录标识为true
                    this.setData{
                        flag:true
                    }
                    //进行后续回调处理
                    callback(res)
                    ....
                }
                else{
                    //没有返回第三方自定义session,登录失败
                    console.log("登录失败")
                    ....
                }
            }
          })
        } else {
          //没有获取到登录凭证code,登录失败
          console.log('登录失败!' + res.errMsg)
          ....
        }
      }
    })
}
/**
 - 我把这一步封装成一个函数,以后再调用那些需要登录后才有权限访问的后台服务时.
 - 可以使用使用这个函数操作,基本逻辑,还可以进行扩展
 - @url      : 开发者服务器服务接口
 - @key      : 自己定义的session存储在本地缓存中的键名
 - @callback : 需要用到登录服务的回调函数(或函数集合)
 - @others   : 其他需要用到的数据等参数
 */
function doRequestWithSession(key,url,callback,others)
{
    try {
      var value = wx.getStorageSync(key)
      if (value) {
          // 存在自定义登录session,非首次登录
          // 查询 用户密钥session_key是否过期
          wx.checkSession({
              success: function(){
                //session_key 未过期,并且在本生命周期一直有效
                //向开发者服务器发送自定义session查询用户信息
                wx.request({
                      url: url, 
                      data: value,  //本地缓存的自定义Session值 可以加上其他需要的数据others等
                      success: function(res) {
                         if(res.hasSession){
                            //查询成功,开发者服务器上有我们自定义的session
                            //根据返回结果进行对应的操作,先判断session是否过期
                            //如果我们自定义的session已经过期
                            if(res.expired){
                                console.log("session过期,重新登录")
                                //设置登录标识为false
                                this.setData{
                                    flag:false
                                }
                                wx.login() //重新登录 或者 返回错误码
                                ....
                            }
                            else{
                            //没有过期,返回的结果则可以是用户的相关信息
                            //进行相关操作 登录成功
                               console.log("欢迎回来")
                               callback(res)
                               ....  
                            }    
                          }
                          else
                          {
                              //开发者服务器上没有我们自定义的session,重新登录
                              console.log("无此session,重新登录")
                              //设置登录标识为false
                                this.setData{
                                    flag:false
                                }
                              wx.login() //重新登录 或者 返回错误码
                              ....
                          }             
                      }
                })
              },
              fail: function(){
                // session_key 已经失效,需要重新执行登录流程
                //设置登录标识为false
                this.setData{
                    flag:false
                }
                wx.login() //重新登录 或者 返回错误码
                ....
              }
          })    
      }
      else{
          //本地缓存中没有自定义的session登录态信息,则进行首次登录或者后续处理
          //设置登录标识为false
          this.setData{
             flag:false
          }
          wx.login() //登录 或者 返回错误码
          ....
      }
    } catch (e) {
      // 异常处理
      ....
    }
 }


<?php 
class WXBizDataCrypt
{
    private $appid;
    private $sessionKey;

    /**
     * 构造函数
     * @param $sessionKey string 用户在小程序登录后获取的会话密钥
     * @param $appid string 小程序的appid
     */
    public function __construct( $appid, $sessionKey)
    {
        $this->sessionKey = $sessionKey;
        $this->appid = $appid;
    }


    /**
     * 检验数据的真实性,并且获取解密后的明文.
     * @param $encryptedData string 加密的用户数据
     * @param $iv string 与用户数据一同返回的初始向量
     * @param $data string 解密后的原文
     *
     * @return int 成功0,失败返回对应的错误码
     */
    public function decryptData( $encryptedData, $iv, &$data )
    {
        if (strlen($this->sessionKey) != 24) {
            return ErrorCode::$IllegalAesKey;
        }
        $aesKey=base64_decode($this->sessionKey);

        
        if (strlen($iv) != 24) {
            return ErrorCode::$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 ErrorCode::$IllegalBuffer;
        }
        if( $dataObj->watermark->appid != $this->appid )
        {
            return ErrorCode::$IllegalBuffer;
        }
        $data = $result;
        return ErrorCode::$OK;
    }

}

$appid = 'wx4f4bc4dec97d474b';
$sessionKey = 'tiihtNczf5v6AKRyjwEUhQ==';

$encryptedData="CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
                QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
                9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
                3hVbJSRgv+4lGOETKUQz6OYStslQ142d
                NCuabNPGBzlooOmB231qMM85d2/fV6Ch
                evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
                /1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
                u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
                /Hz7saL8xz+W//FRAUid1OksQaQx4CMs
                8LOddcQhULW4ucetDf96JcR3g0gfRK4P
                C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
                6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
                /8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
                lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
                oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
                20f0a04COwfneQAGGwd5oa+T8yO5hzuy
                Db/XcxxmK01EpqOyuxINew==";

$iv = 'r7BXXKkLb8qrSNn05n0qiA==';

$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );

if ($errCode == 0) {
    print($data . "\n");
} else {
    print($errCode . "\n");
}
?>