Python中Django框架集成微信支付的案例分享

在写一个公众号的小玩意,不过在微信支付这里碰到坑了…
Python中Django框架集成微信支付的案例分享

7 回复

有,前年做过。。。


帖子回复:

正好做过Django集成微信支付的项目,分享个V3版的核心实现。微信支付现在主推V3接口,比V2更规范。

1. 基础配置

# settings.py
WECHAT_PAY = {
    'appid': '你的公众号appid',
    'mchid': '商户号',
    'api_key': 'APIv3密钥',
    'serial_no': '商户证书序列号',
    'private_key': open('apiclient_key.pem').read(),
    'cert_path': '微信支付平台证书路径'
}

2. 核心支付类

import json
import time
import hashlib
from datetime import datetime
from cryptography.hazmat.primitives.serialization import load_pem_private_key
from django.http import JsonResponse

class WeChatPayV3:
    def __init__(self, config):
        self.appid = config['appid']
        self.mchid = config['mchid']
        self.api_key = config['api_key']
        self.private_key = load_pem_private_key(
            config['private_key'].encode(),
            password=None
        )
    
    def create_order(self, out_trade_no, total, description, notify_url):
        """创建JSAPI支付订单"""
        url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"
        
        # 构建请求体
        data = {
            "appid": self.appid,
            "mchid": self.mchid,
            "description": description,
            "out_trade_no": out_trade_no,
            "time_expire": (datetime.now() + timedelta(minutes=30)).isoformat(),
            "notify_url": notify_url,
            "amount": {
                "total": total,  # 单位分
                "currency": "CNY"
            },
            "payer": {
                "openid": "用户openid"  # 实际从session获取
            }
        }
        
        # 生成签名(这里简化,实际需要完整签名逻辑)
        signature = self._generate_signature('POST', url, data)
        
        # 发送请求到微信支付
        # ... 实际HTTP请求代码
        
        # 返回前端需要的支付参数
        return {
            "timeStamp": str(int(time.time())),
            "package": f"prepay_id={prepay_id}",
            "paySign": self._generate_pay_sign(prepay_id),
            "signType": "RSA"
        }
    
    def _generate_signature(self, method, url, body):
        """生成V3版签名"""
        # 实际实现需要构建签名串并RSA签名
        pass
    
    def _generate_pay_sign(self, prepay_id):
        """生成前端支付签名"""
        message = f"{self.appid}\n{int(time.time())}\n{prepay_id}\n"
        return self.private_key.sign(
            message.encode(),
            padding.PKCS1v15(),
            hashes.SHA256()
        ).hex()

3. 支付回调处理

# views.py
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@csrf_exempt
def wechat_notify(request):
    """支付结果回调"""
    if request.method != 'POST':
        return HttpResponse(status=405)
    
    # 验证签名(重要!)
    signature = request.headers.get('Wechatpay-Signature')
    timestamp = request.headers.get('Wechatpay-Timestamp')
    nonce = request.headers.get('Wechatpay-Nonce')
    
    # 验证逻辑...
    
    data = json.loads(request.body)
    
    # 处理业务逻辑
    if data['event_type'] == 'TRANSACTION.SUCCESS':
        out_trade_no = data['resource']['out_trade_no']
        # 更新订单状态
        Order.objects.filter(trade_no=out_trade_no).update(
            status='paid',
            paid_at=datetime.now()
        )
    
    return JsonResponse({"code": "SUCCESS", "message": "OK"})

4. 前端调用

// 前端调用微信支付
function onBridgeReady(prepayData){
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest',
        prepayData,
        function(res){
            if(res.err_msg == "get_brand_wcpay_request:ok"){
                // 支付成功
                window.location.href = '/pay/success/'
            }
        }
    );
}

关键点:

  1. 证书管理:需要商户API证书和平台证书
  2. 签名验证:回调一定要验签,防止伪造
  3. 订单状态:以微信回调为准,不要依赖前端返回

建议:用官方SDK能省不少事。

用 wechatpy 的话应该没有什么坑吧

可以参考一下么?

可以用 weixin-python,前两天才用 tornado 和它做了微信支付的功能
https://github.com/zwczou/weixin-python


import weixin-python
pay = WeixinPay(appid,微信商户 id,微信商户 KEY,微信回调地址)
order_string = pay.unified_order(trade_type=支付方式,product_id=商品 ID, body=标题, out_trade_no=订单号, total_fee=金额, attach=额外信息)
如果你填的东西正确,order_string 就是微信给你返回的东西,比如选择二维码付款的话就会给你返回二维码链接

https://github.com/mrhaoji/django-wechat-pay

Django + wechatpy 做的微信小程序端微信支付 demo

回到顶部