收藏
回答

【求助】小程序解密数据有时会失败


准确来讲不是有时,是隔断时间后必然失败(貌似不是因为Sessionkey没更新,请看下文

代码流程是这样的:

  1. 前端调用wx.checkSession()判断Sessionkey是否失效,如果失效就调用wx.login()然后把登录凭证code传给后端;

  2. 后端根据凭证获取新的Sessionkey,并存入数据库(更新数据库中的数据);

  3. 前端获取到加密数据后传给后端解密;

  4. 后端从数据库取到最新的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和数据库最新数据对比一致;

比较奇怪的点

使用‘微信开发者工具’右上角的清缓存功能,点全部清除后,就能正确解密了。但是到了明天(或者过段时间)就又不行了。

求解问题出在哪里?

---------------------------------

图片补充:


上边那张是解密失败时给服务端传的参数,下面两张是解密成功时传的参数

最后一次编辑于  2018-05-16  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

9 个回答

  • 金小刚要早起看人间
    金小刚要早起看人间
    2018-05-18

    我也遇到,我是在获得用户手机号出现的问题。原因是因为加密和解密的sessionKey不一致导致。

    因为sessionKey是login接口获得的,而加密数据是另一个接口获得的,这就有个时间差,策略不好容易产生这个问题。


    检验方法:可以把sessionKey都保留下来,如果出现解密内容为空,可以试试上次的sessionKey即可验证。


    目前策略 : 服务器端记录openid和session,获取加密数据后checkSession检查一下,如果没过期就使用服务器端session,否则通过code重新更新session。

    2018-05-18
    赞同 1
    回复
  • 李晓
    李晓
    2018-06-22

    保证wx.login的code在wx.getUserInfo之前返回

    2018-06-22
    赞同 1
    回复
  • 邓亮
    邓亮
    2018-05-16

    帮顶!  让官方看到

    2018-05-16
    赞同
    回复
  • 齐齐
    齐齐
    2018-05-16

    我也遇到过这样的情况

    2018-05-16
    赞同
    回复
  • 娇华
    娇华
    2018-05-16

    你好,建议先看下这个回答,看看是不是遇到同类型问题

    微信小程序登录,服务端解密有几率-41003
    https://developers.weixin.qq.com/blogdetail?action=get_post_info&docid=d4c99d069680602e7c935b566ed0fb66&highline=41003

    2018-05-16
    赞同
    回复 4
    • a苏子晨i
      a苏子晨i
      2018-05-16
      应该不是的。 如果encodeURIComponent()处理之后传给后端,解密时就会报错-41002,iv非法
      2018-05-16
      1
      回复
    • 好久不见
      好久不见
      2018-05-16
      我这边现在就有这种情况怎么解决呢,测试了不是上面的原因,很急!!!
      2018-05-16
      2
      回复
    • 刘小军Lebus
      刘小军Lebus
      2018-07-08

      官方真的很敷衍!

      2018-07-08
      3
      回复
    • 指尖的温柔
      指尖的温柔
      06-28回复刘小军Lebus

      这下 连敷衍都不敷衍了.

      06-28
      回复
  • a苏子晨i
    a苏子晨i
    2018-05-17

    求帮忙

    2018-05-17
    赞同
    回复
  • 🐷
    🐷
    2018-05-18

    我们也是偶尔很大几率丢失

    2018-05-18
    赞同
    回复
  • 范国金
    范国金
    2018-06-29

    我也是一样的问题。。。竟然这么容易出错

    服了

    2018-06-29
    赞同
    回复
  • R.飞
    R.飞
    2018-11-06

    帮顶。。解密手机号、用户信息都出现过这些问题。前面几楼有人说:“保证wx.login的code在wx.getUserInfo之前返回”。我们也都是这么做的。但是还会出现。。sessionKey总有一个过期时间的临界点,前端获取加密的信息,在传到后端解密,总是存在时间差。所以,肯定会出现微信用老密钥加密,我们用的是新密钥解密。

    2018-11-06
    赞同
    回复 1
    • a苏子晨i
      a苏子晨i
      2018-11-08

      是的,所以我采用了楼上的方案:1.后端记录旧sessionKey,解密失败就用旧的再试一次;2. 此时仍然可能会失败,前端收到失败消息就重新wx.login然后再请求一次。两个方案结合,就可以了。

      2018-11-08
      回复