ソースを参照

Merge branch 'test' of http://192.168.136.99:3000/servers/ASJServer

zhangdongming 3 年 前
コミット
a1c822f4df

+ 2 - 0
Controller/Cron/CronTaskController.py

@@ -76,6 +76,8 @@ class CronDelDataView(View):
             size = 10000
             # 删除7天前的数据
             sql = "DELETE FROM equipment_info WHERE eventTime<= %s LIMIT %s "
+            for i in range(6):
+                cursor.execute(sql, [expiration_time, size])
             if week_val == 1:
                 sql = "DELETE FROM equipment_info_sunday WHERE event_time<= %s LIMIT %s "
             if week_val == 2:

+ 83 - 79
Controller/IotCoreController.py

@@ -1,5 +1,6 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
+import logging
 import os
 import hashlib
 import json
@@ -78,85 +79,88 @@ class IotCoreView(View):
         if not all([token, time_stamp, device_version, language]):
             return response.json(444, {'param': 'token, uid_code, time_stamp, device_version, language'})
 
-        # 时间戳token校验
-        if not CommonService.check_time_stamp_token(token, time_stamp):
-            return response.json(13)
-
-        if not uid:
-            # 使用序列号
-            serial_number = request_dict.get('serial_number', None)
-            serial_number_code = request_dict.get('serial_number_code', None)
-            if not all([serial_number, serial_number_code]):
-                return response.json(444, {'param': 'serial_number, serial_number_code'})
-
-            # 序列号编码解码校验
-            serial_number_code = CommonService.decode_data(serial_number_code)
-            if serial_number != serial_number_code:
-                return response.json(404)
-
-            serial = serial_number[0:6]
-            try:
-                SerialNumberModel.objects.get(serial_number=serial)
-            except:
-                return response.json(444)
-
-            ThingNameSuffix = serial_number  # 物品名后缀
-            iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
-        else:
-            # 使用uid
-            # uid编码解码校验
-            uid_code = CommonService.decode_data(uid_code)
-            if uid != uid_code:
-                return response.json(404)
-
-            serial = ''     # iot_deviceInfo表写入serial_number为''
-            ThingNameSuffix = uid     # 物品名后缀
-            iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=uid)
-        # 判断设备是否已注册证书
-        if not iotdeviceInfo_qs.exists():
-            thingGroup = device_version + '_' + language
-            # 设备模拟国外环境测试
-            # if SERVER_TYPE == 'Ansjer.us_config.formal_settings':  # 国外正式配置使用固定ip进行测试
-            #     ip = '67.220.90.13'
-            # else:
-            #     ip = CommonService.get_ip_address(request)
-            ip = CommonService.get_ip_address(request)
-            region_id = Device_Region().get_device_region(ip)
-
-            iotClient = IOTClient(region_id)
-            res = iotClient.register_to_iot_core(ThingNameSuffix, thingGroup, response)
-            token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(int(time.time()))).encode('utf-8')).hexdigest()
-
-            iotdeviceInfoModel.objects.create(uid=uid,
-                                              serial_number=serial,
-                                              endpoint=res[0]['endpoint'],
-                                              certificate_id=res[0]['certificateId'],
-                                              certificate_pem=res[0]['certificatePem'],
-                                              public_key=res[0]['publicKey'],
-                                              private_key=res[0]['privateKey'],
-                                              thing_name=res[1]['ThingName'],
-                                              thing_groups=res[1]['thingGroupName'],
-                                              token_iot_number=token_iot_number
-                                              )
-            res = {
-                'certificateId': res[0]['certificateId'],
-                'certificatePem': res[0]['certificatePem'],
-                'publicKey': res[0]['publicKey'],
-                'privateKey': res[0]['privateKey'],
-                'endpoint': res[0]['endpoint']
-            }
-            return response.json(0, {'res': res})
-        else:
-            iot = iotdeviceInfo_qs[0]
-            res = {
-                'certificateId': iot.certificate_id,
-                'certificatePem': iot.certificate_pem,
-                'publicKey': iot.public_key,
-                'privateKey': iot.private_key,
-                'endpoint': iot.endpoint
-            }
-            # print('此设备已注册证书')
-            return response.json(0, {'res': res})
+        try:
+            # 时间戳token校验
+            if not CommonService.check_time_stamp_token(token, time_stamp):
+                return response.json(13)
+
+            if not uid:
+                # 使用序列号
+                serial_number = request_dict.get('serial_number', None)
+                serial_number_code = request_dict.get('serial_number_code', None)
+                if not all([serial_number, serial_number_code]):
+                    return response.json(444, {'param': 'serial_number, serial_number_code'})
+
+                # 序列号编码解码校验
+                serial_number_code = CommonService.decode_data(serial_number_code)
+                if serial_number != serial_number_code:
+                    return response.json(404)
+
+                serial = serial_number[0:6]
+                try:
+                    SerialNumberModel.objects.get(serial_number=serial)
+                except:
+                    return response.json(444)
+
+                ThingNameSuffix = serial_number  # 物品名后缀
+                iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=serial)
+            else:
+                # 使用uid
+                # uid编码解码校验
+                uid_code = CommonService.decode_data(uid_code)
+                if uid != uid_code:
+                    return response.json(404)
+
+                serial = ''     # iot_deviceInfo表写入serial_number为''
+                ThingNameSuffix = uid     # 物品名后缀
+                iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=uid)
+            # 判断设备是否已注册证书
+            if not iotdeviceInfo_qs.exists():
+                thingGroup = device_version + '_' + language
+                # 设备模拟国外环境测试
+                # if SERVER_TYPE == 'Ansjer.us_config.formal_settings':  # 国外正式配置使用固定ip进行测试
+                #     ip = '67.220.90.13'
+                # else:
+                #     ip = CommonService.get_ip_address(request)
+                ip = CommonService.get_ip_address(request)
+                region_id = Device_Region().get_device_region(ip)
+
+                iotClient = IOTClient(region_id)
+                res = iotClient.register_to_iot_core(ThingNameSuffix, thingGroup, response)
+                token_iot_number = hashlib.md5((str(uuid.uuid1()) + str(int(time.time()))).encode('utf-8')).hexdigest()
+
+                iotdeviceInfoModel.objects.create(uid=uid,
+                                                  serial_number=serial,
+                                                  endpoint=res[0]['endpoint'],
+                                                  certificate_id=res[0]['certificateId'],
+                                                  certificate_pem=res[0]['certificatePem'],
+                                                  public_key=res[0]['publicKey'],
+                                                  private_key=res[0]['privateKey'],
+                                                  thing_name=res[1]['ThingName'],
+                                                  thing_groups=res[1]['thingGroupName'],
+                                                  token_iot_number=token_iot_number
+                                                  )
+                res = {
+                    'certificateId': res[0]['certificateId'],
+                    'certificatePem': res[0]['certificatePem'],
+                    'publicKey': res[0]['publicKey'],
+                    'privateKey': res[0]['privateKey'],
+                    'endpoint': res[0]['endpoint']
+                }
+                return response.json(0, {'res': res})
+            else:
+                iot = iotdeviceInfo_qs[0]
+                res = {
+                    'certificateId': iot.certificate_id,
+                    'certificatePem': iot.certificate_pem,
+                    'publicKey': iot.public_key,
+                    'privateKey': iot.private_key,
+                    'endpoint': iot.endpoint
+                }
+                return response.json(0, {'res': res})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
 
     def thing_regroup(self, request_dict, response, request):
         # 物品重新分组

