解密用户信息报错,如下:
前端:
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
但是紧接着第二次再走以上流程是可以正常解出明文用户信息的
过会再走以上流程第一次请求又是报这个错误
我这边也遇到这个问题 是小程序获取手机号的时候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加密的。
我的理解是这样 希望对大家有帮助。
我说微信小程序开发者操蛋,我相信这里没人会反驳,那我就不说了,希望他们心里有点13数。求大佬解决问题,小白坐等
看这个帖子 亲测好用
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放入缓存。而后需要解密的时候就可以正常解密了
特别注意: 让前端看一下你的请求顺序是不是错了
Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS7Padding”,”BC”);
这个BC去掉试试
我个人是这样解决的:
1.进入页面先拿一次code,用变量保存code
2.用户点击获取手机按钮时先使用wx.checkSession检查登录态,如果登录态过期,弹框报错请重试并再次获取code(避免用户进入页面之后因为某些原因超过了了5分钟之后导致code过期),
3.如果登录态没有过期,调用后端接口,成功返回数据之后,在拿一次最新code
完毕,最后成功返回数据之后再拿一次code是为了防止用户因为好奇,或者贪玩再次去获取手机号时发生code被使用过的报错
我和楼主用的方式是一样的 每次小程序都会给一个code session_key每次都是最新的不会出现无效
我也遇到这个问题 郁闷的很 大多数情况都可以解密 ,偶尔失败,我的是java后端
我遇到的也是这个问题,麻烦问下你解决了没?分享下经验
授权之前就调用wx.login吗?如果是这样用户在登录页面停留太久,是不是还需要再调用一次wx.login 去刷新?
获取code之后解密,拿到sessionkey之后,在调用getUserInfo的接口静默授权,也会报错,这个是偶发性的,不知道怎么处理,顺序也没有问题先wx.login,隔一会在调用wx.getUserInfo,就会出现报错
pad block corrupted