收藏
回答

解密用户信息报错pad block corrupted

问题模块 框架类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
API和组件 小程序 签名加密 微信iOS客户端 6.6.5 1.9.1

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

前端:

          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"}


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

参数:encryptedData、sessionKey、iv


结果:

javax.crypto.BadPaddingException: pad block corrupted


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


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

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

9 个回答

  • 自负
    自负
    2019-01-22

    @341

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

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

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


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

    2019-01-22
    赞同 1
    回复
  • 狂奔的蜗牛😄
    狂奔的蜗牛😄
    2018-09-20

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

    2018-09-20
    赞同 1
    回复 2
    • June
      June
      2019-05-08

      我遇到的也是这个问题,麻烦问下你解决了没?分享下经验

      2019-05-08
      回复
    • 狂奔的蜗牛😄
      狂奔的蜗牛😄
      2019-08-24回复June
      没什么好解决办法 我们现在是如果按照官方的流程解密失败了的话 前端重新拿最新的code在来请求一次
      2019-08-24
      回复
  • 大刚
    大刚
    2019-12-03

    如果你在进行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也不行) 再解密电话号码都会报错的。目前只有靠官方来处理了。




    2019-12-03
    赞同
    回复
  • 水滴
    水滴
    2019-11-26

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

    2019-11-26
    赞同
    回复
  • June
    June
    2019-05-08

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

    2019-05-08
    赞同
    回复
  • 柯乔
    柯乔
    2018-10-06

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

    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 有效期作为自身登录态有效期,也可以实现自定义的时效性策略。



    2018-10-06
    赞同
    回复 3
    • 自负
      自负
      2019-01-22

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


      意思是每次都是拿的最新的session_key  大概15次会出现一次这个错误

      2019-01-22
      回复
    • 平常心
      平常心
      2019-03-27回复自负

      我的倒是不是这样情况,就是偶尔出现,也可以让它固定出现这种错误,在需要获取手机号的页面上无操作停留几分钟,再去调获取手机号等一系列操作,就会出现问题。崩溃的是,我每次的code都是wx.login获取的最新的,换取的session_key也是最新的,还是会出错,无解,朋友解决了吗?解决了,望告知!!

      2019-03-27
      回复
    • 水滴
      水滴
      2019-11-26
      我是java后端调用的,code都是最新的,session_key 也是最新的,总是一次失败,一次成功
      2019-11-26
      回复
  • 🎵小山33
    🎵小山33
    2018-07-19

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

    2018-07-19
    赞同
    回复
  • 刘向
    刘向
    2018-04-04

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


    2018-04-04
    赞同
    回复
  • 阿润
    阿润
    2018-03-30

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

    2018-03-30
    赞同
    回复
登录 后发表内容