微信小程序授权解密失败问题

微信小程序授权解密失败问题,第1张

问题:wx.getUserInfo 解密用户信息出现概率性失败

正确顺序: wx.login() =>wx.getUserInfo

1.首先我们来讨论下:wx.login()后执行了什么 *** 作?

刷新登录状态,概率性生成新的 sessionKey(密钥) 和与其对应的 encryptedData(加密数据)

2.再有一点: sessionKey 是有时效性的,如果通过缓存拿取的话,需要先 wx.checkSession()进行检测是否过期

3.那我们就能发现:在先授权(先拿到encryptedData),再调用wx.login()的情况下:

(1).一旦生成了新的sessionKey,就会导致旧的encryptedData无法被解密

(2).即使sessionKey未刷新但是sessionKey过期也会导致无法解密

所以最终解决方案:进入授权页面即调用wx.login(),刷新登录状态(能避免 sessionKey 过期),再进行授权。

重新设置 授权多个小程序API密钥设置方法

先打开商户号后,找到账户设置 ,找到密码安全 然后找到 API安全 下的 API密钥,按要求设置密钥Key,设置好之后,把这个复制到网站即可。在 功能选项 下的支付参数 再到 设置支付下的选择新版接口类型,你就会看到新增的一项商户支付密钥,然后复制填写刚刚设置的密匙,这样全部 *** 作就结束了

通过wx.getUserInfo获取用户的openId 和unionId,需要对接口返回的加密数据( encryptedData )进行对称解密。

/**

    * 功能描述: <br>

    * 〈功能详细描述〉

    *

*@paramargs

*@see[相关类/方法](可选)

*@since[产品/模块版本](可选)

    */

publicstaticvoidmain(String[] args){

String encryptedData ="********......*******"

String sessionKey ="********......*******"

String iv ="9btKSYjvtGMGpknPpjS2Ag=="

        JSONObject jsonObject = getUserInfo(encryptedData, sessionKey, iv)

System.out.println(jsonObject.getString("unionId"))

        System.out.println(jsonObject.toJSONString())

    }

结果运行报错:

javax.crypto.BadPaddingException: pad block corrupted

at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(Unknown Source)

at org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(Unknown Source)

at javax.crypto.Cipher.doFinal(Cipher.java:2087)

at com.saic.ebiz.service.util.AESUtils.getUserInfo(AESUtils.java:62)

at com.saic.ebiz.service.util.AESUtils.main(AESUtils.java:86)

Exception in thread"main"java.lang.NullPointerException

at com.saic.ebiz.service.util.AESUtils.main(AESUtils.java:87)

查询原因,有可能是我的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放入缓存。而后需要解密的时候就可以正常解密了

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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12015751.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存