准确来讲不是有时,是隔断时间后必然失败(貌似不是因为Sessionkey没更新,请看下文)
代码流程是这样的:
前端调用
wx.checkSession()
判断Sessionkey是否失效,如果失效就调用wx.login()
然后把登录凭证code传给后端;后端根据凭证获取新的Sessionkey,并存入数据库(更新数据库中的数据);
前端获取到加密数据后传给后端解密;
后端从数据库取到最新的Sessionkey,根据官方提供的方法解密。解密成功之后数据传给前端。
但非常奇怪的是第一天是可以正常解密的,第二天就会返回-41003的错误码:
// 这是后端报错的代码片段
$result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
$dataObj=json_decode( $result );
if( $dataObj == NULL ) {
return array(
'code'=>-41003,
'msg'=>'aes 解密失败:'.$sessionKey
);
}
debug过程
尝试不调用
wx.checkSession()
而直接刷新Sessionkey,依然失败;后端的Sessionkey的确是最新的,每次刷新后数据库都会更新;
解密时使用的Sessionkey和数据库最新数据对比一致;
比较奇怪的点
使用‘微信开发者工具’右上角的清缓存功能,点全部清除后,就能正确解密了。但是到了明天(或者过段时间)就又不行了。
求解问题出在哪里?
---------------------------------
图片补充:
上边那张是解密失败时给服务端传的参数,下面两张是解密成功时传的参数
我也遇到,我是在获得用户手机号出现的问题。原因是因为加密和解密的sessionKey不一致导致。
因为sessionKey是login接口获得的,而加密数据是另一个接口获得的,这就有个时间差,策略不好容易产生这个问题。
检验方法:可以把sessionKey都保留下来,如果出现解密内容为空,可以试试上次的sessionKey即可验证。
目前策略 : 服务器端记录openid和session,获取加密数据后checkSession检查一下,如果没过期就使用服务器端session,否则通过code重新更新session。