12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- # coding=utf-8
- import json
- import xmltodict
- import traceback
- from django.db import transaction
- from django.http import HttpResponse
- from rest_framework.views import APIView
- from utils.wx.WXBizMsgCrypt import WXBizMsgCrypt
- from utils.exceptions import CustomError
- from utils import response_ok, response_error
- from utils.wechatpay import WechatPayNotify
- from apps.log.models import BizLog
- from apps.WechatApplet.models import WechatApplet
- from apps.order.models import Pay
- from apps.rebate.bussiness import CustomerRebate
- class WechatNotifyView(APIView):
- def dispatch(self, request, *args, **kwargs):
- appid = kwargs['appid']
- applet = WechatApplet.getByAppid(appid)
- param = request.body
- notify = WechatPayNotify(param, applet.tenant_key)
- try:
- data = notify.handle()
- if not data:
- raise CustomError(u'错误的请求!')
- result_code = data['result_code']
- if result_code != 'SUCCESS':
- raise CustomError(u'错误的请求!')
- no = data['out_trade_no']
- amount = int(data['total_fee'])
- transaction_id = data['transaction_id']
- with transaction.atomic():
- pay = Pay.getByNo(no)
- pay.payConfirm(amount, transaction_id)
- BizLog.objects.addnew(pay.customer.user, BizLog.INSERT, u'微信支付成功,pay_no=%s' % no, param)
- # 计算返利
- # 在这现金返利发红包(不要在同一个事务里边 防止出错导致 订单状态不能正确改变)
- try:
- with transaction.atomic(): # 因为在计算 返利的时候使用了select_for_update 这个必须在事务里边
- instance = CustomerRebate(pay)
- instance.calcul_rebate()
- except Exception as e:
- traceback.print_exc()
- except Exception as e:
- traceback.print_exc()
- return HttpResponse(WechatPayNotify.response_fail())
- return HttpResponse(WechatPayNotify.response_ok())
|