ShopifyController.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from datetime import datetime
  2. import pytz
  3. from django.db.models import Q
  4. from django.views import View
  5. from Crypto.Cipher import AES
  6. from Crypto.Util.Padding import pad
  7. from django.contrib.auth.hashers import check_password
  8. from Model.models import Device_User
  9. from Object.ResponseObject import ResponseObject
  10. import base64
  11. import hmac
  12. import hashlib
  13. import os
  14. import json
  15. class ShopifyMultipass:
  16. @staticmethod
  17. def generate_multipass_token(secret, customer_data):
  18. # 第一步:将客户数据转换为JSON格式
  19. json_data = json.dumps(customer_data)
  20. # 第二步:生成加密密钥和签名密钥
  21. hash_digest = hashlib.sha256(secret.encode()).digest()
  22. encryption_key = hash_digest[:16] # 128位加密密钥
  23. signature_key = hash_digest[16:32] # 128位签名密钥
  24. # 第三步:加密JSON数据
  25. iv = os.urandom(16) # 随机初始化向量
  26. cipher = AES.new(encryption_key, AES.MODE_CBC, iv)
  27. ciphertext = cipher.encrypt(pad(json_data.encode(), AES.block_size))
  28. # 第四步:签名加密数据
  29. data_to_sign = iv + ciphertext
  30. signature = hmac.new(signature_key, data_to_sign, hashlib.sha256).digest()
  31. # 第五步:Base64编码
  32. multipass_token = base64.urlsafe_b64encode(iv + ciphertext + signature).decode()
  33. return multipass_token
  34. class ShopifyView(View):
  35. def get(self, request, *args, **kwargs):
  36. request.encoding = 'utf-8'
  37. operation = kwargs.get('operation')
  38. request_dict = request.GET
  39. return self.validation(request, request_dict, operation)
  40. def post(self, request, *args, **kwargs):
  41. request.encoding = 'utf-8'
  42. operation = kwargs.get('operation')
  43. request_dict = request.POST
  44. return self.validation(request, request_dict, operation)
  45. def validation(self, request, request_dict, operation):
  46. language = request_dict.get('language', 'cn')
  47. response = ResponseObject(language)
  48. if operation == 'shopifyLogin': # APP查詢定制客户信息
  49. return self.shopify_login(request_dict, response)
  50. else:
  51. return response.json(414)
  52. @staticmethod
  53. def shopify_login(request_dict, response):
  54. email = request_dict.get("email", None)
  55. password = request_dict.get("password", None)
  56. if not all([email, password]):
  57. return response.json(444)
  58. user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
  59. users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
  60. 'phone', 'password', 'userIconPath')[0]
  61. check_flag = check_password(password, users['password'])
  62. if not check_flag:
  63. return response.json(111)
  64. # 获取当前时间
  65. now = datetime.now(pytz.timezone('America/New_York')) # 你可以根据需要更改时区
  66. # 格式化时间戳
  67. timestamp = now.strftime('%Y-%m-%dT%H:%M:%S%z')
  68. # 添加冒号到时区部分
  69. timestamp = timestamp[:-2] + ':' + timestamp[-2:]
  70. customer_data = {
  71. "email": email,
  72. "created_at": timestamp,
  73. }
  74. multipass_secret = "f4863c9979d7ddd16e23817c0dfe7863" # multipass密钥
  75. token = ShopifyMultipass.generate_multipass_token(multipass_secret, customer_data)
  76. # 构造重定向URL
  77. redirect_url = f"https://eu.zositech.com/account/login/multipass/{token}"
  78. return response.json(0, redirect_url)