看这个帖子 亲测好用 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放入缓存。而后需要解密的时候就可以正常解密了 特别注意: 让前端看一下你的请求顺序是不是错了
解密用户信息报错pad block corrupted解密用户信息报错,如下: 前端: [代码] [代码][代码]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 但是紧接着第二次再走以上流程是可以正常解出明文用户信息的 过会再走以上流程第一次请求又是报这个错误
2021-01-22