參考: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已經被刷新了,所以鑰匙就不是對應開鎖的鑰匙了。