拍爱

views.py 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # -*- coding: utf-8 -*-
  2. from django.conf import settings
  3. from django.db import transaction
  4. from django.http import JsonResponse
  5. from django.shortcuts import HttpResponse
  6. from pay.models import OrderInfo
  7. from utils.error.errno_utils import OrderStatusCode
  8. from utils.error.response_utils import response
  9. from TimeConvert import TimeConvert as tc
  10. from wechatpy import WeChatPay, WeChatPayException
  11. import xmltodict
  12. WECHAT = settings.WECHAT
  13. wxpay = WeChatPay(WECHAT['appID'], WECHAT['apiKey'], WECHAT['mchID'])
  14. @transaction.atomic
  15. def wx_order_create_api(request):
  16. """
  17. 订单创建
  18. :param request:
  19. :return:
  20. """
  21. from_uid = request.POST.get('from_uid', '')
  22. to_lid = request.POST.get('to_lid', '')
  23. to_uid = request.POST.get('to_uid', '')
  24. body = request.POST.get('body', '') # 商品描述
  25. total_fee = int(request.POST.get('total_fee', 0)) # 总金额,单位分
  26. # JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里
  27. trade_type = request.POST.get('trade_type', '')
  28. # 生成订单
  29. order = OrderInfo.objects.create(from_uid=from_uid, to_lid=to_lid, to_uid=to_uid, total_fee=total_fee)
  30. try:
  31. prepay_data = wxpay.order.create(
  32. body=body,
  33. notify_url=settings.API_DOMAIN + '/wx/notify_url',
  34. out_trade_no=order.order_id,
  35. total_fee=total_fee,
  36. trade_type=trade_type,
  37. # user_id=None, # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传
  38. )
  39. except WeChatPayException:
  40. return response(OrderStatusCode.WX_UNIFIED_ORDER_FAIL)
  41. prepay_id = prepay_data.get('prepay_id', '')
  42. wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id)
  43. return JsonResponse({
  44. 'status': 200,
  45. 'data': {
  46. 'order_id': order.order_id,
  47. 'prepay_id': prepay_id,
  48. 'wxpay_params': wxpay_params,
  49. }
  50. })
  51. def order_paid_success(order):
  52. if order.pay_status == OrderInfo.PAID:
  53. return
  54. order.pay_status = OrderInfo.PAID
  55. order.paid_at = tc.utc_datetime()
  56. order.save()
  57. @transaction.atomic
  58. def wx_notify_url_api(request):
  59. """
  60. 支付异步通知回调地址
  61. :param request:
  62. :return:
  63. """
  64. try:
  65. data = xmltodict.parse(request.body)['xml']
  66. except xmltodict.ParsingInterrupted:
  67. # 解析 XML 失败
  68. return HttpResponse(settings.WXPAY_NOTIFY_FAIL)
  69. out_trade_no = data.get('out_trade_no', '')
  70. return_code = data.get('return_code', '')
  71. result_code = data.get('result_code', '')
  72. if return_code != 'SUCCESS' or result_code != 'SUCCESS':
  73. return HttpResponse(settings.WXPAY_NOTIFY_FAIL)
  74. try:
  75. order = OrderInfo.objects.get(order=out_trade_no)
  76. except OrderInfo.DoesNotExist:
  77. return HttpResponse(settings.WXPAY_NOTIFY_FAIL)
  78. order_paid_success(order)
  79. return HttpResponse(settings.WXPAY_NOTIFY_SUCCESS)