Răsfoiți Sursa

新增五兴套餐订购功能

zhangdongming 2 ani în urmă
părinte
comite
4255c8b580

+ 15 - 5
Ansjer/config.py

@@ -4,6 +4,10 @@
 
 import os
 import datetime
+import logging
+
+# 日志配置
+LOGGER = logging.getLogger('info')
 
 # 配置信息
 CONFIG_TEST = 'test'
@@ -75,13 +79,12 @@ OSS_STS_ACCESS_SECRET = '71uIjpsqVOmF7DAITRyRuc259jHOjO'
 OSS_ROLE_ARN = 'acs:ram::1901342792446414:role/stsoss'
 
 # aws api key
-AWS_ACCESS_KEY_ID = ['AKIA2MMWBR4DSFG67DTG', 'AKIA2E67UIMD45Y3HL53']  #0国内, 1国外
+AWS_ACCESS_KEY_ID = ['AKIA2MMWBR4DSFG67DTG', 'AKIA2E67UIMD45Y3HL53']  # 0国内, 1国外
 AWS_SECRET_ACCESS_KEY = ['aI9gxcAKPmiGgPy9axrtFKzjYGbvpuytEX4xWweL', 'ckYLg4Lo9ZXJIcJEAKkzf2rWvs8Xth1FCjqiAqUw']
 AWS_ARN = ['arn:aws-cn:s3', 'arn:aws:s3']
 
-
 # 尚云服务器CRCKey
-CRCKey = {'AUS': 'CRCKey', 'ACN': 'CRCKey'}   # {平台名:CRCKey值}
+CRCKey = {'AUS': 'CRCKey', 'ACN': 'CRCKey'}  # {平台名:CRCKey值}
 
 # 各个服务器域名
 SERVER_DOMAIN_US = 'http://www.dvema.com/'
