一、引言
在当今数字化的商业世界中,微信支付已经成为了主流的支付方式之一。对于开发者而言,如何方便快捷地在 Python 项目中对接微信支付是一个常见的需求。weixin
库为我们提供了一种便捷的方式来实现这一目标。本文将详细介绍如何使用 weixin
库中的 WeixinPay
类完成微信支付的一系列操作,包括支付、查询和退款。
二、准备工作
2.1 微信支付商户平台配置
- 首先,你需要拥有一个微信支付商户账号。登录微信支付商户平台,在平台上完成相关的信息配置,如设置 API 密钥、下载证书等。
- 获取以下重要信息:
- APPID:微信应用的唯一标识。
- MCHID:微信支付商户号。
- API_KEY:API 密钥,用于签名验证。
- CERT_PATH:商户证书路径,用于安全通信。
2.2 安装 weixin
库
使用 pip
命令安装 weixin
库:
pip install weixin
三、导入 WeixinPay
并初始化
在 Python 代码中,我们需要导入 WeixinPay
类并进行初始化。以下是示例代码:
from weixin import WeixinPay
# 初始化 WeixinPay 对象
appid = 'your_appid'
# 微信支付appid
mchid = 'your_mch_id'
# 商户id
api_key = 'your_api_key'
# 商户api密钥
cert_path = 'path/to/your/cert.pem'
# 证书存放路径
key_path = 'path/to/your/key.pem'
# 证书存放路径
weixin_pay = WeixinPay(
appid=appid,
mchid=mchid,
api_key=api_key,
cert_path=cert_path,
key_path=key_path
)
四、发起支付请求
使用 WeixinPay
对象发起支付请求,生成预支付订单。以下是扫码支付(NATIVE 支付)的示例代码:
# 支付参数
out_trade_no = 'your_out_trade_no' # 商户订单号,需保证唯一
total_fee = 1 # 订单总金额,单位为分
body = '商品描述信息' # 商品描述
notify_url = 'your_notify_url' # 支付结果通知 URL
# 发起支付请求
result = weixin_pay.unifiedorder(
out_trade_no=out_trade_no,
total_fee=total_fee,
body=body,
notify_url=notify_url,
trade_type='NATIVE'
)
if result.get('return_code') == 'SUCCESS' and result.get('result_code') == 'SUCCESS':
code_url = result.get('code_url')
print(f"支付二维码链接:{code_url}")
else:
print(f"支付请求失败,错误信息:{result.get('return_msg')}")
五、查询订单状态
在支付过程中,我们可能需要查询订单的支付状态。以下是查询订单的示例代码:
# 要查询的订单号
out_trade_no = 'your_out_trade_no'
# 查询订单
result = weixin_pay.orderquery(out_trade_no=out_trade_no)
if result.get('return_code') == 'SUCCESS' and result.get('result_code') == 'SUCCESS':
trade_state = result.get('trade_state')
print(f"订单状态:{trade_state}")
else:
print(f"订单查询失败,错误信息:{result.get('return_msg')}")
六、发起退款请求
如果需要对已支付的订单进行退款操作,可以使用以下代码:
# 要退款的订单号
out_trade_no = 'your_out_trade_no'
# 退款金额,单位为分
refund_fee = 1
# 退款单号,需保证唯一
out_refund_no = 'your_out_refund_no'
# 发起退款请求
result = weixin_pay.refund(
out_trade_no=out_trade_no,
out_refund_no=out_refund_no,
total_fee=total_fee,
refund_fee=refund_fee
)
if result.get('return_code') == 'SUCCESS' and result.get('result_code') == 'SUCCESS':
refund_id = result.get('refund_id')
print(f"退款申请成功,退款 ID:{refund_id}")
else:
print(f"退款申请失败,错误信息:{result.get('return_msg')}")
七、完整示例代码
from weixin import WeixinPay
# 初始化 WeixinPay 对象
appid = 'your_appid'
mchid = 'your_mch_id'
api_key = 'your_api_key'
cert_path = 'path/to/your/cert.pem'
key_path = 'path/to/your/key.pem'
weixin_pay = WeixinPay(
appid=appid,
mchid=mchid,
api_key=api_key,
cert_path=cert_path,
key_path=key_path
)
# 支付参数
out_trade_no = 'your_out_trade_no'
total_fee = 1
body = '商品描述信息'
notify_url = 'your_notify_url'
# 发起支付请求
result = weixin_pay.unifiedorder(
out_trade_no=out_trade_no,
total_fee=total_fee,
body=body,
notify_url=notify_url,
trade_type='NATIVE'
)
if result.get('return_code') == 'SUCCESS' and result.get('result_code') == 'SUCCESS':
code_url = result.get('code_url')
print(f"支付二维码链接:{code_url}")
# 查询订单
query_result = weixin_pay.orderquery(out_trade_no=out_trade_no)
if query_result.get('return_code') == 'SUCCESS' and query_result.get('result_code') == 'SUCCESS':
trade_state = query_result.get('trade_state')
print(f"订单状态:{trade_state}")
# 发起退款请求
if trade_state == 'SUCCESS':
refund_fee = 1
out_refund_no = 'your_out_refund_no'
refund_result = weixin_pay.refund(
out_trade_no=out_trade_no,
out_refund_no=out_refund_no,
total_fee=total_fee,
refund_fee=refund_fee
)
if refund_result.get('return_code') == 'SUCCESS' and refund_result.get('result_code') == 'SUCCESS':
refund_id = refund_result.get('refund_id')
print(f"退款申请成功,退款 ID:{refund_id}")
else:
print(f"退款申请失败,错误信息:{refund_result.get('return_msg')}")
else:
print(f"订单查询失败,错误信息:{query_result.get('return_msg')}")
else:
print(f"支付请求失败,错误信息:{result.get('return_msg')}")
八、注意事项
- 数据安全:API 密钥和证书文件是非常重要的安全信息,务必妥善保管,避免泄露。
- 签名验证:
weixin
库会自动处理签名验证,但在实际应用中,仍需确保签名的正确性,以防止数据被篡改。 - 错误处理:在调用微信支付 API 时,可能会出现各种错误,需要对返回结果进行详细的错误处理,以便及时排查问题。
通过以上步骤,你可以使用 weixin
库中的 WeixinPay
类轻松实现微信支付的支付、查询和退款功能。希望本文对你有所帮助!