小程序
小游戏
企业微信
微信支付
扫描小程序码分享
https://developers.weixin.qq.com/miniprogram/dev/server/API/user-login/api_code2session.html
通过这个接口获取的session_key解密,偶尔解密会报 Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
2 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; /** * 微信解密工具 */ public class WXDecryptUtils { /** * 解密微信加密数据 * * @param encryptedData 加密数据(Base64编码) * @param sessionKey 会话密钥(Base64编码) * @param iv 初始向量(Base64编码) * @return 解密后的JSON字符串 * { * "phoneNumber": "13800000000", * "purePhoneNumber": "13800000000", * "countryCode": "86", * "watermark": { * "appid": "wx1234567890abcdef", * "timestamp": 1601234567 * } * } */ public static String decryptData(String encryptedData, String sessionKey, String iv) { try { // Base64 解码 byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData); byte[] keyBytes = Base64.getDecoder().decode(sessionKey); byte[] ivBytes = Base64.getDecoder().decode(iv); // 初始化AES解密器 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); // 解密并转成字符串 byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } catch (Exception e) { // 添加详细的错误日志,便于调试 Log.error("微信解密失败 - encryptedData: {}, sessionKey: {}, iv: {}, 错误: {}", encryptedData, sessionKey, iv, e.getMessage()); throw new RuntimeException("解密失败: " + e.getMessage(), e); } } }
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
本回答由AI生成,可能已过期、失效或不适用于当前情形,请谨慎参考
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; /** * 微信解密工具 */ public class WXDecryptUtils { /** * 解密微信加密数据 * * @param encryptedData 加密数据(Base64编码) * @param sessionKey 会话密钥(Base64编码) * @param iv 初始向量(Base64编码) * @return 解密后的JSON字符串 * { * "phoneNumber": "13800000000", * "purePhoneNumber": "13800000000", * "countryCode": "86", * "watermark": { * "appid": "wx1234567890abcdef", * "timestamp": 1601234567 * } * } */ public static String decryptData(String encryptedData, String sessionKey, String iv) { try { // Base64 解码 byte[] encryptedBytes = Base64.getDecoder().decode(encryptedData); byte[] keyBytes = Base64.getDecoder().decode(sessionKey); byte[] ivBytes = Base64.getDecoder().decode(iv); // 初始化AES解密器 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES"); IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); // 解密并转成字符串 byte[] decryptedBytes = cipher.doFinal(encryptedBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } catch (Exception e) { // 添加详细的错误日志,便于调试 Log.error("微信解密失败 - encryptedData: {}, sessionKey: {}, iv: {}, 错误: {}", encryptedData, sessionKey, iv, e.getMessage()); throw new RuntimeException("解密失败: " + e.getMessage(), e); } } }