2023-12-13 16:09:16 +08:00
|
|
|
|
import base64
|
|
|
|
|
|
|
|
|
|
from rest_framework import serializers
|
|
|
|
|
|
|
|
|
|
from libs.weworkapi.callback.WXBizMsgCrypt3 import WXBizMsgCrypt, Prpcrypt
|
|
|
|
|
from utils.tools import sha1_encoder, get_attribute
|
|
|
|
|
import xml.etree.cElementTree as ET
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WechatPublicTokenSerializer(serializers.Serializer):
|
|
|
|
|
msg_signature = serializers.CharField()
|
|
|
|
|
echostr = serializers.CharField()
|
|
|
|
|
timestamp = serializers.CharField()
|
|
|
|
|
nonce = serializers.CharField()
|
|
|
|
|
|
|
|
|
|
def validate(self, attrs):
|
2023-12-14 13:22:07 +08:00
|
|
|
|
corp = self.context.get('corp')
|
|
|
|
|
token = corp.token
|
|
|
|
|
corpid = corp.corpid
|
|
|
|
|
encoding_aes_key = corp.encodingaeskey
|
2023-12-13 16:09:16 +08:00
|
|
|
|
msg_signature = attrs.get('msg_signature')
|
|
|
|
|
echostr = attrs.get('echostr')
|
|
|
|
|
timestamp = attrs.get('timestamp')
|
|
|
|
|
nonce = attrs.get('nonce')
|
2023-12-14 13:22:07 +08:00
|
|
|
|
# # 1)将token、timestamp、nonce, echostr四个参数进行字典序排序
|
|
|
|
|
# arr = [token, timestamp, nonce, echostr]
|
|
|
|
|
# arr.sort()
|
|
|
|
|
# # 2)将三个参数字符串拼接成一个字符串进行sha1加密
|
|
|
|
|
# data = "".join(arr)
|
|
|
|
|
# # 3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信
|
|
|
|
|
# encode_str = sha1_encoder(data)
|
2023-12-13 16:09:16 +08:00
|
|
|
|
wxcpt = WXBizMsgCrypt(token, encoding_aes_key, corpid)
|
|
|
|
|
ret, echostr = wxcpt.VerifyURL(msg_signature, timestamp, nonce, echostr)
|
|
|
|
|
if ret != 0:
|
|
|
|
|
return {}
|
|
|
|
|
attrs['echostr'] = echostr.decode()
|
2023-12-14 13:22:07 +08:00
|
|
|
|
return attrs
|
2023-12-13 16:09:16 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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')
|
2023-12-14 14:42:38 +08:00
|
|
|
|
corp = self.context.get('corp')
|
|
|
|
|
encoding_aes_key = corp.encodingaeskey
|
2023-12-13 16:09:16 +08:00
|
|
|
|
encrypt = attrs.get('Encrypt')
|
|
|
|
|
xmltext = self.decrypt(encrypt, encoding_aes_key)
|
|
|
|
|
data = self.parse_xml(xmltext)
|
|
|
|
|
print('data-->', data)
|
|
|
|
|
return attrs
|
|
|
|
|
|
|
|
|
|
def create(self, data):
|
|
|
|
|
print(data)
|
|
|
|
|
|
|
|
|
|
def decrypt(self, encrypt, encoding_key):
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
|
|
key = base64.b64decode(encoding_key + "=")
|
|
|
|
|
prpcrypt = Prpcrypt(key)
|
|
|
|
|
corpid = ''
|
|
|
|
|
res, decrypt = prpcrypt.decrypt(encrypt, corpid)
|
|
|
|
|
if res != 0:
|
|
|
|
|
return
|
|
|
|
|
decrypt = decrypt.decode()
|
|
|
|
|
return decrypt
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(e)
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|