From 54b88fdc8e5d73531ac468753ec23088152bf363 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Sun, 13 Feb 2022 22:15:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test_server/crm/WXBizDataCrypt.py | 32 +++++++++++++++++++++++++++++++ test_server/crm/urls.py | 3 ++- test_server/crm/views.py | 16 ++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 test_server/crm/WXBizDataCrypt.py diff --git a/test_server/crm/WXBizDataCrypt.py b/test_server/crm/WXBizDataCrypt.py new file mode 100644 index 0000000..091f8f0 --- /dev/null +++ b/test_server/crm/WXBizDataCrypt.py @@ -0,0 +1,32 @@ +import base64 +import json +from Crypto.Cipher import AES +from rest_framework.exceptions import APIException +import logging +logger = logging.getLogger('log') +class WXBizDataCrypt: + def __init__(self, appId, sessionKey): + self.appId = appId + self.sessionKey = sessionKey + + def decrypt(self, encryptedData, iv): + # base64 decode + try: + sessionKey = base64.b64decode(self.sessionKey) + encryptedData = base64.b64decode(encryptedData) + iv = base64.b64decode(iv) + + cipher = AES.new(sessionKey, AES.MODE_CBC, iv) + + decrypted = json.loads(self._unpad(cipher.decrypt(encryptedData))) + + if decrypted['watermark']['appid'] != self.appId: + raise Exception('Invalid Buffer') + + return decrypted + except: + logger.error('腾讯sb-{}-{}-{}'.format(self.sessionKey,encryptedData, iv)) + raise APIException('获取手机号失败,请稍后重试') + + def _unpad(self, s): + return s[:-ord(s[len(s)-1:])] diff --git a/test_server/crm/urls.py b/test_server/crm/urls.py index da70839..d45ea3b 100644 --- a/test_server/crm/urls.py +++ b/test_server/crm/urls.py @@ -1,6 +1,6 @@ from django.urls import path,include from .views import CompanyViewSet, \ -ConsumerViewSet, ConsumerMPLoginView, ConsumerRegister, MsgViewSet, change_remain_count, ConsumerPermViewSet, ConsumerRoleViewSet, candidate, CandidateViewSet +ConsumerViewSet, ConsumerMPLoginView, ConsumerRegister, MsgViewSet, WxphoneRegister, change_remain_count, ConsumerPermViewSet, ConsumerRoleViewSet, candidate, CandidateViewSet from rest_framework import routers @@ -14,6 +14,7 @@ router.register('msg', MsgViewSet, basename="msg") urlpatterns = [ path('consumer/mplogin/', ConsumerMPLoginView.as_view()), path('consumer/register/', ConsumerRegister.as_view()), + path('consumer/wxphoneregister/', WxphoneRegister.as_view()), path('change_remain_count/', change_remain_count.as_view()), path('candidate/img/',candidate), path('', include(router.urls)), diff --git a/test_server/crm/views.py b/test_server/crm/views.py index e183f31..0ca10c2 100644 --- a/test_server/crm/views.py +++ b/test_server/crm/views.py @@ -643,6 +643,22 @@ class ConsumerRegister(APIView): else: return Response({'error':'信息不全!'}) +from .WXBizDataCrypt import WXBizDataCrypt +class WxphoneRegister(APIView): + """ + 微信手机号注册 + """ + def post(self, request, *args, **kwargs): + data = request.data + pc = WXBizDataCrypt(appid, data['sessionKey']) + wxdata = pc.decrypt(data['encryptedData'], data['iv']) + request.user.username = wxdata['phoneNumber'] + if request.user.role.name =='游客': + request.user.role = ConsumerRole.objects.get(name='注册用户') + if not request.user.workscope: + request.user.workscope = WorkScope.objects.all().first() + request.user.save() + return Response(status=status.HTTP_200_OK) class change_remain_count(APIView): perms_map=[{'*':'change_remain_count'}]