如何解密支付通知

更新时间:2023.07.25

# 通知报文

支付结果通知是以POST 方法访问商户设置的通知URL,通知的数据以JSON 格式通过请求主体(BODY)传输。通知的数据包括了加密的支付结果详情。为了获取这些加密信息,商户需要进行解密操作。以下是解密微信支付 APIv3 支付结果通知的步骤:

# 步骤说明

# 步骤一:验证签名

微信支付会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》

# 步骤二:参数解密

为了保证安全性,微信支付在回调通知,对关键信息进行了AES-256-GCM加密。商户应当按照以下的流程进行解密关键信息,解密的流程:

  1. 获取信息:从支付结果通知中获取加密信息,通常是一个名为 resource 的字段,包含加密算法( algorithm )、加密数据( ciphertext )和随机串( nonce )。
  2. 准备解密参数:收集以下参数以进行解密操作:
    • associated_data :关联数据,从 resource 字段中获取。
    • nonce :随机串,从 resource 字段中获取。
    • ciphertext :加密数据,从 resource 字段中获取。
  3. 使用 APIv3 密钥进行解密:使用商户的 APIv3 密钥和上述参数进行解密操作。解密算法为 AES-256-GCM。在不同编程语言中,解密操作的实现可能略有不同。具体实现方法可以参考下方的示例代码。
  4. 解析解密结果:解密成功后,你将获得一个 JSON 格式的字符串。将其解析为 JSON 对象,以获取原始的敏感信息。

# 示例代码

算法接口的细节,可以参考rfc5116 (opens new window)。 大部分编程语言(较新版本)都支持了AEAD_AES_256_GCM。开发者可以参考下列的示例,了解如何使用您的编程语言实现解密。

1from cryptography.hazmat.primitives.ciphers.aead import AESGCM
2import base64
3def 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)
反馈
咨询
目录