拍爱

views.py 2.8KB

    # -*- coding: utf-8 -*- 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.errno_utils import OrderStatusCode from utils.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): 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)) # 总金额,单位分 # JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里 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, # user_id=None, # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传 ) 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): try: data = xmltodict.parse(request.body)['xml'] except xmltodict.ParsingInterrupted: # 解析 XML 失败 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)