解密用户信息报错,如下:
前端:
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
但是紧接着第二次再走以上流程是可以正常解出明文用户信息的
过会再走以上流程第一次请求又是报这个错误
前端调用 wx.login(), wx.getUserInfo() ,把 code,encryptedData 和 iv 返回给后端,后端在拿到前端 code 之后去请求微信的接口拿 unionid,如果返回的 unionid 为空,再用的 encryptedData、iv以及之前的 session_key 解密出 unionid,后端解密出相应的信息后再返回给前端。我是这样的,也会偶现报错,阿门
如果你在进行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 有效期作为自身登录态有效期,也可以实现自定义的时效性策略。
我和楼主用的方式是一样的 每次小程序都会给一个code session_key每次都是最新的不会出现无效
意思是每次都是拿的最新的session_key 大概15次会出现一次这个错误
我的倒是不是这样情况,就是偶尔出现,也可以让它固定出现这种错误,在需要获取手机号的页面上无操作停留几分钟,再去调获取手机号等一系列操作,就会出现问题。崩溃的是,我每次的code都是wx.login获取的最新的,换取的session_key也是最新的,还是会出错,无解,朋友解决了吗?解决了,望告知!!
楼主,我也遇到同样的问题。我是用button组件来getuserinfo的。能详细描述如何处理吗?
请问你的问题解决了吗,我这边也遇到这个问题了
我的也是出现这个错误,lz如果解决掉就分享下哦~