views.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # coding=utf-8
  2. import traceback
  3. from django.db import transaction
  4. from django.http import HttpResponse
  5. from django.conf import settings
  6. from rest_framework.views import APIView
  7. from util.exceptions import CustomError
  8. from util.wechatpay import WechatPayNotify
  9. from util.wx.wechat import WeChat
  10. from apps.pay.models import Pay
  11. from apps.foundation.models import BizLog
  12. class WechatNotifyView(APIView):
  13. def dispatch(self, request, *args, **kwargs):
  14. param = request.body
  15. appid = kwargs['appid']
  16. # param = request.body.decode('utf-8')
  17. notify = WechatPayNotify(param, settings.AGENT_KEY)
  18. try:
  19. WeChat.checkAppid(appid)
  20. data = notify.handle()
  21. if not data:
  22. raise CustomError(u'错误的请求!')
  23. result_code = data['result_code']
  24. if result_code != 'SUCCESS':
  25. raise CustomError(u'错误的请求!')
  26. no = data['out_trade_no']
  27. amount = float(data['total_fee']) / 100.0
  28. with transaction.atomic():
  29. pay = Pay.getByNo(no)
  30. pay.payConfirm(amount)
  31. BizLog.objects.addnew(pay.customer.user, BizLog.INSERT, u'微信支付成功,no=%s' % no, param)
  32. except Exception as e:
  33. traceback.print_exc()
  34. return HttpResponse(WechatPayNotify.response_fail())
  35. return HttpResponse(WechatPayNotify.response_ok())