解密微信退款结果通知中的加密信息 req_info

本贴最后更新于 2097 天前,其中的信息可能已经天翻地覆

描述

在微信返回的退款结果通知中,包含了一个加密信息字段 req_info

image.png

微信支付文档

image.png

前提工作

  • 添加 maven 依赖
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.47</version> </dependency>
  • 替换 jar 包
    JAVA 运行环境默认不允许 256 位密钥的 AES 加解密,解决方法就是修改策略文件

  • 在官方网站下载 JCE 无限制权限策略文件

JDK7 版本 JCE 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

JDK8 版本 JCE 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

  • 下载后解压,可以看到 local_policy.jar 和 US_export_policy.jar 以及 readme.txt
  • 如果安装了 JRE,将两个 jar 文件放到 %JRE_HOME%\lib\security 目录下覆盖原来的文件
  • 如果安装了 JDK,将两个 jar 文件放到 %JDK_HOME%\jre\lib\security 目录下覆盖原来文件

实践:
以 JDK8 为例,系统为 WIN10,替换上述 security 文件夹下\policy\limited 文件夹和\policy\unlimited 文件夹里面的 local_policy.jar 和 US_export_policy.jar 这两个文件。

若是在服务器上,则只有在 security 目录下有 local_policy.jar 和 US_export_policy.jar,替换即可

解密

import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.security.Security; public class AESUtil { private static Prop prop = DataDictionary.getProp(); /** * 密钥算法 */ private static final String ALGORITHM = "AES"; /** * 加解密算法/工作模式/填充方式 */ private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding"; /** * 生成key */ //微信支付API密钥设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 private static String paySign = "微信支付API密钥"; //对商户key做md5,得到32位小写key* private static SecretKeySpec key = new SecretKeySpec(MD5Util.MD5Encode(paySign, "UTF-8").toLowerCase().getBytes(), ALGORITHM); static { } /** * AES加密 * * @param data * @return * @throws Exception */ public static String encryptData(String data) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 创建密码器 Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC"); // 初始化 cipher.init(Cipher.ENCRYPT_MODE, key); return Base64Util.encode(cipher.doFinal(data.getBytes())); } /** * AES解密 * *(1)对加密串A做base64解码,得到加密串B *(2)用key*对加密串B做AES-256-ECB解密(PKCS7Padding) * @param base64Data * @return * @throws Exception */ public static String decryptData(String base64Data) throws Exception { Security.addProvider(new BouncyCastleProvider()); Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC"); cipher.init(Cipher.DECRYPT_MODE, key); return new String(cipher.doFinal(Base64Util.decode(base64Data))); } public static void main(String[] args) throws Exception { String A = "微信返回的加密信息req_info"; System.out.println(AESUtil.decryptData(A)); }
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    132 引用 • 796 回帖
1 操作
Ethan 在 2019-06-18 16:58:15 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    简书也开始开启防盗链了。

    1 回复
  • Ethan via macOS
    作者

    已经截图替换掉链接