@@ -410,7 +413,7 @@ APNS_CONFIG = {
     'com.ansjer.accloud': {
         'pem_path': 'AnsjerPush/file/apns_pem/accloud-dev.pem',
     },
-    'com.ansjer.customizedc':{
+    'com.ansjer.customizedc': {
         'pem_path': 'AnsjerPush/file/apns_pem/customizedc.pem',
     },
     'com.ansjer.customizede': {
@@ -468,4 +471,11 @@ unicomUserName = 'zh-zhasjdz'
 # 登录密码,如无请联系客户经理
 unicomPassword = 'XoROL1vCl5@_'
 # 回调签名验证加密密匙,请向开发人员索取
-unicomPushKey = 'NVVDQMBSOJTXA'
+unicomPushKey = 'NVVDQMBSOJTXA'
+
+# 五兴域名
+WX_TECH_URL = 'http://www.wxkjwlw.com'
+# 五兴接口APP KEY
+WX_TECH_APP_KEY = 'PHNSIzLG9Ciyla3aiOuBuN17U0qk5mM4'
+# 五兴接口密钥
+TWX_TECH_SECRET = '9477ace7e28f4d3fabae63a786d53d81'

+ 2 - 0
Ansjer/server_urls/unicom_url.py

@@ -10,10 +10,12 @@ from django.urls import re_path
 
 from Controller.UnicomCombo import UnicomComboController, UnicomComboPayNotifyController, UnicomComboTaskController
 from AdminController import UnicomManageController
+from Controller.UnicomCombo.WXTechController import WXTechController
 
 urlpatterns = [
     re_path(r'^api/(?P<operation>.*)$', UnicomComboController.UnicomComboView.as_view()),
     re_path(r'^wap/pay/(?P<operation>.*)$', UnicomComboPayNotifyController.UnicomComboPayNotifyView.as_view()),
     re_path(r'^combo/cron/(?P<operation>.*)$', UnicomComboTaskController.UnicomComboTaskView.as_view()),
     re_path(r'^manage/(?P<operation>.*)$',UnicomManageController.UnicomManageControllerView.as_view()),
+    re_path(r'^open/wxtech/(?P<operation>.*)$', WXTechController.SmartSocketView.as_view()),
 ]

+ 213 - 0
Controller/UnicomCombo/WXTechController.py

@@ -0,0 +1,213 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : WXTechController.py
+@Time    : 2023/5/6 16:40
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+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.WXTechObject import WXTechObject
+from Service.CommonService import CommonService
+
+# 五兴科技电信套餐编码 1G-15天流量包
+COMBO_ID = 'DX-DX-FDX-JCB-1G-15天-4DX-ASJ-YTC-AT-2022123020221230144615'
+
+
+class WXTechController(View):
+    class SmartSocketView(View):
+        def get(self, request, *args, **kwargs):
+            request.encoding = 'utf-8'
+            operation = kwargs.get('operation')
+            return self.validation(request.GET, request, operation)
+
+        def post(self, request, *args, **kwargs):
+            request.encoding = 'utf-8'
+            operation = kwargs.get('operation')
+            return self.validation(request.POST, request, operation)
+
+        def delete(self, request, *args, **kwargs):
+            request.encoding = 'utf-8'
+            operation = kwargs.get('operation')
+            delete = QueryDict(request.body)
+            if not delete:
+                delete = request.GET
+            return self.validation(delete, request, operation)
+
+        def put(self, request, *args, **kwargs):
+            request.encoding = 'utf-8'
+            operation = kwargs.get('operation')
+            put = QueryDict(request.body)
+            return self.validation(put, request, operation)
+
+        def validation(self, request_dict, request, operation):
+            if operation == 'deleteCardPackage':
+                return self.delete_card_package(request_dict, ResponseObject('cn'))
+            token_code, user_id, response = CommonService \
+                .verify_token_get_user_id(request_dict, request)
+            if token_code != 0:
+                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):
+            """
+            五兴单卡获取信息
+            """
+            try:
+                LOGGER.info('*****WXTechController.get_cards_info:params:{}'.format(request_dict))
+                iccid = request_dict.get('iccid', None)
+                operator = int(request_dict.get('operator', 3))
+                if not iccid:
+                    return response.json(444)
+                data = {'iccid': iccid, 'operator': operator}
+                wx_tech = WXTechObject()
+                return response.json(0, wx_tech.get_cards_info(**data))
+            except Exception as e:
+                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('serialNo', 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(173)
+                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('serialNo', 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
+
+        @classmethod
+        def delete_card_package(cls, request_dict, response):
+            """
+            PC工具清空卡片的所有套餐订购记录
+            """
+            try:
+                LOGGER.info('*****WXTechController.delete_card_package:params:{}'.format(request_dict))
+                sign = request_dict.get('sign', None)
+                serial_no = request_dict.get('serialNo', None)
+                time_stamp = request_dict.get('timeStamp', None)
+                if not CommonService.check_time_stamp_token(sign, time_stamp):
+                    return response.json(13)
+                    # 查询是否注册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)
+                iccid = unicom_device_qs[0]['iccid']
+                data = {'iccids': iccid, 'operator': WXOperatorEnum.TELECOM.value}
+                wx_tech = WXTechObject()
+                res = wx_tech.delete_card_package(**data)
+                if res['code'] == '0':
+                    UnicomComboExperienceHistory.objects.filter(iccid=iccid).delete()
+                    return response.json(0)
+                return response.json(177)
+            except Exception as e:
+                LOGGER.info('*****WXTechController.delete_card_package:errLine:{}, errMsg:{}'
+                            .format(e.__traceback__.tb_lineno, repr(e)))
+                return response.json(500, repr(e))

+ 45 - 0
Object/Enums/DeviceTypeEnum.py

@@ -0,0 +1,45 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : MessageTypeEnum.py
+@Time    : 2023/2/13 15:50
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from enum import IntEnum, unique
+
+
+@unique
+class DeviceTypeEnum(IntEnum):
+
+    ASJ_DEVICE_TYPE_DVR = 1  # DVR
+    ASJ_DEVICE_TYPE_NVR = 2  # NVR
+    ASJ_DEVICE_TYPE_POE_NVR = 3  # POE NVR
+    ASJ_DEVICE_TYPE_WIRELESS_NVR = 4  # 无线 NVR
+    ASJ_DEVICE_TYPE_POE_IPC = 5  # POE IPC
+    ASJ_DEVICE_TYPE_BOLT_IPC = 6  # bolt ipc
+    ASJ_DEVICE_TYPE_IPC = 7  # IPC
+    ASJ_DEVICE_TYPE_KAPIANJI = 8  # 客户使用
+    ASJ_DEVICE_TYPE_FISHEYE = 9  # 客户使用
+    ASJ_DEVICE_TYPE_PTZ_IPC = 10  # PTZ IPC
+    ASJ_DEVICE_TYPE_C611 = 11  # 智能摄像机 C611
+    ASJ_DEVICE_TYPE_C612 = 12  # 智能摄像机 C612
+    ASJ_DEVICE_TYPE_C199 = 13  # 智能摄像机 C199
+    ASJ_DEVICE_TYPE_C190 = 14  # 智能摄像机 C190
+    ASJ_DEVICE_TYPE_C199PRO = 15  # 智能摄像机 C199Pro
+    ASJ_DEVICE_TYPE_C115 = 16  # 智能摄像机 C115
+    ASJ_DEVICE_TYPE_C289 = 17  # 智能摄像机 C289
+    ASJ_DEVICE_TYPE_C308 = 18  # 智能摄像机 C308
+    ASJ_DEVICE_TYPE_C513 = 20  # 智能摄像机 C513
+    ASJ_DEVICE_TYPE_C308_5M = 21  # 智能摄像机 C308_5M
+    ASJ_DEVICE_TYPE_C190Pro = 22  # 智能摄像机 C190Pro
+    ASJ_DEVICE_TYPE_C287 = 23  # 智能摄像机 C287
+    ASJ_DEVICE_TYPE_C516 = 24  # 智能摄像机 C516
+    ASJ_DEVICE_TYPE_C188 = 25  # 智能摄像机 C188
+    ASJ_DEVICE_TYPE_C2894G = 26  # 智能摄像机 C289 带4G网络
+    ASJ_DEVICE_TYPE_C296 = 27  # 智能摄像机 C296
+    ASJ_DEVICE_TYPE_C183 = 28  # 智能摄像机 C183
+    ASJ_DEVICE_TYPE_C518 = 29  # 智能摄像机 C518
+    ASJ_DEVICE_TYPE_C290 = 30  # 智能摄像机 C290
+    ASJ_DEVICE_TYPE_C182 = 31  # 智能摄像机 C182
+    ASJ_DEVICE_TYPE_C225 = 32  # 智能摄像机 C225

+ 31 - 0
Object/Enums/MessageTypeEnum.py

@@ -0,0 +1,31 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : MessageTypeEnum.py
+@Time    : 2023/2/13 15:50
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from enum import IntEnum, unique
+
+
+@unique
+class MessageTypeEnum(IntEnum):
+    AI_HUMAN_SHAPE = 1  # ai人形
+    AI_CAT = 2  # ai车型
+    AI_PET = 3  # ai宠物
+    AI_PARCEL = 4  # ai包裹
+    MOTION_DETECTION = 51  # 移动侦测
+    SENSOR_ALARM = 52  # 传感器报警
+    IMAGE_LOSS = 53  # 影像遗失
+    PIR = 54  # PIR
+    DOOR_MAGNETIC_ALARM = 55  # 门磁报警
+    EXTERNAL_TRANSMISSION = 56  # 外部发报
+    HUMAN_SHAPE = 57  # 人形报警
+    CAT = 58  # 车型
+    PET = 59  # 宠物
+    FACE = 60  # 人脸
+    ABNORMAL_SOUND = 61  # 异响
+    CAMERA_SLEEP = 702  # 摄像头休眠
+    CAMERA_WAKE_UP = 703  # 摄像头唤醒
+    LOW_BATTERY = 704  # 电量过低

+ 24 - 0
Object/Enums/OrderEnum.py

@@ -0,0 +1,24 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : OrderEnum.py
+@Time    : 2023/2/7 9:09
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+from enum import IntEnum, unique
+
+
+@unique
+class OrderTypeEnum(IntEnum):
+    WAIT = 0  # 待支付
+    SUCCESS = 1  # 支付成功
+    CANCEL = 2  # 取消支付
+    REFUND_FAIL = 4  # 退款失败
+    REFUND = 5  # 全额退款
+    REBATES = 6  # 部分退款
+    PAYPAL_REFUND = 7  # PayPal已退款
+    BEING_PROCESSED = 9  # 处理中
+    FAIL = 10  # 支付失败
+
+

+ 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

+ 7 - 0
Object/ResponseObject.py

@@ -1,5 +1,6 @@
 from django.shortcuts import HttpResponse
 import simplejson as json
+from django.shortcuts import HttpResponse
 
 
 class ResponseObject(object):
@@ -123,6 +124,9 @@ class ResponseObject(object):
             10058: 'Default family cannot be deleted',
             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: '成功',
@@ -236,6 +240,9 @@ class ResponseObject(object):
             10058: '默认家庭不能删除',
             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

+ 109 - 0
Object/WXTechObject.py

@@ -0,0 +1,109 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : WXTechObject.py
+@Time    : 2023/5/6 15:28
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+import hashlib
+import json
+import random
+import time
+
+import requests
+
+from Ansjer.config import WX_TECH_URL, WX_TECH_APP_KEY, TWX_TECH_SECRET, LOGGER
+from Object.UnicomObject import UnicomObjeect
+
+
+class WXTechObject:
+    def __init__(self):
+        self.headers = {'content-type': 'application/json;charset=utf-8'}
+
+    @staticmethod
+    def getSign(secret, **data):
+        dict_2 = dict(sorted(data.items(), key=lambda item: item[0], reverse=False))
+        data_list = []
+        for item in dict_2.items():
+            if item[0] and item[1]:
+                data_list.append("{}={}".format(item[0], item[1]))
+        sign_param = '&'.join(data_list)
+        push_key = '&secret={}'.format(secret)
+        param = sign_param + push_key
+        return hashlib.sha1(param.encode("utf-8")).hexdigest().upper()
+
+    @staticmethod
+    def get_system_params():
+        """
+        请求接口必传系统参数
+        """
+        nonce = ''.join(str(random.choice(range(1, 10))) for _ in range(5))
+        return {
+            'appkey': WX_TECH_APP_KEY,
+            'nonce': int(nonce),
+            'timestamp': int(time.time()),
+        }
+
+    @staticmethod
+    def get_request_params(**params):
+        """
+        将业务参数与系统参数合并后进行加签得到请求参数体
+        """
+        # 获取请求系统参数
+        data = WXTechObject().get_system_params()
+        # 系统参数与业务参数合并
+        params = dict(data, **params)
+        # 合并参数后进行升序加密得到sign
+        sign = WXTechObject.getSign(TWX_TECH_SECRET, **params)
+        params['sign'] = sign
+        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'
+        return self.wx_service_api(url, **params)
+
+    def create_order_package(self, **params):
+        """
+        卡片套餐订购,主套餐是立即生效,只有流量包可以顺延生效
+        @param params: iccid、operator、startType、packageCode
+        @return: 卡信息
+        """
+        url = WX_TECH_URL + '/api/v2/package/orderPackage'
+        return self.wx_service_api(url, **params)
+
+    def delete_card_package(self, **params):
+        """
+        清空卡片的所有套餐订购记录
+        @param params: operator、iccids
+        @return: 删除成功|失败
+        """
+        url = WX_TECH_URL + '/api/v2/outputApi/deleteCardPackage'
+        return self.wx_service_api(url, **params)
+
+    def wx_service_api(self, url, **params):
+        """
+        @param url 请求地址
+        @param 业务必填参数
+        五兴业务API 统一封装加签请求
+        """
+        # 系统参数合并业务参数并加签得到请求参数
+        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)
+
+
+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))