Python 对接微信支付:使用 weixin 库实现支付、查询与退款

一、引言

在当今数字化的商业世界中,微信支付已经成为了主流的支付方式之一。对于开发者而言,如何方便快捷地在 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 类轻松实现微信支付的支付、查询和退款功能。希望本文对你有所帮助!

微信支付的 v3 版本相比较 v2 版本有了很多变化和升级,包括接口地址、签名方式、请求参数等等。在 Python对接微信支付 v3 接口,需要使用到官方提供的 SDK 和第三方。 下面是一个简单的对接微信支付 v3 的示例代码: 1. 安装依赖:需要安装 `wechatpay` 和 `requests` 两个,可以通过 pip 命令进行安装: ```python pip install wechatpay requests ``` 2. 导入 SDK 和: ```python import wechatpay import wechatpay.utils as utils import requests ``` 3. 配置商户证书和密钥: ```python merchant_id = '商户号' api_key = 'API密钥' cert_file = 'apiclient_cert.pem' key_file = 'apiclient_key.pem' ``` 4. 使用 SDK 创建支付订单: ```python url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi' nonce_str = utils.generate_random_string(32) timestamp = utils.get_current_timestamp() body = { "mchid": merchant_id, "appid": "应用ID", "description": "商品描述", "out_trade_no": "商户订单号", "amount": { "total": 1, "currency": "CNY" }, "payer": { "openid": "用户openid" } } headers = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': 'WECHATPAY2-SHA256-RSA2048 ' + wechatpay.get_authorization_header( method='POST', url=url, body=body, merchant_id=merchant_id, api_key=api_key, cert_file=cert_file, key_file=key_file, nonce_str=nonce_str, timestamp=timestamp ) } response = requests.post(url, headers=headers, json=body) ``` 5. 处理返回结果: ```python if response.status_code == 200: result = response.json() prepay_id = result.get('prepay_id') return_data = { 'appId': '应用ID', 'timeStamp': str(timestamp), 'nonceStr': nonce_str, 'package': 'prepay_id=' + prepay_id, 'signType': 'RSA', 'paySign': wechatpay.get_sha256withrsa_signature( timestamp + '\n' + nonce_str + '\n' + 'prepay_id=' + prepay_id + '\n', key_file=key_file ) } else: error_msg = response.json().get('message') return {'error': error_msg} ``` 以上是一个简单的微信支付 v3 对接示例,具体实现还需要根据自己的业务需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱搬砖的程序猿.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值