用商户平台上设置的APIv3密钥(微信商户平台(pay.weixin.qq.com)-账户设置-API安全-设置APIv3密钥),记为key
● 针对resource.algorithm中描述的算法(目前为AEAD_AES_256_GCM),取得对应的参数nonce和associated_data。
● 使用key、nonce和associated_data,对数据密文resource.ciphertext进行解密,得到XML形式的资源对象
注: AEAD_AES_256_GCM算法的接口细节,请参考rfc5116。微信支付使用的密钥key长度为32个字节,随机串nonce长度12个字节,associated_data长度小于16个字节并可能为空。
描述的太笼统了。
https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_2.shtml
API V3 文档链接 https://wechatpay-api.gitbook.io/wechatpay-api-v3/qian-ming-zhi-nan-1/zheng-shu-he-hui-tiao-bao-wen-jie-mi
文档里有 Java/PHP/.Net/Python 的示例,这里补充下 Node.js 的示例
// 对 API V3 加密数据进行解密 const apiV3Key = '*******'; // 设置的 API V3 密钥 const decryptByApiV3 = ({ associate, // 加密参数 - 类型 nonce, // 加密参数 - 随机数 ciphertext, // 加密密文 } = {}) => { ciphertext = decodeURIComponent(ciphertext); ciphertext = Buffer.from(ciphertext, 'base64'); const authTag = ciphertext.slice(ciphertext.length - 16); const data = ciphertext.slice(0, ciphertext.length - 16); const decipher = crypto.createDecipheriv('aes-256-gcm', apiV3Key, nonce); decipher.setAuthTag(authTag); decipher.setAAD(Buffer.from(associate)); let decryptedText = decipher.update(data, null, 'utf8'); decryptedText += decipher.final(); return decryptedText; };
解密demo 在v3的文档里面,坑,也不说明在哪。