收藏
回答

session_key作用问题

框架类型 问题类型 终端类型 微信版本 基础库版本
小程序 需求 客户端 6.7.2 1.6.6

会话密钥session_key有效性

开发者如果遇到因为session_key不正确而校验签名失败或解密失败,请关注下面几个与session_key有关的注意事项。

  1. wx.login()调用时,用户的session_key会被更新而致使旧session_key失效。开发者应该在明确需要重新登录时才调用wx.login(),及时通过登录凭证校验接口更新服务器存储的session_key。

  2. 微信不会把session_key的有效期告知开发者。我们会根据用户使用小程序的行为对session_key进行续期。用户越频繁使用小程序,session_key有效期越长。

根据文档知道,每次wx:login()之后都会更新session-key,又有:

wx.checkSession({  success: function(){    //session_key 未过期,并且在本生命周期一直有效

     

wx:DecryptParentInfo(......);   //解密用户信息

 },  fail: function(){    // session_key 已经失效,需要重新执行登录流程    wx.login() //重新登录    ....  } })

现在想知道的是,界面用户信息时,需要用到session_key去解密iv、encryptedData,对此,同一小程序不同的用户都用session_key去解密iv、encryptedData时,每一个用户的session_key是否一致,说白了就是解密时,这个session_key是否所有用户都是共用的。。?????还是说每一个用户解密时,都是不同的session_key(各自用各自的session_key)??????

因为,出现了两个问题:

1)如果共用session_key的话,是否会出现一个问题:一个用户wx:checkSession()时没有过期,再去解密用户信息,而另一个用户刚好在解密之前再去登录刷新了session_key,此时session_key已改变,此时第一个用户解密将会失败,导致无法解密。。。。

2)如果不共用session_key的话,wx:checkSession()没过期后再用session_key在后台执行解密方法,大部分都是解密成功,偶尔出现了解密失败的情况,请问一下此时是什么问题导致的解密失败的。。。。。??????因为,发现一个问题就是并发去登录时,将会频繁出现解密用户信息失败,求大神帮忙感激不尽。。。。。。。。。。。。。。

最后想明确两个问题:

1)session_key是否解密时共用的(同一个session_key去解密不同的用户信息)?

2)解密失败的根本原因????????


回答关注问题邀请回答
收藏

5 个回答

  • 小程序运营专员 - cunjin
    小程序运营专员 - cunjin
    2018-08-27

    不同用户的session_key不共用!

    2018-08-27
    有用 1
    回复 1
    • 刘**
      刘**
      2021-05-13
      但凡读过一年级也不会问这个问题sessionkey
      2021-05-13
      1
      回复
  • 禾店短剧系统
    禾店短剧系统
    2021-06-16

    用来解密数据 的

    比如解密手机号码


    2021-06-16
    有用 1
    回复
  • 大刚
    大刚
    2019-11-29

       wx.checkSession({

            success (){

              //session_key 的状态设置为  ‘1’(这个是在本地设置的) 未过期,并且在本生命周期一直有效 发送请求获取电话号码

              that.getPhone('', '1' , e.detail.iv, e.detail.encryptedData, that);

              console.log('success');

            },

            fail (){

              console.log('fail');

              // session_key的状态设置为 ‘0’ 已经失效,需要重新执行登录流程  获取新的code

              wx.login({ 

                success(res) {

                  if (res.code){

                    that.getPhone(res.code,'0', e.detail.iv, e.detail.encryptedData, that);

                  }

                }

              })

            }

          })  

    说明:that.getPhone(code, sessionKeyValidFlag, iv, encryptedData,that); 是定义一个通用的方法去调用获取电话号码的接口   code 为 在wx.checkSession方法失败的时候 说明session_key失效了就要从 wx.login实时获取  如果成功 则 设置code为空 让后台使用 第一次登陆的session_key   sessionKeyValidFlag是根据 wx.checkSession 的成功失败 手动设置的  最关键的是不要频繁去调用 wx.login 有可能会刷新登陆态,导致解密失败。

    2019-11-29
    有用 1
    回复
  • Louis
    Louis
    2021-07-30

    1.session_key对应的是单个用户的,相当于一家住宅一把钥匙,你要拿你家的钥匙来开我家的门是不允许的,所谓的公用也只是你拿到他的seesion_key去解密。

    2.并发调用的也只是你解密的接口,session_key不过期解码失败只能查看你记录的日志,错误原因,一般session_key失效导致的解码错误在openssl_decrypt这一步,具体还是要看你的业务场景和错误日志。

    2021-07-30
    有用
    回复
  • 小哪吒
    小哪吒
    2018-08-28

    session_key妥妥不共用;

    解密失败原因估计得看日志才能解决,,极有可能是session_key过期。

    官方文档中有这么一句👇

    注:当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData, iv 等敏感信息;

    剩下的就是检查代码了。

    2018-08-28
    有用
    回复
登录 后发表内容