解密用户信息报错,如下:
前端:
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) } } }); |
后台步骤:
- 跟据code换取用户session_key
请求方式:http get
返回结果:
{“session_key”:“xxxxxxxx”,“openid”:“xxxxxxxxxx”}
- 使用解密工具类解密出明文,使用:AES/CBC/PKCS7Padding AES方式解密
参数:encryptedData、sessionKey、iv
结果:
javax.crypto.BadPaddingException: pad block corrupted
但是紧接着第二次再走以上流程是可以正常解出明文用户信息的
过会再走以上流程第一次请求又是报这个错误
如果你在进行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也不行) 再解密电话号码都会报错的。目前只有靠官方来处理了。
同样遇到这个错误,分享自己的解决方法,问题不在于解密的方法而是流程:
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 有关的注意事项。
wx.login 调用时,用户的 session_key 可能会被更新而致使旧 session_key 失效(刷新机制存在最短周期,如果同一个用户短时间内多次调用 wx.login,并非每次调用都导致 session_key 刷新)。开发者应该在明确需要重新登录时才调用 wx.login,及时通过 code2Session 接口更新服务器存储的 session_key。
微信不会把 session_key 的有效期告知开发者。我们会根据用户使用小程序的行为对 session_key 进行续期。用户越频繁使用小程序,session_key 有效期越长。
开发者在 session_key 失效时,可以通过重新执行登录流程获取有效的 session_key。使用接口 wx.checkSession可以校验 session_key 是否有效,从而避免小程序反复执行登录流程。
当开发者在实现自定义登录态时,可以考虑以 session_key 有效期作为自身登录态有效期,也可以实现自定义的时效性策略。