昨天协助同事解决了一个Java版的微信退款解密的问题,问题在于对商户key做md5这一步理解有误。今天我尝试了一下用Node.js写个解密,结果比较幸运,一次性通过。
解密方式
解密步骤如下:
(1)对加密串A做base64解码,得到加密串B
(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )
(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10#menu1
直接上代码吧,关键部分都加了注释:
const crypto = require('crypto');
function hash(text, algorithm = 'md5') {
return crypto.createHash(algorithm)
.update(text)
.digest("hex");
}
// 商户后台配置的key
const mchKey = 'eca3e650cdc1';
// 取自 xml.req_info
const reqInfo = 'Q1+Cn0+Z83OoLf='
// 对 商户key 进行md5编码
const md5Key = hash(mchKey);
// 对 reqInfo 进行base64解码
const base64Req = Buffer.from(reqInfo, 'base64');
// aes 解密
const aesDec = crypto.createDecipheriv(
"aes-256-ecb", md5Key, ''
);
const output = aesDec.update(base64Req);
// 解密后的数据
const plain = output + aesDec.final();
console.log(plain);
如果你是用的Java解密,建议集成三方库,不要自己去实现,以免踩坑。推荐的三方库是:
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.7.0</version>
</dependency>
只需要调用 com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult#decryptReqInfo 这个方法,解密结果手到擒来。
谢谢阅读,点个「在看」吧。
我在知乎上也开了专栏"What Matters": https://www.zhihu.com/people/what-matters。欢迎去拍砖。
文章转载自背井,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




