Przeglądaj źródła

对接五兴套餐订购

zhangdongming 2 lat temu
rodzic
commit
3effe57cf6

+ 116 - 2
Controller/UnicomCombo/WXTechController.py

@@ -6,13 +6,24 @@
 @Email   : zhangdongming@asj6.wecom.work
 @Software: PyCharm
 """
+import logging
+import time
+
 from django.http import QueryDict
 from django.views import View
 
-from Ansjer.config import LOGGER
+from Controller.UnicomCombo.UnicomComboController import UnicomComboView
+from Model.models import UnicomDeviceInfo, Order_Model, UnicomComboExperienceHistory, UnicomCombo
+from Object.Enums.WXOperatorEnum import WXOperatorEnum
+from Object.Enums.WXStartTypeEnum import WXStartTypeEnum
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.WXTechObject import WXTechObject
+from Service.CommonService import CommonService
+
+LOGGER = logging.getLogger('info')
+# 五兴科技 套餐编码 1G 15天流量包
+COMBO_ID = 'DX-DX-FDX-JCB-1G-15天-4DX-ASJ-YTC-AT-2022123020221230144615'
 
 
 class WXTechController(View):
@@ -49,6 +60,10 @@ class WXTechController(View):
                 return response.json(token.code)
             if operation == 'getCardsInfo':
                 return self.get_cards_info(request_dict, response)
+            elif operation == 'getExperiencePackage':
+                return self.get_experience_package(request_dict, response)
+            elif operation == 'createOrder':
+                return self.create_order_package(request_dict, response)
 
         @classmethod
         def get_cards_info(cls, request_dict, response):
@@ -56,9 +71,9 @@ class WXTechController(View):
             五兴单卡获取信息
             """
             try:
+                LOGGER.info('*****WXTechController.get_cards_info:params:{}'.format(request_dict))
                 iccid = request_dict.get('iccid', None)
                 operator = int(request_dict.get('operator', 3))
-                LOGGER.info('*****WXTechController.get_cards_info:iccid:{},operator:{}'.format(iccid, operator))
                 if not iccid:
                     return response.json(444)
                 data = {'iccid': iccid, 'operator': operator}
@@ -68,3 +83,102 @@ class WXTechController(View):
                 LOGGER.info('*****WXTechController.get_cards_info:errLine:{}, errMsg:{}'
                             .format(e.__traceback__.tb_lineno, repr(e)))
                 return response.json(500, repr(e))
