解密用户信息报错pad block corrupted
发布于 6 年前 作者 fangshen 16502 次浏览 来自 问答

解密用户信息报错,如下:

前端:

          wx.login({
            success: function (loginResp) {
              if (loginResp.code) {
                //获取用户信息
                wx.getUserInfo({
                  withCredentials: true,
                  success: function (res) {
                    //封装登陆需要的参数
                    var params = {};
                    params.code = loginResp.code;
                    params.encryptedData = res.encryptedData;
                    params.iv = res.iv;
                    //调用登陆接口
                    that.sendRequest({
                      url: '/login',
                      data: params,
                      success: function (res) {
                        //cache userInfo...
                      }
                    })
                  },
                  fail: function (e) {
                    console.log(e);
                  }
                });
              } else {
                console.log('获取用户登录态失败!' + res.errMsg)
              }
            }
          });

后台步骤:

  1. 跟据code换取用户session_key

拼接url参数:https://api.weixin.qq.com/sns/jscode2session?appid=xxx&secret=xxxx&js_code=xxxx&grant_type=authorization_code

请求方式:http get

返回结果:

{“session_key”:“xxxxxxxx”,“openid”:“xxxxxxxxxx”}

  1. 使用解密工具类解密出明文,使用:AES/CBC/PKCS7Padding   AES方式解密

参数:encryptedData、sessionKey、iv

结果:

javax.crypto.BadPaddingException: pad block corrupted

但是紧接着第二次再走以上流程是可以正常解出明文用户信息的

过会再走以上流程第一次请求又是报这个错误

9 回复

如果你在进行getphonenumber操作的流程之前,执行过wx.login的登录操作,调用你们自己后台自己写的登录接口之后 再去进行getphonenumber 的操作的话,在 getphonenumber 的回调里就不要再次调用wx.login的api拿最新的code了,因为这样每次点击获取电话号码都会获取最新的code ,但是code有两个特点:1.有效期只有5分钟,超过5分钟即失效 2.获取最新的code有可能会刷新你登录时候的登录态,导致登录时候获取的sessionkey失效,这就是每次点击getphonenumber按钮实时获取code有一定几率失败的原因,会报 bad key 的错误,如果在登录接口调用之后 点击getphonenumber的动作之前的这个时间段再次获取最新的code保存到本地,这样也会有code失效的问题 invaild code 由于getphonenumber的按钮没有做防重复 在ios上特别的明显,快速点击的时候会弹出两个授权框,也有可能再执行了第一个getphonenumber的操作 调转到了页下个页面之后,弹出改授权框,你再点击就会报code been used 或者直接卡死在跳转后的页面,这个问题没有办法修复,只能依靠微信官方来解决了,以上这两种情况都不适合,那么该怎么处理哪,我的思路是 在点击getphonenumber的按钮之后,在按钮的bindtap事件中让一个wx.showToast加载框显示(防止多次重复弹框,能改善,不能彻底解决),在弹出的授权框点击允许的动作之后才会真正的执行 bindgetphonenumber的回调,在该回调中先调用wx.checksession方法检验sessionkey的有效期,如果有效提示后台使用调用登录接口时候code获取的sessionkey去配合 点击点后号码的回调事件中的iv 和encryptedData,去进行解密电话号码的操作,如果过期则再调用wx.login 获取最新的code去拿到有效的sessionkey,但是根据我的测试,这个时候仍然会报错,也就是说一旦登录时候的sessionkey被刷新了,不管你如何操作(重新code也不行) 再解密电话号码都会报错的。目前只有靠官方来处理了。

我也遇到这个问题 郁闷的很 大多数情况都可以解密 ,偶尔失败,我的是java后端

同样遇到这个错误,分享自己的解决方法,问题不在于解密的方法而是流程:

1,第一次用wx.login 得到临时令牌再换取session_key

2,下次调用wx.login方法之前需要用wx.checksession方法,如果是ok,那么第一步的session_key任然有效,可以解密用户信息和手机号码。如果是fail,则代表session_key在微信服务器上失效,需要重新用wx.login方法获取新的临时令牌换取新的session_key

上面是我遇到问题解决的方法,如有不对,还请大家指出

官方文档:

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

会话密钥 session_key 有效性

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

  1. wx.login 调用时,用户的 session_key 可能会被更新而致使旧 session_key 失效(刷新机制存在最短周期,如果同一个用户短时间内多次调用 wx.login,并非每次调用都导致 session_key 刷新)。开发者应该在明确需要重新登录时才调用 wx.login,及时通过 code2Session 接口更新服务器存储的 session_key。

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

  3. 开发者在 session_key 失效时,可以通过重新执行登录流程获取有效的 session_key。使用接口 wx.checkSession可以校验 session_key 是否有效,从而避免小程序反复执行登录流程。

  4. 当开发者在实现自定义登录态时,可以考虑以 session_key 有效期作为自身登录态有效期,也可以实现自定义的时效性策略。


问题有没有解决啊,麻烦分享下

请问你的问题解决了吗,我这边也遇到这个问题了

微信这玩意真是头疼,这问题太无语了,太不方便开发者了

@341

同样遇到这个错误,分享自己的解决方法,问题不在于解密的方法而是流程:

1,第一次用wx.login 得到临时令牌再换取session_key

2,下次调用wx.login方法之前需要用wx.checksession方法,如果是ok,那么第一步的session_key任然有效,可以解密用户信息和手机号码。如果是fail,则代表session_key在微信服务器上失效,需要重新用wx.login方法获取新的临时令牌换取新的session_key

我和楼主用的方式是一样的 每次小程序都会给一个code session_key每次都是最新的不会出现无效

楼主,我也遇到同样的问题。我是用button组件来getuserinfo的。能详细描述如何处理吗?

我的也是出现这个错误,lz如果解决掉就分享下哦~

回到顶部