参考: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已经被刷新了,所以钥匙就不是对应开锁的钥匙了。