linhaohong преди 10 месеца
родител
ревизия
d967681aae
променени са 2 файла, в които са добавени 102 реда и са изтрити 1 реда
  1. 3 1
      Ansjer/urls.py
  2. 99 0
      Controller/ShopifyController.py

+ 3 - 1
Ansjer/urls.py

@@ -25,7 +25,8 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     DetectControllerV2, PcInfo, PctestController, DeviceDebug, PaymentCycle, \
     DeviceLogController, CouponController, AiController, ShadowController, AppAccountManagement, InitController, \
-    WeatherControl, SmartReplyController, InAppPurchaseController, DeviceCommonController, TimeAlbumController
+    WeatherControl, SmartReplyController, InAppPurchaseController, DeviceCommonController, TimeAlbumController, \
+    ShopifyController
 from Controller.Cron import CronTaskController
 from Controller.CustomCustomer import CustomCustomerController
 from Controller.MessagePush import EquipmentMessagePush
@@ -285,6 +286,7 @@ urlpatterns = [
     re_path('customCustomer/(?P<operation>.*)$', CustomCustomerController.CustomCustomerView.as_view()),
     re_path('adDepartment/(?P<operation>.*)$', AdDepartmentController.AdDepartmentView.as_view()),
     re_path('timeAlbum/(?P<operation>.*)$', TimeAlbumController.TimeAlbum.as_view()),
+    re_path('shopify/(?P<operation>.*)$', ShopifyController.ShopifyView.as_view()),
 
 
 

+ 99 - 0
Controller/ShopifyController.py

@@ -0,0 +1,99 @@
+from datetime import datetime
+
+import pytz
+from django.db.models import Q
+from django.views import View
+from Crypto.Cipher import AES
+from Crypto.Util.Padding import pad
+from django.contrib.auth.hashers import check_password
+from Model.models import Device_User
+from Object.ResponseObject import ResponseObject
+import base64
+import hmac
+import hashlib
+import os
+import json
+
+
+class ShopifyMultipass:
+    @staticmethod
+    def generate_multipass_token(secret, customer_data):
+        # 第一步:将客户数据转换为JSON格式
+        json_data = json.dumps(customer_data)
+
+        # 第二步:生成加密密钥和签名密钥
+        hash_digest = hashlib.sha256(secret.encode()).digest()
+        encryption_key = hash_digest[:16]  # 128位加密密钥
+        signature_key = hash_digest[16:32]  # 128位签名密钥
+
+        # 第三步:加密JSON数据
+        iv = os.urandom(16)  # 随机初始化向量
+        cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
+        ciphertext = cipher.encrypt(pad(json_data.encode(), AES.block_size))
+
+        # 第四步:签名加密数据
+        data_to_sign = iv + ciphertext
+        signature = hmac.new(signature_key, data_to_sign, hashlib.sha256).digest()
+
+        # 第五步:Base64编码
+        multipass_token = base64.urlsafe_b64encode(iv + ciphertext + signature).decode()
+
+        return multipass_token
+
+
+class ShopifyView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        request_dict = request.GET
+        return self.validation(request, request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        request_dict = request.POST
+        return self.validation(request, request_dict, operation)
+
+    def validation(self, request, request_dict, operation):
+        language = request_dict.get('language', 'cn')
+        response = ResponseObject(language)
+        if operation == 'shopifyLogin':  # APP查詢定制客户信息
+            return self.shopify_login(request_dict, response)
+        else:
+            return response.json(414)
+
+    @staticmethod
+    def shopify_login(request_dict, response):
+        email = request_dict.get("email", None)
+        password = request_dict.get("password", None)
+
+        if not all([email, password]):
+            return response.json(444)
+
+        user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
+        users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
+                               'phone', 'password', 'userIconPath')[0]
+
+        check_flag = check_password(password, users['password'])
+        if not check_flag:
+            return response.json(111)
+
+        # 获取当前时间
+        now = datetime.now(pytz.timezone('America/New_York'))  # 你可以根据需要更改时区
+
+        # 格式化时间戳
+        timestamp = now.strftime('%Y-%m-%dT%H:%M:%S%z')
+        # 添加冒号到时区部分
+        timestamp = timestamp[:-2] + ':' + timestamp[-2:]
+
+        customer_data = {
+            "email": email,
+            "created_at": timestamp,
+        }
+        multipass_secret = "f4863c9979d7ddd16e23817c0dfe7863"  # multipass密钥
+        token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
+
+        # 构造重定向URL
+        redirect_url = f"https://eu.zositech.com/account/login/multipass/{token}"
+
+        return response.json(0, redirect_url)