如何解密支付通知
更新时间:2023.07.25# 通知报文
支付结果通知是以POST 方法访问商户设置的通知URL,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。为了获取这些加密信息,商户需要进行解密操作。以下是解密微信支付 APIv3 支付结果通知的步骤:
# 步骤说明
# 步骤一:验证签名
微信支付会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》。
# 步骤二:参数解密
为了保证安全性,微信支付在回调通知,对关键信息进行了AES-256-GCM加密。商户应当按照以下的流程进行解密关键信息,解密的流程:
- 获取信息:从支付结果通知中获取加密信息,通常是一个名为
resource
的字段,包含加密算法(algorithm
)、加密数据(ciphertext
)和随机串(nonce
)。 - 准备解密参数:收集以下参数以进行解密操作:
associated_data
:关联数据,从resource
字段中获取。nonce
:随机串,从resource
字段中获取。ciphertext
:加密数据,从resource
字段中获取。
- 使用 APIv3 密钥进行解密:使用商户的 APIv3 密钥和上述参数进行解密操作。解密算法为 AES-256-GCM。在不同编程语言中,解密操作的实现可能略有不同。具体实现方法可以参考下方的示例代码。
- 解析解密结果:解密成功后,你将获得一个 JSON 格式的字符串。将其解析为 JSON 对象,以获取原始的敏感信息。
# 示例代码
算法接口的细节,可以参考rfc5116 (opens new window)。 大部分编程语言(较新版本)都支持了AEAD_AES_256_GCM。开发者可以参考下列的示例,了解如何使用您的编程语言实现解密。
1from cryptography.hazmat.primitives.ciphers.aead import AESGCM2import base643def decrypt(nonce, ciphertext, associated_data):4 key = "Your32Apiv3Key"5 key_bytes = str.encode(key)6 nonce_bytes = str.encode(nonce)7 ad_bytes = str.encode(associated_data)8 data = base64.b64decode(ciphertext)9 aesgcm = AESGCM(key_bytes)10 return aesgcm.decrypt(nonce_bytes, data, ad_bytes)
文档是否有帮助