From 2b96c482fa8818be08736359fde60f1a33c7022a Mon Sep 17 00:00:00 2001 From: AKW <2497744746@qq.com> Date: Thu, 14 Dec 2023 15:29:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E8=B0=83=E5=9C=B0=E5=9D=80=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/jqr/serializers.py | 55 ++++++++++++----------------------------- apps/jqr/views.py | 6 ++--- utils/tools.py | 5 ++++ 3 files changed, 24 insertions(+), 42 deletions(-) diff --git a/apps/jqr/serializers.py b/apps/jqr/serializers.py index 1a22dd0..e84f13f 100644 --- a/apps/jqr/serializers.py +++ b/apps/jqr/serializers.py @@ -3,7 +3,7 @@ import base64 from rest_framework import serializers from libs.weworkapi.callback.WXBizMsgCrypt3 import WXBizMsgCrypt, Prpcrypt -from utils.tools import sha1_encoder, get_attribute +from utils.tools import sha1_encoder, get_attribute, camel_to_snake import xml.etree.cElementTree as ET @@ -38,26 +38,21 @@ class WechatPublicTokenSerializer(serializers.Serializer): class WechatEncryptSerializer(serializers.Serializer): - ToUserName = serializers.CharField() - Encrypt = serializers.CharField() - AgentID = serializers.CharField() - - def validate(self, attrs): - # encoding_aes_key = settings.WECHAT_WORKER.get('EncodingAESKey') - corp = self.context.get('corp') - encoding_aes_key = corp.encodingaeskey - encrypt = attrs.get('Encrypt') - xmltext = self.decrypt(encrypt, encoding_aes_key) - data = self.parse_xml(xmltext) - print('data-->', data) - return attrs + ToUserName = serializers.CharField(write_only=True) + Encrypt = serializers.CharField(write_only=True) + AgentID = serializers.CharField(write_only=True) def create(self, data): + corp = self.context.get('corp') + encoding_aes_key = corp.encodingaeskey + encrypt = data.get('Encrypt') + xmltext = self.decrypt(encrypt, encoding_aes_key) + data = self.parse_xml(xmltext) print(data) + return {} def decrypt(self, encrypt, encoding_key): try: - key = base64.b64decode(encoding_key + "=") prpcrypt = Prpcrypt(key) corpid = '' @@ -71,27 +66,9 @@ class WechatEncryptSerializer(serializers.Serializer): def parse_xml(self, xmltext): xml_tree = ET.fromstring(xmltext) - to_user_name = get_attribute(xml_tree.find("ToUserName"), 'text') - from_user_name = get_attribute(xml_tree.find("FromUserName"), 'text') - create_time = get_attribute(xml_tree.find("CreateTime"), 'text') - msg_type = get_attribute(xml_tree.find("MsgType"), 'text') - event = get_attribute(xml_tree.find("Event"), 'text') - change_type = get_attribute(xml_tree.find("ChangeType"), 'text') - user_id = get_attribute(xml_tree.find("UserID"), 'text') - external_user_id = get_attribute(xml_tree.find("ExternalUserID"), 'text') - state = get_attribute(xml_tree.find("State"), 'text') - welcome_code = get_attribute(xml_tree.find("WelcomeCode"), 'text') - return { - 'to_user_name': to_user_name, - 'from_user_name': from_user_name, - 'create_time': create_time, - 'msg_type': msg_type, - 'event': event, - 'change_type': change_type, - 'user_id': user_id, - 'external_user_id': external_user_id, - 'state': state, - 'welcome_code': welcome_code - } - - + data = {} + for child in xml_tree: + tag = child.tag + key = camel_to_snake(tag) + data[key] = get_attribute(xml_tree.find(key), 'text') + return data diff --git a/apps/jqr/views.py b/apps/jqr/views.py index 8506911..b76bd65 100644 --- a/apps/jqr/views.py +++ b/apps/jqr/views.py @@ -35,7 +35,6 @@ class WechatWorkerViewSet(viewsets.GenericViewSet): @verify.mapping.post def message(self, request, path, *args, **kwargs): - print(request.data) if not settings.DEBUG: data = request.data # cbtest.xbtool.cn @@ -43,14 +42,15 @@ class WechatWorkerViewSet(viewsets.GenericViewSet): data = renderer.render(data) url = f'https://46i859447w.yicp.fun/event/callback/{path}' res = requests.post(url, data=data, headers={'Content-Type': 'text/xml'}) - return Response(data=res.json()) + return Response() [business, corpid, agentid, uid] = path.split('_') corp = QcCorpinfo.objects.get(corpid=corpid, agentid=agentid, uid=uid) context = self.get_serializer_context() context['corp'] = corp serializer = WechatEncryptSerializer(data=request.data, context=context) serializer.is_valid(raise_exception=True) - return Response(data=serializer.data) + serializer.save() + return Response() def get_parsers(self): if self.request.method == 'POST': diff --git a/utils/tools.py b/utils/tools.py index 0f91f0c..b1e3189 100644 --- a/utils/tools.py +++ b/utils/tools.py @@ -254,3 +254,8 @@ def get_attribute(obj, field): if obj is None: return return getattr(obj, field) + + +def camel_to_snake(name): + s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) + return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()