views.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # coding=utf-8
  2. import json
  3. import xmltodict
  4. import traceback
  5. from django.db import transaction
  6. from django.http import HttpResponse
  7. from rest_framework.views import APIView
  8. from utils.wx.WXBizMsgCrypt import WXBizMsgCrypt
  9. from utils.exceptions import CustomError
  10. from utils import response_ok, response_error
  11. from utils.wechatpay import WechatPayNotify
  12. from apps.log.models import BizLog
  13. from apps.WechatApplet.models import WechatApplet
  14. from apps.order.models import Pay
  15. from apps.rebate.bussiness import CustomerRebate
  16. class WechatNotifyView(APIView):
  17. def dispatch(self, request, *args, **kwargs):
  18. appid = kwargs['appid']
  19. applet = WechatApplet.getByAppid(appid)
  20. param = request.body
  21. notify = WechatPayNotify(param, applet.tenant_key)
  22. try:
  23. data = notify.handle()
  24. if not data:
  25. raise CustomError(u'错误的请求!')
  26. result_code = data['result_code']
  27. if result_code != 'SUCCESS':
  28. raise CustomError(u'错误的请求!')
  29. no = data['out_trade_no']
  30. amount = int(data['total_fee'])
  31. transaction_id = data['transaction_id']
  32. with transaction.atomic():
  33. pay = Pay.getByNo(no)
  34. pay.payConfirm(amount, transaction_id)
  35. BizLog.objects.addnew(pay.customer.user, BizLog.INSERT, u'微信支付成功,pay_no=%s' % no, param)
  36. # 计算返利
  37. # 在这现金返利发红包(不要在同一个事务里边 防止出错导致 订单状态不能正确改变)
  38. try:
  39. with transaction.atomic(): # 因为在计算 返利的时候使用了select_for_update 这个必须在事务里边
  40. instance = CustomerRebate(pay)
  41. instance.calcul_rebate()
  42. except Exception as e:
  43. traceback.print_exc()
  44. except Exception as e:
  45. traceback.print_exc()
  46. return HttpResponse(WechatPayNotify.response_fail())
  47. return HttpResponse(WechatPayNotify.response_ok())