123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- from django.conf import settings
- from django.db import transaction
- from django.http import JsonResponse
- from django.shortcuts import HttpResponse
- from pay.models import OrderInfo
- from utils.error.errno_utils import OrderStatusCode
- from utils.error.response_utils import response
- from TimeConvert import TimeConvert as tc
- from wechatpy import WeChatPay, WeChatPayException
- import xmltodict
- WECHAT = settings.WECHAT
- wxpay = WeChatPay(WECHAT['appID'], WECHAT['apiKey'], WECHAT['mchID'])
- @transaction.atomic
- def wx_order_create_api(request):
- """
- 订单创建
- :param request:
- :return:
- """
- from_uid = request.POST.get('from_uid', '')
- to_lid = request.POST.get('to_lid', '')
- to_uid = request.POST.get('to_uid', '')
- body = request.POST.get('body', '')
- total_fee = int(request.POST.get('total_fee', 0))
-
- trade_type = request.POST.get('trade_type', '')
-
- order = OrderInfo.objects.create(from_uid=from_uid, to_lid=to_lid, to_uid=to_uid, total_fee=total_fee)
- try:
- prepay_data = wxpay.order.create(
- body=body,
- notify_url=settings.API_DOMAIN + '/wx/notify_url',
- out_trade_no=order.order_id,
- total_fee=total_fee,
- trade_type=trade_type,
-
- )
- except WeChatPayException:
- return response(OrderStatusCode.WX_UNIFIED_ORDER_FAIL)
- prepay_id = prepay_data.get('prepay_id', '')
- wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id)
- return JsonResponse({
- 'status': 200,
- 'data': {
- 'order_id': order.order_id,
- 'prepay_id': prepay_id,
- 'wxpay_params': wxpay_params,
- }
- })
- def order_paid_success(order):
- if order.pay_status == OrderInfo.PAID:
- return
- order.pay_status = OrderInfo.PAID
- order.paid_at = tc.utc_datetime()
- order.save()
- @transaction.atomic
- def wx_notify_url_api(request):
- """
- 支付异步通知回调地址
- :param request:
- :return:
- """
- try:
- data = xmltodict.parse(request.body)['xml']
- except xmltodict.ParsingInterrupted:
-
- return HttpResponse(settings.WXPAY_NOTIFY_FAIL)
- out_trade_no = data.get('out_trade_no', '')
- return_code = data.get('return_code', '')
- result_code = data.get('result_code', '')
- if return_code != 'SUCCESS' or result_code != 'SUCCESS':
- return HttpResponse(settings.WXPAY_NOTIFY_FAIL)
- try:
- order = OrderInfo.objects.get(order=out_trade_no)
- except OrderInfo.DoesNotExist:
- return HttpResponse(settings.WXPAY_NOTIFY_FAIL)
- order_paid_success(order)
- return HttpResponse(settings.WXPAY_NOTIFY_SUCCESS)
|