views.py 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. # coding=utf-8
  2. import json
  3. import xmltodict
  4. from django.db import transaction
  5. from django.http import HttpResponse
  6. from rest_framework.views import APIView
  7. from utils.wx.WXBizMsgCrypt import WXBizMsgCrypt
  8. from utils.exceptions import CustomError
  9. from utils import response_ok, response_error
  10. from utils.wechatpay import WechatPayNotify
  11. from apps.log.models import BizLog
  12. from apps.WechatTp.models import WechatTp
  13. from apps.WechatApplet.models import WechatApplet
  14. from apps.tenant.models import Tenant
  15. from apps.tenant.biz import TenantBiz
  16. class CallbackAuthorize(APIView):
  17. '''验证票据(component_verify_ticket)在第三方平台创建审核通过后,微信服务器会向其 ”授权事件接收URL”
  18. 每隔 10 分钟以 POST 的方式推送 component_verify_ticket 接收 POST 请求后,只需直接返回字符串 success。
  19. 为了加强安全性,postdata 中的 xml 将使用服务申请时的加解密 key 来进行加密'''
  20. def post(self, request):
  21. sMsgSignature = request.GET.get('msg_signature')
  22. sTimeStamp = request.GET.get('timestamp')
  23. sNonce = request.GET.get('nonce')
  24. sPostData = request.body.decode('utf-8')
  25. try:
  26. component = WechatTp.getDefault()
  27. if component:
  28. appid = component.getAppid()
  29. msg_crypt = WXBizMsgCrypt(component.getToken(), component.getEncodeKey(), appid)
  30. ret, decryp_xml = msg_crypt.DecryptMsg(sPostData, sMsgSignature, sTimeStamp, sNonce)
  31. data = json.loads(json.dumps(xmltodict.parse(decryp_xml)))['xml']
  32. if data['AppId'] == appid:
  33. if data['InfoType'] == 'component_verify_ticket':
  34. component.refreshVerifyTicket(data['ComponentVerifyTicket'])
  35. elif data['InfoType'] == 'unauthorized':
  36. authorizer_appid = data['AuthorizerAppid']
  37. authorizer = WechatApplet.getByAppidAndComponentAppid(authorizer_appid, appid)
  38. if authorizer:
  39. authorizer.revoke()
  40. except:
  41. pass
  42. return HttpResponse('success')
  43. class RedirectAuthorize(APIView):
  44. '''小程序绑定授权回调'''
  45. def get(self, request, pk):
  46. try:
  47. with transaction.atomic():
  48. tenant = Tenant.objects.select_for_update().filter(id=pk).first()
  49. app = TenantBiz.bindWechatApplet(tenant, request.GET.get('auth_code'))
  50. BizLog.objects.addnew(None, None, BizLog.INSERT, u'租户绑定小程序, id=%d' % app.id)
  51. except Exception as e:
  52. return response_error(str(e))
  53. return response_ok()
  54. class CallbackEvent(APIView):
  55. '''消息与事件接收'''
  56. def post(self, request, appid):
  57. appid = appid
  58. sMsgSignature = request.GET.get('msg_signature')
  59. sTimeStamp = request.GET.get('timestamp')
  60. sNonce = request.GET.get('nonce')
  61. sPostData = request.body.decode('utf-8')
  62. try:
  63. tp = WechatTp.getDefault()
  64. msg_crypt = WXBizMsgCrypt(tp.getToken(), tp.getEncodeKey(), tp.getAppid())
  65. ret, decryp_xml = msg_crypt.DecryptMsg(sPostData, sMsgSignature, sTimeStamp, sNonce)
  66. data = json.loads(json.dumps(xmltodict.parse(decryp_xml)))['xml']
  67. if data['MsgType'] == 'event':
  68. app = WechatApplet.getByAppid(appid)
  69. if data['Event'] == 'weapp_audit_success': # 代码审核通过
  70. app.weapp_audit_success()
  71. elif data['Event'] == 'weapp_audit_fail': # 代码审核不通过
  72. app.weapp_audit_fail(data['Reason'])
  73. elif data['Event'] == 'weapp_audit_delay': # 代码审核延后
  74. app.weapp_audit_delay(data['Reason'])
  75. except:
  76. pass
  77. return HttpResponse('success')