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/'
}
}
);
}
关键点:
- 证书管理:需要商户API证书和平台证书
- 签名验证:回调一定要验签,防止伪造
- 订单状态:以微信回调为准,不要依赖前端返回
建议:用官方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

