django实现微信支付功能实例
时间: 2024-01-01 16:05:51 浏览: 158
要在Django中实现微信支付功能,需要遵循以下步骤:
1. 在微信商户平台注册账号并开通微信支付功能。
2. 安装 `wechatpy` 包,这是一个专门用于微信支付的Python库。
3. 在 `settings.py` 文件中添加以下代码:
```python
WECHAT_APPID = 'your-appid'
WECHAT_MCH_ID = 'your-merchant-id'
WECHAT_MCH_KEY = 'your-merchant-key'
WECHAT_NOTIFY_URL = 'your-notify-url'
```
这些参数可以在微信商户平台上找到。
4. 创建一个 `Payment` 模型,用于存储支付订单信息。示例代码:
```python
from django.db import models
class Payment(models.Model):
out_trade_no = models.CharField(max_length=32, unique=True)
total_fee = models.IntegerField()
body = models.CharField(max_length=100)
openid = models.CharField(max_length=32)
trade_type = models.CharField(max_length=16)
prepay_id = models.CharField(max_length=64)
nonce_str = models.CharField(max_length=32)
created_time = models.DateTimeField(auto_now_add=True)
```
`out_trade_no` 是订单号,`total_fee` 是支付金额,`body` 是订单描述,`openid` 是用户的微信openid,`trade_type` 是交易类型,`prepay_id` 是预支付订单ID,`nonce_str` 是随机字符串,`created_time` 是订单创建时间。
5. 编写视图函数,用于处理支付请求和回调通知。示例代码:
```python
from django.http import JsonResponse
from wechatpy.pay import WeChatPay
from .models import Payment
from . import settings
wechat_pay = WeChatPay(
appid=settings.WECHAT_APPID,
mch_id=settings.WECHAT_MCH_ID,
api_key=settings.WECHAT_MCH_KEY,
)
def pay(request):
openid = request.GET.get('openid')
total_fee = request.GET.get('total_fee')
body = request.GET.get('body')
out_trade_no = 'your-out-trade-no'
# 调用微信支付API
result = wechat_pay.order.create(
trade_type='JSAPI',
body=body,
total_fee=total_fee,
notify_url=settings.WECHAT_NOTIFY_URL,
openid=openid,
out_trade_no=out_trade_no,
)
# 保存支付订单信息
Payment.objects.create(
out_trade_no=out_trade_no,
total_fee=total_fee,
body=body,
openid=openid,
trade_type=result['trade_type'],
prepay_id=result['prepay_id'],
nonce_str=result['nonce_str'],
)
# 返回支付参数
jsapi_params = wechat_pay.jsapi.get_jsapi_params(result['prepay_id'])
return JsonResponse(jsapi_params)
def notify(request):
xml_data = request.body.decode('utf-8')
result = wechat_pay.parse_payment_result(xml_data)
out_trade_no = result['out_trade_no']
payment = Payment.objects.get(out_trade_no=out_trade_no)
# 更新订单状态
payment.status = 'SUCCESS'
payment.transaction_id = result['transaction_id']
payment.time_end = result['time_end']
payment.save()
return HttpResponse('SUCCESS')
```
`pay` 视图函数用于创建预支付订单并返回支付参数,`notify` 视图函数用于处理支付回调通知并更新订单状态。
6. 在微信公众号中实现支付功能,需要调用 `wx.chooseWXPay` 函数。示例代码:
```javascript
wx.chooseWXPay({
appId: 'your-appid',
timestamp: 'your-timestamp',
nonceStr: 'your-noncestr',
package: 'prepay_id=your-prepayid',
signType: 'MD5',
paySign: 'your-paysign',
success: function(res) {
// 支付成功
},
fail: function(res) {
// 支付失败
}
});
```
以上就是在Django中实现微信支付功能的步骤和示例代码。
阅读全文