+
+        @classmethod
+        def get_experience_package(cls, request_dict, response):
+            """
+            获取体验套餐
+            """
+            try:
+                LOGGER.info('*****WXTechController.get_experience_package:params'.format(request_dict))
+                serial_no = request_dict.get('serial_no', None)
+                if not serial_no:
+                    return response.json(444)
+                # 查询是否注册iccid
+                unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
+                    .values('serial_no', 'user_id', 'iccid')
+                if not unicom_device_qs.exists():
+                    return response.json(173)
+                unicom_device_qs = unicom_device_qs.first()
+                iccid = unicom_device_qs['iccid']
+                # 查看是否体验过免费套餐
+                experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
+                if experience_history_qs.exists():
+                    return response.json(10062)
+                combo_info_qs = UnicomCombo.objects.filter(combo_type=1, status=0, is_del=False) \
+                    .values('combo_name')
+                if not combo_info_qs.exists():
+                    return response.json(0)
+                result = {'comboName': combo_info_qs[0]['combo_name']}
+                return response.json(0, result)
+            except Exception as e:
+                LOGGER.info('*****WXTechController.get_experience_package:errLine:{}, errMsg:{}'
+                            .format(e.__traceback__.tb_lineno, repr(e)))
+                return response.json(500, repr(e))
+
+        @classmethod
+        def create_order_package(cls, request_dict, response):
+            """
+            五兴电信领取1G15天流量体验包
+            """
+            try:
+                LOGGER.info('*****WXTechController.create_order_package:params:{}'.format(request_dict))
+                serial_no = request_dict.get('serial_no', None)
+                operator = request_dict.get('operator', None)
+                if not all([operator, serial_no]):
+                    return response.json(444)
+                unicom_device_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_no) \
+                    .values('serial_no', 'user_id', 'iccid')
+                if not unicom_device_qs.exists():
+                    return response.json(173)
+                unicom_device_qs = unicom_device_qs.first()
+                user_id = unicom_device_qs['user_id']
+                iccid = unicom_device_qs['iccid']
+                # 查看是否体验过免费套餐
+                experience_history_qs = UnicomComboExperienceHistory.objects.filter(iccid=iccid)
+                if experience_history_qs.exists():
+                    return response.json(10062)
+                data = {'iccid': iccid, 'operator': WXOperatorEnum(int(operator)).value,
+                        'startType': str(WXStartTypeEnum.EFFECTIVE_IMMEDIATELY.value), 'packageCode': COMBO_ID}
+                wx_tech = WXTechObject()
+                # 请求五兴API创建套餐接口
+                res = wx_tech.create_order_package(**data)
+                LOGGER.info('*****五兴创建体验套餐信息:{}'.format(res))
+                if res['code'] == '0':
+                    trade_no = res['data']['orderNumber']
+                    experience_history_vo = {'iccid': iccid, 'experience_type': 0, 'do_time': int(time.time())}
+                    UnicomComboExperienceHistory.objects.create(**experience_history_vo)
+                    order_res = cls.created_order(serial_no, user_id, trade_no)
+                    LOGGER.info('*****系统创建体验订单:{}'.format(order_res))
+                    return response.json(0)
+                return response.json(10063)
+            except Exception as e:
+                LOGGER.info('*****WXTechController.create_order_package:errLine:{}, errMsg:{}'
+                            .format(e.__traceback__.tb_lineno, repr(e)))
+                return response.json(500, repr(e))
+
+        @classmethod
+        def created_order(cls, serial_no, user_id, trade_no):
+            """
+            创建系统订单
+            """
+            combo_info_qs = UnicomCombo.objects.filter(combo_type=1, status=0, is_del=False) \
+                .values('id', 'combo_name', 'price', 'virtual_price', 'remark').order_by('sort')
+            if not combo_info_qs.exists():
+                return False
+            combo_info_vo = combo_info_qs[0]
+            n_time = int(time.time())
+            # 根据序列号获取UID
+            uid = CommonService.query_uid_with_serial(serial_no)
+            order_id = CommonService.createOrderID()
+            # 生成订单必须添加该字段
+            rank_id, ai_rank_id = UnicomComboView().get_cloud_or_ai_combo()
+            order_dict = {'orderID': order_id, 'UID': uid, 'rank_id': rank_id, 'ai_rank_id': ai_rank_id,
+                          'userID_id': user_id, 'desc': combo_info_vo['combo_name'], 'payType': 10,
+                          'payTime': n_time, 'price': combo_info_vo['price'], 'addTime': n_time,
+                          'updTime': n_time, 'status': 1,
+                          'unify_combo_id': str(combo_info_vo['id']), 'order_type': 3,
+                          'store_meal_name': combo_info_vo['combo_name'],
+                          'trade_no': trade_no}
+            Order_Model.objects.create(**order_dict)
+            return True

+ 20 - 0
Object/Enums/WXOperatorEnum.py

@@ -0,0 +1,20 @@
+# -*- encoding: utf-8 -*-
+"""
+五兴科技 运营商枚举类
+@File    : WXOperatorEnum.py
+@Time    : 2023/5/8 13:53
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from enum import IntEnum, unique
+
+
+@unique
+class WXOperatorEnum(IntEnum):
+    # 联通
+    UNICOM = 1,
+    # 移动
+    MOBILE = 2,
+    # 电信
+    TELECOM = 3

+ 20 - 0
Object/Enums/WXStartTypeEnum.py

@@ -0,0 +1,20 @@
+# -*- encoding: utf-8 -*-
+"""
+五兴科技 运营商枚举类
+@File    : WXOperatorEnum.py
+@Time    : 2023/5/8 13:53
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from enum import IntEnum, unique
+
+
+@unique
+class WXStartTypeEnum(IntEnum):
+    # 立即生效
+    EFFECTIVE_IMMEDIATELY = 0,
+    # 次月生效
+    EFFECTIVE_FOLLOWING_MONTH = 1,
+    # 顺延生效(仅流量包)【未激活的卡片必须先订购一个立即生效,才允许订购次月生效】
+    EXTEND = 2

