介绍
微信支付接口 V3 版 python 库。
适用对象
wechatpayv3同时支持微信支付直连模式及服务商模式,接口说明详见官网。
特性
- 平台证书自动更新,无需开发者关注平台证书有效性,无需手动下载更新;
- 支持本地缓存平台证书,初始化时指定平台证书保存目录即可;
- 敏感信息直接传入明文参数,SDK 内部自动加密,无需手动处理;
- 回调通知自动验证回调消息,自动解密 resource 对象,并返回解密后的数据;
- 已适配直连模式和服务商模式中除“电商收付通”以外所有 v3 版接口。
源码
安装
$ 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
其他接口的使用方法可参考官方文档