暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

微信支付·退款结果通知·使用Node.js解密

背井 2021-03-03
1637

昨天协助同事解决了一个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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论