peng 1 anno fa
parent
commit
89577db6a9

+ 1 - 0
Ansjer/urls.py

@@ -408,6 +408,7 @@ urlpatterns = [
     re_path(r'^cron/update/(?P<operation>.*)', CronTaskController.CronUpdateDataView.as_view()),
     # 定时收集数据任务接口
     re_path(r'^cron/collect/(?P<operation>.*)', CronTaskController.CronCollectDataView.as_view()),
+    re_path(r'^cron/compared/(?P<operation>.*)', CronTaskController.CronComparedDataView.as_view()),
 
     # 国内域名备案网站/错误路径
     re_path('(?P<path>.*)', LogManager.errorPath),

+ 81 - 2
Controller/Cron/CronTaskController.py

@@ -17,15 +17,16 @@ from django.db.models import Q, Sum, Count
 from django.views import View
 
 from Ansjer.config import USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST, CONFIG_INFO, CONFIG_US, \
-    RESET_REGION_ID_SERIAL_REDIS_LIST, LOGGER
+    RESET_REGION_ID_SERIAL_REDIS_LIST, LOGGER, PAYPAL_CRD
 from Model.models import Device_User, Device_Info, UidSetModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
     VodHlsModel, ExperienceContextModel, AiService, VodHlsSummary, VideoPlaybackTimeModel, DeviceUserSummary, \
     CountryModel, DeviceTypeModel, OrdersSummary, DeviceInfoSummary, CompanySerialModel, \
     CloudLogModel, UidCloudStorageCount, UserExModel, DeviceDomainRegionModel, VodHlsTag, VodHlsTagType, \
-    Store_Meal, Lang, VodBucketModel, UnicomComboOrderInfo, UnicomDeviceInfo
+    Store_Meal, Lang, VodBucketModel, UnicomComboOrderInfo, UnicomDeviceInfo, AbnormalOrder
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.utils import LocalDateTimeUtil
+from Object.utils.PayPalUtil import PayPalService
 from Service.CommonService import CommonService
 from Service.VodHlsService import SplitVodHlsObject
 from Object.UnicomObject import UnicomObjeect
@@ -1156,3 +1157,81 @@ class CronCollectDataView(View):
                             redis_obj.set_hash_data(key, redis_dict)
         except Exception as e:
             LOGGER.info('统计联通流量失败,时间为:{}'.format(int(time.time())))
+
+
+class CronComparedDataView(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 validation(self, request_dict, request, operation):
+        response = ResponseObject()
+        if operation == 'PaypalOrder':  # 定时对比paypal订单
+            return self.compared_paypal_order(response)
+        else:
+            return response.json(404)
+
+    @staticmethod
+    def compared_paypal_order(response):
+        today = datetime.datetime.today()
+        start_date = today - datetime.timedelta(days=2)
+        start_date = datetime.datetime(start_date.year, start_date.month, start_date.day)
+        end_date = start_date + datetime.timedelta(days=1)
+        end_date_stamp = int(end_date.timestamp())
+        try:
+            data = (
+                ('start_date', '{}-{}-{}T08:00:00-0800'.format(start_date.year, start_date.month, start_date.day)),
+                ('end_date', '{}-{}-{}T08:00:00-0800'.format(end_date.year, end_date.month, end_date.day)),
+                ('fields', 'all'),
+                ('page_size', '500'),
+                ('page', '1'),
+            )
+            order_list = PayPalService(PAYPAL_CRD['client_id'], PAYPAL_CRD['client_secret']).get_transactions(data)
+            thread = threading.Thread(target=CronComparedDataView.thread_compared_order,
+                                      args=(order_list['transaction_details'], end_date_stamp))
+            thread.start()
+            return response.json(0)
+        except Exception as e:
+            LOGGER.info('CronComparedDataView.compared_paypal_order, errLine:{}, errMsg:{}'.format(
+                e.__traceback__.tb_lineno, repr(e)))
+            return response.json(500)
+
+    @staticmethod
+    def thread_compared_order(order_list, timestamp):
+        for item in order_list:
+            trade_no = item['transaction_info']['transaction_id']
+            order_qs = Order_Model.objects.filter(trade_no=trade_no, payType=1)
+            if not order_qs.exists():
+                order_id = item['transaction_info'].get('transaction_subject', '')
+                agreement_id = item['transaction_info'].get('paypal_reference_id', '')
+                pay_time = datetime.datetime.strptime(item['transaction_info']['transaction_initiation_date'],
+                                                      "%Y-%m-%dT%H:%M:%S%z").timestamp()
+                order_dict = {
+                    'trade_no': trade_no,
+                    'agreement_id': agreement_id,
+                    'order_id': order_id,
+                    'pay_time': pay_time,
+                    'username': item['payer_info']['email_address'],
+                    'price': item['transaction_info']['transaction_amount']['value'],
+                    'pay_type': 1,
+                    'add_time': timestamp,
+                    'status': 0
+                }
+                if order_id and agreement_id:
+                    order_dict['pay_type'] = 0
+                params = {'trade_no': trade_no}
+                response = requests.get('https://www.zositeche.com/testApi/checkOrderExist', params=params)
+                if response.status_code != 200:
+                    # 如果响应失败,记录记录在数据库
+                    AbnormalOrder.objects.create(**order_dict)
+                    continue
+                result = response.json()
+                if result['result_code'] != 0 or not result['result']['is_exist']:
+                    # 如果响应结果为空,记录在数据库
+                    AbnormalOrder.objects.create(**order_dict)

+ 18 - 0
Model/models.py

@@ -3697,3 +3697,21 @@ class SerialNumberPackage(models.Model):
         db_table = 'd_serial_number_package'
         verbose_name = '设备序列号关联套餐id表'
         verbose_name_plural = verbose_name
+
+
+class AbnormalOrder(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    order_id = models.CharField(max_length=30, db_index=True, verbose_name='订单ID', blank=True, default='')
+    trade_no = models.CharField(blank=True, max_length=32, default='', verbose_name='第三方订单号')
+    agreement_id = models.CharField(default='', blank=True, max_length=64, verbose_name=u'paypal协议id')
+    # 0: PayPal自动续费, 1: PayPal普通支付, 2: 支付宝, 3: 微信
+    pay_type = models.SmallIntegerField(default=0, verbose_name='支付方式')
+    price = models.CharField(default='', max_length=16, verbose_name='价格')
+    username = models.CharField(default='', max_length=30, verbose_name='用户名')
+    pay_time = models.IntegerField(verbose_name='支付成功时间', default=0)
+    add_time = models.IntegerField(verbose_name='添加时间', default=0)
+    status = models.SmallIntegerField(default=0, verbose_name='处理结果')  # 0:未处理,1:已处理
+
+    class Meta:
+        db_table = 'abnormal_order'
+        verbose_name = '异常订单表'

+ 30 - 0
Object/ApschedulerObject.py

@@ -0,0 +1,30 @@
+import time
+from apscheduler.schedulers.background import BackgroundScheduler
+from django_apscheduler.jobstores import DjangoJobStore
+from Ansjer.config import LOGGER
+from django_apscheduler.models import DjangoJob
+import datetime
+
+
+class ApschedulerObject:
+    def __init__(self):
+        self.scheduler = BackgroundScheduler()
+        self.scheduler.add_jobstore(DjangoJobStore(), 'default')
+        self.scheduler.start()
+
+    @staticmethod
+    def auto_hello():  # 任务
+        now_time = time.time()
+        print('hello world:[{}]'.format(now_time))
+
+    def cron_job(self, task_id, day_of_week, hour, minute):  # 周期任务
+        self.scheduler.add_job(self.auto_hello, 'cron', day_of_week=day_of_week, hour=hour, minute=minute,
+                               replace_existing=True, id=task_id, max_instances=1, coalesce=True)
+
+    def date_job(self, task_id, time_stamp):  # 时间点任务
+        self.scheduler.add_job(self.auto_hello, 'date', run_date=datetime.datetime.fromtimestamp(time_stamp),
+                               replace_existing=True, id=task_id, max_instances=1, coalesce=True)
+
+    @staticmethod
+    def del_job(task_id):  # 删除任务
+        DjangoJob.objects.filter(id=task_id).delete()

+ 63 - 0
Object/utils/PayPalUtil.py

@@ -0,0 +1,63 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : PayPalUtil.py
+@Time    : 2022/9/1 14:41
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+
+import requests
+
+
+class PayPalService:
+    API_BASE_URL = 'https://api-m.paypal.com'
+    CONTENT_TYPE = 'application/json'
+
+    def __init__(self, client_id, client_secret):
+        self.auth = client_id, client_secret
+        self.headers = {
+            'Content-Type': self.CONTENT_TYPE,
+        }
+        self.access_token = self._fetch_access_token()
+
+    def _fetch_access_token(self):
+        data = {'grant_type': 'client_credentials'}
+        url = f'{self.API_BASE_URL}/v1/oauth2/token'
+
+        response = requests.post(url, data=data, headers=self.headers, auth=self.auth)
+        assert response.status_code == 200
+        return response.json()['access_token']
+
+    def _get_headers(self):
+        headers = {
+            'Authorization': 'Bearer ' + self.access_token,
+            'Content-Type': self.CONTENT_TYPE,
+        }
+        return headers
+
+    def get_transactions(self, params):
+        """
+        交易历史搜索
+        api:https://developer.paypal.com/docs/api/transaction-search/v1/
+        @return: 交易历史列表
+        """
+        headers = self._get_headers()
+        response = requests.get(f'{self.API_BASE_URL}/v1/reporting/transactions', headers=headers,
+                                params=params)
+        # 解析响应
+        assert response.status_code == 200
+        return response.json()
+
+
+if __name__ == '__main__':
+    pass
+    # params = (
+    #     ('start_date', '2023-09-15T00:00:00-0800'),
+    #     ('end_date', '2023-09-15T23:59:59-0800'),
+    #     ('fields', 'all'),
+    #     ('page_size', '20'),
+    #     ('page', '1'),
+    # )
+    # trans_res = PayPalService().get_transactions(params)
+    # print(trans_res)