+ 47 - 8
Controller/PaymentCycle.py

@@ -142,8 +142,8 @@ class PaypalCycleNotify(View):
             return self.do_paypal_cycle_return(request_dict, response)
         elif operation == 'paypalCycleNotify':  # paypal 周期付款回调
             return self.do_paypal_webhook_notify(request_dict,request, response)
-        elif operation == 'test':  # paypal 周期付款回调
-            return self.do_test(request_dict,request, response)
+        elif operation == 'subscriptionNotify':               # paypal 订阅相关回调
+            return self.do_subscription_notify(request_dict,request, response)
     def do_paypal_cycle_return(self, request_dict, response):
         lang = request_dict.get('lang', 'en')
         token = request_dict.get('token',None)
@@ -472,20 +472,59 @@ class PaypalCycleNotify(View):
         return HttpResponse('fail')
 
 
-    def do_test(self, request_dict, request, response):
+    def do_subscription_notify(self, request_dict, request, response):
         logger = logging.getLogger('info')
-        logger.info('---into---webhook_notify--------')
-        logger.info('---request_dict-------')
-        logger.info(request_dict)
+        logger.info('---into---do_subscription_notify-------')
         json_agreement_str = request.body.decode("utf-8")
         json_obj = json.loads(json_agreement_str)
         header = request.META
         paypal_body = json_obj.get('resource')
