微信支付集成

集成  收藏
19 / 1113

产品介绍

微信支付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。点击测试后即可查看解密后的结果。商家只需要重新生成一个订单即可验证查看解密内容了。