在Django中使用微信支付SDK

2023-04-11 00:00:00 django sdk 支付

首先,需要下载并安装微信支付SDK,可以使用以下命令:

pip install wxpay-sdk

在Django项目的settings.py中加入以下配置:

WX_APP_ID = 'your_app_id'
WX_MERCHANT_ID = 'your_merchant_id'
WX_MERCHANT_KEY = 'your_merchant_key'
WX_NOTIFY_URL = 'https://your_notify_url.com/wxpay_notify'

其中,WX_APP_ID为微信支付的App ID,WX_MERCHANT_ID和WX_MERCHANT_KEY为商户ID和商户密钥,在微信支付的商户平台上获取。WX_NOTIFY_URL为支付成功后的回调地址。

接着,在views.py中编写支付的代码:

from wxpay import WxPay, UnifiedOrder

def pay(request):
    wxpay = WxPay(app_id=settings.WX_APP_ID, mch_id=settings.WX_MERCHANT_ID, key=settings.WX_MERCHANT_KEY)

    order = UnifiedOrder(
        body='皮蛋编程',
        out_trade_no='201909080001',
        total_fee=1,
        notify_url=settings.WX_NOTIFY_URL,
        trade_type='NATIVE',
        product_id='pidancode.com',
    )

    resp = wxpay.unified_order(order)

    if resp['return_code'] == 'SUCCESS' and resp['result_code'] == 'SUCCESS':
        code_url = resp['code_url']
        # 将code_url返回给前端,生成支付二维码
    else:
        # 支付失败处理

以上代码中,使用WxPay类初始化微信支付SDK,并创建一个UnifiedOrder对象。其中,body为商品描述,out_trade_no为商户订单号,total_fee为支付金额(单位为分),notify_url为回调地址,trade_type为交易类型(此处为扫码支付),product_id为商品ID。

调用wxpay.unified_order方法,将统一下单请求发送给微信支付接口,并得到响应。当响应中的return_code和result_code均为SUCCESS时,表示支付成功,可以将code_url返回给前端生成支付二维码;否则,支付失败需要进行相应的处理。

最后,在回调函数中处理支付成功后的业务逻辑:

from django.http import HttpResponse
from wxpay import parse_xml, PaymentNotify

def wxpay_notify(request):
    xml = request.body.decode('utf-8')
    data = parse_xml(xml)

    wxpay = WxPay(app_id=settings.WX_APP_ID, mch_id=settings.WX_MERCHANT_ID, key=settings.WX_MERCHANT_KEY)

    notify = PaymentNotify(xml)
    if notify.is_valid():
        out_trade_no = notify.out_trade_no
        total_fee = notify.total_fee
        # 处理支付成功后的业务逻辑
        return HttpResponse('SUCCESS')
    else:
        return HttpResponse('FAIL')

在回调函数wxpay_notify中,首先将接收到的xml数据解析成字典对象data。然后使用WxPay类初始化微信支付SDK,在创建PaymentNotify对象时将xml数据传递给它,判断是否为有效的支付结果。如果有效,则从notify对象中获取商户订单号out_trade_no和支付金额total_fee,进行相应的业务逻辑处理;否则,返回FAIL表示处理失败。

在Django项目中使用微信支付SDK,以上就是一个基本的示例。注意,还应该设置微信支付接口的IP白名单,以及相关参数的安全性处理等。

相关文章