文档上说是对用户数据的加密签名的密钥,,是不是就是对encryptedData解密用的,,也仅此而已,没有其他作用吧!
如果后台并不需要解密encryptedData呢,因为openid和unionid都已经拿到了,其他的资料信息不需要。
那么,wx.checksession岂不是都用不上了,因为wx.checksession就是检查session_key是否过期的。
文档上说是对用户数据的加密签名的密钥,,是不是就是对encryptedData解密用的,,也仅此而已,没有其他作用吧!
如果后台并不需要解密encryptedData呢,因为openid和unionid都已经拿到了,其他的资料信息不需要。
那么,wx.checksession岂不是都用不上了,因为wx.checksession就是检查session_key是否过期的。
用来解密$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')
];
}
8 回答4.6k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
3 回答3.1k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
A.session_key 有两个作用:
校验用户信息(wx.getUserInfo(OBJECT)返回的signature);
解密(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) 是否过期来更新着些信息;