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

参考:https://developers.weixin.qq.com/community/develop/doc/000eccdd7a8508e386e69b3025bc00

public  String decrypt(byte[] key, byte[] iv, byte[] encData) throws Exception {
    AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
    //解析解密后的字符串
    return new String(cipher.doFinal(encData),"UTF-8");//这里抛出异常
}

抛异常:javax.crypto.BadPaddingException: Given final block not properly padded
或者:pad block corrupted

亲测有效解决方案:和前端确认调用顺序。

顺序应该是  1、wx.login    2、wx.getUserInfo 。 

如果顺序反过来 ,会出现校验解密失败的问题,比较坑的是 不是每次都出错。

PS :

通过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,而session_key又是解密encryptedData的密钥,所以一旦我们先调wx.getUserInfo再调wx.login获取,code已经被刷新了,所以钥匙就不是对应开锁的钥匙了。

参考:https://www.jianshu.com/p/9b6b9942d96a

posted @ 2020-09-21 16:09  荒野猛兽  阅读(6349)  评论(0编辑  收藏  举报