微信支付 API v3 Python SDK

介绍

微信支付接口 V3 版 python 库。

适用对象

wechatpayv3同时支持微信支付直连模式及服务商模式,接口说明详见官网。

特性

  • 平台证书自动更新,无需开发者关注平台证书有效性,无需手动下载更新;
  • 支持本地缓存平台证书,初始化时指定平台证书保存目录即可;
  • 敏感信息直接传入明文参数,SDK 内部自动加密,无需手动处理;
  • 回调通知自动验证回调消息,自动解密 resource 对象,并返回解密后的数据;
  • 已适配直连模式和服务商模式中除“电商收付通”以外所有 v3 版接口。

源码

github

gitee

安装

$ pip install wechatpayv3

使用方法

准备

参考微信官方文档准备好密钥, 证书文件和配置(证书/密钥/签名介绍)

  • 商户 API 证书私钥:PRIVATE_KEY。 商户申请商户 API 证书时,会生成商户私钥,并保存在本地证书文件夹的文件 apiclient_key.pem 中。 不要把私钥文件暴露在公共场合,如上传到 Github,写在客户端代码等。

  • 商户 API 证书序列号:CERT_SERIAL_NO。 每个证书都有一个由 CA 颁发的唯一编号,即证书序列号。扩展阅读 如何查看证书序列号。

  • 微信支付 APIv3 密钥:APIV3_KEY,是在回调通知和微信支付平台证书下载接口中,为加强数据安全,对关键信息 AES-256-GCM 加密时使用的对称加密密钥。

后端代码

1、初始化微信支付api

# wx_pay.py
from wechatpayv3 import WeChatPay, WeChatPayType

# 微信支付商户号,服务商模式下为服务商户号,即官方文档中的sp_mchid。
MCHID = '1439******'
# 商户证书私钥,此文件不要放置在下面设置的CERT_DIR目录里。
with open('D:\\apiclient_key.pem') as f:
    MCH_PRIVATE_KEY = f.read()
# 商户证书序列号
CERT_SERIAL_NO = '444F4864EA9B34415...'
# API v3密钥, https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay3_2.shtml
API_V3_KEY = 'MIIEvwIBADANBgkqhkiG9w0BAQE...'
# APPID,应用ID,服务商模式下为服务商应用ID,即官方文档中的sp_appid,也可以在调用接口的时候覆盖。
APPID = 'wx...'
# 回调地址,也可以在调用接口的时候覆盖。
NOTIFY_URL = 'https://pay_callback'
# 微信支付平台证书缓存目录,初始调试的时候可以设为None,首次使用确保此目录为空目录。
CERT_DIR = './cert'
# 接入模式:False=直连商户模式,True=服务商模式。
PARTNER_MODE = False
# 代理设置,None或者{"https": "http://10.10.1.10:1080"},详细格式参见[https://requests.readthedocs.io/en/latest/user/advanced/#proxies](https://requests.readthedocs.io/en/latest/user/advanced/#proxies)
PROXY = None

#初始化 WechatPay 实例
wxpay = WeChatPay(
    wechatpay_type=WeChatPayType.MINIPROG, 
    mchid=MCHID,  
    private_key=MCH_PRIVATE_KEY, 
    cert_serial_no=MCH_KEY_SERIAL_NO,  
    appid=APPID, 
    apiv3_key=API_V3_KEY,
    notify_url=NOTIFY_URL,
    cert_dir=CERT_DIR
)


接下来以调用统一下单接口为例:

# testpay.py
from ..wx_pay import wxpay, APPID
def pay():
    # 以小程序下单为例,下单成功后即可获取小程序调起支付所需参数。
    code, message = wxpay.pay(
       description='你的商品名称',
       out_trade_no='你的商家订单号',
       amount={'total': 100}, #支付金额单位分,这里就是1元
       payer={'openid': '用户的openid'}) 
    if code == 200:
       result = json.loads(message)
       time_stamp = str(int(time.time()))
       nonce_str = ''.join(str(uuid.uuid4()).split('-')).upper()
       package = 'prepay_id=' + result['prepay_id']
       ks = [APPID, time_stamp, nonce_str, package]
       sign = wxpay.sign(ks) #计算签名值供调起支付时使用
       data = {
           'timeStamp': time_stamp,
           'nonceStr': nonce_str,
           'package': package,
           'signType': 'RSA',
           'paySign': sign
       }
       return True, data
   else:
       return False, '下单支付异常'

支付成功回调方法

def pay_callback(request):
    try:
        body = request.body
        headers = request.headers
        result = wxpay.callback(headers, body)
    except Exception as e:
        logger.error('支付回调,解密失败:'+str(e))
        return False
    if not result:
        return False
    try:
    	payment = result['resource']
    	order_sn = payment['out_trade_no']
    	transaction_id = payment['transaction_id']
    	trade_state = payment['trade_state']
    	# 执行你的业务代码......
    	# ........................
    	return True
    except Exception as e:
        logger.error('回调处理异常:' + str(e))
        return False

其他接口的使用方法可参考官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值