微信小程序 session_key 的作用是什么

图片描述

文档上说是对用户数据的加密签名的密钥,,是不是就是对encryptedData解密用的,,也仅此而已,没有其他作用吧!

如果后台并不需要解密encryptedData呢,因为openid和unionid都已经拿到了,其他的资料信息不需要。

那么,wx.checksession岂不是都用不上了,因为wx.checksession就是检查session_key是否过期的。

阅读 27k
2 个回答

A.session_key 有两个作用:

  1. 校验用户信息(wx.getUserInfo(OBJECT)返回的signature);

  2. 解密(wx.getUserInfo(OBJECT)返回的encryptedData);

B.按照官方的说法,wx.checksession是用来检查 wx.login(OBJECT) 的时效性,判断登录是否过期;

疑惑的是(openid,unionid )都是用户唯一标识,不会因为wx.login(OBJECT)的过期而改变,所以要是没有使用wx.getUserInfo(OBJECT)获得的用户信息,确实没必要使用wx.checksession()来检查wx.login(OBJECT) 是否过期;

如果使用了wx.getUserInfo(OBJECT)获得的用户信息,还是有必要使用wx.checksession()来检查wx.login(OBJECT) 是否过期的,因为用户有可能修改了头像、昵称、城市,省份等信息,可以通过检查wx.login(OBJECT) 是否过期来更新着些信息;

用来解密$encryptData,如果你需要在后端获取userinfo的话。
当然如果你打算从前端丢userinfo到后端或者根本不需要userinfo只是需要openid的话,应该是没有什么用的

    public static function login($code, $encryptData, $iv) {
        // 1. 获取 session key
        $sessionKey = self::getSessionKey($code);

        // 2. 生成 3rd key (skey)
        $skey = sha1($sessionKey . mt_rand());
        
        /**
         * 3. 解密数据
         * 由于官方的解密方法不兼容 PHP 7.1+ 的版本
         * 这里弃用微信官方的解密方法
         * 采用推荐的 openssl_decrypt 方法(支持 >= 5.3.0 的 PHP)
         * @see http://php.net/manual/zh/function.openssl-decrypt.php
         */
        $decryptData = \openssl_decrypt(
            base64_decode($encryptData),
            'AES-128-CBC',
            base64_decode($sessionKey),
            OPENSSL_RAW_DATA,
            base64_decode($iv)
        );
        $userinfo = json_decode($decryptData);

        // 4. 储存到数据库中
        User::storeUserInfo($userinfo, $skey, $sessionKey);

        return [
            'loginState' => Constants::S_AUTH,
            'userinfo' => compact('userinfo', 'skey')
        ];
    }
推荐问题
宣传栏