收藏
回答

解密用户信息报错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


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


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

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

17 个回答

  • 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
    回复 3
    • 樱雨花落 自飘零
      樱雨花落 自飘零
      2021-04-28
      有用,感谢
      2021-04-28
      回复
    • 李可
      李可
      2021-08-23
      看作者 也是先login得到code之后再去getUserInfo再发给服务端解析session_key的呀。跟您的解决方案 “保证wx.login获取到的code在getphonenumber操作之前” 一致呀,但他还是出现了错误提示了呢,为什么。
      2021-08-23
      3
      回复
    • Mr.peng
      Mr.peng
      2022-04-01
      我遇到的问题原因就是这个,非常感谢
      2022-04-01
      1
      回复
  • 大叔
    大叔
    2020-05-03

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

    2020-05-03
    有用 4
    回复 2
    • 2020-11-23
      我也遇到这个问题了,请问您解决了吗?怎么处理的?
      2020-11-23
      回复
    • 虚渊清
      虚渊清
      2021-07-20
      服气,用java解析,rawData+SecretKey 签名都验证通过了,还能出这档子事。
      2021-07-20
      1
      回复
  • 王仲秋
    王仲秋
    2021-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放入缓存。而后需要解密的时候就可以正常解密了


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

    2021-01-22
    有用 2
    回复
  • 李琼
    李琼
    2020-06-15

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

    这个BC去掉试试

    2020-06-15
    有用 2
    回复 4
    • @
      @
      2020-12-10
      这样正解,去掉了就每次都成功,否则就算是sessionkey有效的解密有时也会失败
      2020-12-10
      回复
    • My way乄
      My way乄
      2020-12-22
      解密步数尝试了一下也是可以的,请问下这样处理有没有其他隐患
      2020-12-22
      回复
    • 九月
      九月
      2021-08-20
      NB
      2021-08-20
      回复
    • viy
      viy
      2021-11-27
      去掉了还是偶尔报这个错。
      2021-11-27
      回复
  • 林林
    林林
    2021-05-28

    我个人是这样解决的:

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

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

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

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

    2021-05-28
    有用 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
    • 2019-05-08

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

      2019-05-08
      回复
    • 2019-08-24回复
      没什么好解决办法 我们现在是如果按照官方的流程解密失败了的话 前端重新拿最新的code在来请求一次
      2019-08-24
      回复
  • 逍遥猎人
    逍遥猎人
    2023-06-28

    获取code之后解密,拿到sessionkey之后,在调用getUserInfo的接口静默授权,也会报错,这个是偶发性的,不知道怎么处理,顺序也没有问题先wx.login,隔一会在调用wx.getUserInfo,就会出现报错

    pad block corrupted

    2023-06-28
    有用
    回复
  • 谢谢
    谢谢
    发表于移动端
    2021-01-20
    哪报错了
    2021-01-20
    有用
    回复
  • 乐
    2020-05-07

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

    2020-05-07
    有用
    回复

正在加载...

登录 后发表内容