-        logger.info('-----paypal_body------')
+        logger.info('-----subscription_body------')
         logger.info(paypal_body)
-        logger.info('-----paypal_header------')
+        logger.info('-----subscription_header------')
         logger.info(header)
 
+        billing_agreement_id = paypal_body.get('billing_agreement_id')
+        paypal_transaction_id = paypal_body.get('id')
+        amount = paypal_body.get('amount')
+        # if not billing_agreement_id:
+        #     #普通支付,更新paypal交易id
+        #     paymentID = paypal_body.get('parent_payment')
+        #     if paymentID and paypal_transaction_id:
+        #         Order_Model.objects.filter(paymentID=paymentID).update(
+        #             updTime=int(time.time()),
+        #             trade_no=paypal_transaction_id
+        #         )
+        #     return HttpResponse('success')
+
+        transmission_id = header.get('HTTP_PAYPAL_TRANSMISSION_ID',None)
+        transmission_time = header.get('HTTP_PAYPAL_TRANSMISSION_TIME',None)
+        cert_url = header.get('HTTP_PAYPAL_CERT_URL',None)
+        transmission_sig = header.get('HTTP_PAYPAL_TRANSMISSION_SIG',None)
+        auth_algo = header.get('HTTP_PAYPAL_AUTH_ALGO',None)
+        resource_type = json_obj.get('resource_type')
+
+        logger.info(resource_type)
+        logger.info(paypal_body.get('state'))
+
+        # self.get_plan_desc('P-4CG284532S612303METMEINY')
+        if resource_type == 'sale' and paypal_body.get('state') == 'completed':
+            paypalrestsdk.configure(PAYPAL_CRD)
+            response = paypalrestsdk.WebhookEvent.verify(
+                transmission_id, transmission_time, PAYPAL_WEB_HOOK_ID, json_agreement_str, cert_url, transmission_sig, auth_algo)
+            logger.info('-----------------------verify')
+            logger.info(response)
+            if response:
+                try:
+                    agreement_id = paypal_body.get('billing_agreement_id')
+                    billing_agreement = paypalrestsdk.BillingAgreement.find(agreement_id)
+
+                    logger.info('-----------------------billing_agreement')
+                    logger.info(billing_agreement)
+                except:
+                    return HttpResponse('not billing_agreement')
+
+
 
     def get_plan_desc(self,plan_id):
         paypalrestsdk.configure(PAYPAL_CRD)

+ 4 - 20
Object/IOTCore/IotObject.py

@@ -1,7 +1,6 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 import json
-from abc import ABCMeta,abstractmethod
 
 import boto3
 
@@ -11,21 +10,8 @@ from Ansjer.config import AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_CH
     AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
 
-class IOTObject(metaclass=ABCMeta):
-
-    @abstractmethod
-    def create_provisioning_claim(self, templateName):
-        pass
-
-    @abstractmethod
-    def create_keys_and_certificate(self, uid):
-        pass
-
-
-class IOTClient(IOTObject):
-
+class IOTClient:
     def __init__(self, region_id=1):
-
         if region_id == 1:
             # 中国宁夏
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_CHINA_REGION,
@@ -35,7 +21,7 @@ class IOTClient(IOTObject):
             self.endpoint = 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
             self.iotrole = AWS_IOT_SES_ACCESS_CHINA_ROLE
 
-        if region_id == 2:
+        elif region_id == 2:
             # 亚太新加坡
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
@@ -43,7 +29,7 @@ class IOTClient(IOTObject):
             self.endpoint = 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
-        if region_id == 3:
+        elif region_id == 3:
             # 美东弗吉尼亚
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
@@ -51,7 +37,7 @@ class IOTClient(IOTObject):
             self.endpoint = 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
-        if region_id == 4:
+        elif region_id == 4:
             # 西欧爱尔兰
             self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE,
                                        aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
@@ -59,8 +45,6 @@ class IOTClient(IOTObject):
             self.endpoint = 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
             self.iotrole = AWS_IOT_SES_ACCESS_FOREIGN_ROLE
 
-
-
     def create_provisioning_claim(self, templateName):
 
         result = self.client.create_provisioning_claim(templateName=templateName)