产品介绍
微信支付(https://pay.weixin.qq.com)是腾讯集团旗下中国领先的第三方支付平台,一直致力于为用户和企业提供安全、便捷、专业的在线支付服务。以“微信支付,不止支付”为核心理念,为个人用户创造了多种便民服务和应用场景,为各类企业以及小微商户提供专业的收款能力,运营能力,资金结算解决方案,以及安全保障。企业、商品、门店、用户已经通过微信连在了一起,让智慧生活,变成了现实。
微信支付官网:https://pay.weixin.qq.com/
API 接口文档:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_0.shtml
如何对接微信支付?
前导
微信支付目前暂时仅支持 Native 支付,请用户选择该支付接入方式。接入条件如下:服务器、域名(网站)、微信支付企业认证、公众号或服务号企业认证,具体情况可查看微信支付官方文档:https://pay.weixin.qq.com/
1.跳转访问 API 接口文档中的接入指引:https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_7_1.shtml。注:对接微信支付的模式我们是选择直连模式。
2.并且需要接入微信前需要提前准备好 APPID 和 mchid(商户 ID),以及将 APPID 和 mchid 进行绑定。绑定完成后将 APPID 和 mchid 复制填入连接参数中。
3.配置 API key(选择 API v3)。此步骤中的 API v3 密钥会在后续中的支付通知回调中用作 AES 解密。(请将这里的密钥信息保管好)
4.下载并配置商户证书。未申请证书的用户请先申请,申请完成后需要将 apiclient_key.pem 文件打开,并将内容全选复制填入连接参数的 apiclient_key 中。
5.最后将 API 证书管理中的证书序列号的内容填入连接参数中。
如何使用微信支付?
1.在工作表中按照图片的描述进行配置,且需要创建一个 webhook 工作流将地址填入接口参数中。注:微信支付的 Native 下单接口的支付金额单位是分。
2.生成二维码
3.用户手机扫码后,在确认支付前需要到生成异步通知的工作流中,勾选上“生成 Body 全文参数”,随后立刻支付即可获取到异步通知消息。
## 微信支付异步通知解密
1.在前面提到了若用户扫码支付成功后,商家后台会收到一条异步消息通知。但实际查看内容时会发现参数都是经过微信加密处理的。那么此时需要对加密内容进行解密则需要将对接步骤中我们提到的 API v3 密钥准备好。
2.我们需要 webhook 工作流中添加一个代码块,并配置上我们在前面勾选上的“生成 body 全文参数”,并将 API v3 密钥填入到 aes_key 中。
#python代码示例
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import base64
import json
# 微信支付消息通知AES解密
def aes_decrypt(key, associated_data, nonce, ciphertext):
if len(key) != 32:
raise ValueError("无效的ApiV3Key,长度必须为32个字节")
try:
aesgcm = AESGCM(key)
decrypted_data = aesgcm.decrypt(nonce, ciphertext, associated_data.encode('utf-8'))
return decrypted_data.decode('utf-8')
except ValueError as val:
raise ValueError("解密失败:" + str(val))
# 解密参数
# API3密钥
api_key = input['aes_key'].encode('utf-8') # 替换为你的32字节API密钥
# 解密JSON
encrypt_json = json.loads(input['encrypt_content'])
# 加密文本
ciphertext = encrypt_json.get('resource').get('ciphertext')
# 关联数据
associated_data = encrypt_json.get('resource').get('associated_data')
# 随机数
nonce = encrypt_json.get('resource').get('nonce').encode('utf-8')
#解密内容
decrypted_text = aes_decrypt(api_key, associated_data, nonce, base64.b64decode(ciphertext))
output = {'decrypted_text': decrypted_text}
3.在点击测试前,将我们拿到的生成 body 全文参数的值复制填入到我们的 encrypt_content。点击测试后即可查看解密后的结果。商家只需要重新生成一个订单即可验证查看解密内容了。