收藏
回答

解密用户信息报错pad block corrupted

框架类型 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


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


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

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

16 个回答

  • Mr、Yang
    Mr、Yang
    2020-08-17

    我这边也遇到这个问题 是小程序获取手机号的时候getphonenumber 操作

    首先大家需要清楚的getphonenumber获取到的加密数据是怎么来的 可能就会更能明白怎么处理

    我的理解是

    前端调用wx.login() 接口会返回一个code,

    code生成的时候微信自己的服务器端有一个code->session key 的对应关系

    在通过getphonenumber获取手机号码加密数据的时候会通过session key 来加密数据

    如果你是在getphonenumber操作之后在去调用wx.login 那getphonenumber加密的session key就有可能是

    之前的session key 你在拿code去兑换session key 来解密这些数据的话就有很大几率失败

    所以要保证wx.login获取到的code在getphonenumber操作之前 这样微信服务器端的getphonenumber加密的session key就是最新获取的code对应的session key加密的。

    我的理解是这样 希望对大家有帮助。


    2020-08-17
    有用 6
    回复 2
    • 🍋好酸呀
      🍋好酸呀
      04-28
      有用,感谢
      04-28
      回复
    • 李可
      李可
      08-23
      看作者 也是先login得到code之后再去getUserInfo再发给服务端解析session_key的呀。跟您的解决方案 “保证wx.login获取到的code在getphonenumber操作之前” 一致呀,但他还是出现了错误提示了呢,为什么。
      08-23
      回复
  • 大叔
    大叔
    2020-05-03

    我说微信小程序开发者操蛋,我相信这里没人会反驳,那我就不说了,希望他们心里有点13数。求大佬解决问题,小白坐等

    2020-05-03
    有用 4
    回复 2
    • 陈浩杰
      陈浩杰
      2020-11-23
      我也遇到这个问题了,请问您解决了吗?怎么处理的?
      2020-11-23
      回复
    • 虚渊清
      虚渊清
      07-20
      服气,用java解析,rawData+SecretKey 签名都验证通过了,还能出这档子事。
      07-20
      回复
  • 李琼
    李琼
    2020-06-15

    Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS7Padding”,”BC”);

    这个BC去掉试试

    2020-06-15
    有用 2
    回复 3
    • @
      @
      2020-12-10
      这样正解,去掉了就每次都成功,否则就算是sessionkey有效的解密有时也会失败
      2020-12-10
      回复
    • North harbor乄
      North harbor乄
      2020-12-22
      解密步数尝试了一下也是可以的,请问下这样处理有没有其他隐患
      2020-12-22
      回复
    • 九月
      九月
      08-20
      NB
      08-20
      回复
  • 林林
    林林
    05-28

    我个人是这样解决的:

    1.进入页面先拿一次code,用变量保存code

    2.用户点击获取手机按钮时先使用wx.checkSession检查登录态,如果登录态过期,弹框报错请重试并再次获取code(避免用户进入页面之后因为某些原因超过了了5分钟之后导致code过期),

    3.如果登录态没有过期,调用后端接口,成功返回数据之后,在拿一次最新code

    完毕,最后成功返回数据之后再拿一次code是为了防止用户因为好奇,或者贪玩再次去获取手机号时发生code被使用过的报错

    05-28
    有用 1
    回复
  • 王仲秋
    王仲秋
    01-22

    看这个帖子 亲测好用

    https://www.jianshu.com/p/9b6b9942d96a


    查询原因,有可能是我的wx.login在wx.getUserInfo之后调的原因,细究一下

    我们通过wx.login获得用户授权码code,接下来我们用code以及appid和appSecret请求微信

    https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    获取session_key,而sessionKey又是解密encryptedData的密钥,所以一旦我们的wx.login在wx.getUserInfo之后获取,我们redis中存储的sessionKey绝对不是当前获取encryptedData的密钥。所以更改小程序请求顺序,每次请求wx.getUserInfo之前先请求wx.login,同时生成sessionKey放入缓存。而后需要解密的时候就可以正常解密了


    特别注意: 让前端看一下你的请求顺序是不是错了

    01-22
    有用 1
    回复
  • 自负
    自负
    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
      回复
  • Welly
    Welly
    01-20
    哪报错了
    01-20
    有用
    回复
  • 乐🌈🤔
    乐🌈🤔
    2020-05-07

    前端调用 wx.login(), wx.getUserInfo() ,把 code,encryptedData 和 iv 返回给后端,后端在拿到前端 code 之后去请求微信的接口拿 unionid,如果返回的 unionid 为空,再用的 encryptedData、iv以及之前的 session_key 解密出 unionid,后端解密出相应的信息后再返回给前端。我是这样的,也会偶现报错,阿门

    2020-05-07
    有用
    回复
  • 大刚
    大刚
    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
    有用
    回复

正在加载...

登录 后发表内容