+ 4 - 0
Object/ResponseObject.py

@@ -124,6 +124,8 @@ class ResponseObject(object):
             10059: 'Order deactivation failure',
             10060: 'This device has purchased foreign cloud storage package, so it cannot buy domestic cloud storage package',
             10061: 'Add the limit reached',
+            10062: 'This device has experienced the package',
+            10063: 'Failed to claim',
         }
         data_cn = {
             0: '成功',
@@ -238,6 +240,8 @@ class ResponseObject(object):
             10059: '订单停用失败',
             10060: '此设备已购买过国外云存套餐,无法购买国内云存套餐',
             10061: '添加已达到上限',
+            10062: '此设备已体验过套餐',
+            10063: '领取失败',
         }
 
         msg = data_cn if self.lang == 'cn' or self.lang == 'zh-Hans' or self.lang == 'zh-Hant' else data_en

+ 36 - 9
Object/WXTechObject.py

@@ -13,7 +13,7 @@ import time
 
 import requests
 
-from Ansjer.config import WX_TECH_URL, WX_TECH_APP_KEY, TWX_TECH_SECRET
+from Ansjer.config import WX_TECH_URL, WX_TECH_APP_KEY, TWX_TECH_SECRET, LOGGER
 from Object.UnicomObject import UnicomObjeect
 
 
@@ -38,26 +38,51 @@ class WXTechObject:
         """
         请求接口必传系统参数
         """
+        nonce = ''.join(str(random.choice(range(1, 10))) for _ in range(5))
         return {
             'appkey': WX_TECH_APP_KEY,
-            'nonce': int(''.join(str(random.choice(range(10))) for _ in range(5))),
+            'nonce': int(nonce),
             'timestamp': int(time.time()),
         }
 
-    def get_cards_info(self, **params):
+    @staticmethod
+    def get_request_params(**params):
         """
-        根据卡号,获取单卡信息及流量使用信息
-        @param params: iccid、operator
-        @return: 卡信息
+        将业务参数与系统参数合并后进行加签得到请求参数体
         """
-        url = WX_TECH_URL + '/api/v2/card/getCardsInfo'
-        # 系统参数
+        # 获取请求系统参数
         data = WXTechObject().get_system_params()
+        # 系统参数与业务参数合并
         params = dict(data, **params)
         # 合并参数后进行升序加密得到sign
         sign = WXTechObject.getSign(TWX_TECH_SECRET, **params)
         params['sign'] = sign
-        response = requests.post(url, data=json.dumps(params), headers=self.headers)
+        params = json.dumps(params)
+        LOGGER.info('*****五兴API请求数据:{}'.format(params))
+        return params
+
+    def get_cards_info(self, **params):
+        """
+        根据卡号,获取单卡信息及流量使用信息
+        @param params: iccid、operator
+        @return: 卡信息
+        """
+        url = WX_TECH_URL + '/api/v2/card/getCardsInfo'
+        rq_body = self.get_request_params(**params)
+        response = requests.post(url, data=rq_body, headers=self.headers)
+        assert response.status_code == 200
+        return UnicomObjeect().get_text_dict(response)
+
+    def create_order_package(self, **params):
+        """
+        卡片套餐订购,主套餐是立即生效,只有流量包可以顺延生效
+        @param params: iccid、operator、startType、packageCode
+        @return: 卡信息
+        """
+        url = WX_TECH_URL + '/api/v2/package/orderPackage'
+        rq_body = self.get_request_params(**params)
+        response = requests.post(url, data=rq_body, headers=self.headers)
+        assert response.status_code == 200
         return UnicomObjeect().get_text_dict(response)
 
 
@@ -65,3 +90,5 @@ if __name__ == '__main__':
     pass
     # data = {'iccid': '8986112128003439900', 'operator': 3}
     # print(WXTechObject().get_cards_info(**data))
+    # data = {'iccid': '8986112128003439900', 'operator': 3}
+    # print(WXTechObject().get_cards_info(**data))