Explorar o código

微信每日对账

peng hai 1 ano
pai
achega
04f10d19db

+ 15 - 11
AdminController/ServeManagementController.py

@@ -857,20 +857,24 @@ class serveManagement(View):
         if not abnormal_order.exists():
             return response.json(173)
         try:
-            abnormal_order_qs = abnormal_order.values('trade_no', 'pay_time')
+            abnormal_order_qs = abnormal_order.values('trade_no', 'pay_time', 'pay_type')
             trade_no = abnormal_order_qs[0]['trade_no']
             pay_time = abnormal_order_qs[0]['pay_time']
-            order_qs = Order_Model.objects.filter(trade_no=trade_no)
-            if order_qs.exists():
-                order_qs.update(payTime=pay_time)
-                abnormal_order.update(status=1)
-                return response.json(0)
-            params = {'trade_no': trade_no, 'pay_time': pay_time}
-            eur_response = requests.get('https://www.zositeche.com/testApi/checkOrderExist', params=params)
-            if eur_response.status_code == 200:
-                result = eur_response.json()
-                if result['result_code'] == 0 and result['result']['is_exist']:
+            pay_type = abnormal_order_qs[0]['pay_type']
+            if pay_type in [0, 1]:  # 处理paypal订单
+                order_qs = Order_Model.objects.filter(trade_no=trade_no)
+                if order_qs.exists():
+                    order_qs.update(payTime=pay_time)
                     abnormal_order.update(status=1)
+                    return response.json(0)
+                params = {'trade_no': trade_no, 'pay_time': pay_time}
+                eur_response = requests.get('https://www.zositeche.com/testApi/checkOrderExist', params=params)
+                if eur_response.status_code == 200:
+                    result = eur_response.json()
+                    if result['result_code'] == 0 and result['result']['is_exist']:
+                        abnormal_order.update(status=1)
+            elif pay_type == 3:  # 处理微信订单
+                pass
             return response.json(0)
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 46 - 5
Controller/Cron/CronTaskController.py

@@ -30,6 +30,7 @@ from Object.utils.PayPalUtil import PayPalService
 from Service.CommonService import CommonService
 from Service.VodHlsService import SplitVodHlsObject
 from Object.UnicomObject import UnicomObjeect
+from Object.WechatPayObject import WechatPayObject
 
 
 class CronDelDataView(View):
@@ -1215,6 +1216,8 @@ class CronComparedDataView(View):
         response = ResponseObject()
         if operation == 'PaypalOrder':  # 定时对比paypal订单
             return self.compared_paypal_order(response)
+        elif operation == 'WechatOrder':  # 定时对比微信订单
+            return self.compared_wechat_order(response)
         else:
             return response.json(404)
 
@@ -1234,7 +1237,7 @@ class CronComparedDataView(View):
                 ('transaction_status', 'S')
             )
             order_list = PayPalService(PAYPAL_CRD['client_id'], PAYPAL_CRD['client_secret']).get_transactions(data)
-            thread = threading.Thread(target=CronComparedDataView.thread_compared_order,
+            thread = threading.Thread(target=CronComparedDataView.thread_compared_pyapal_order,
                                       args=(order_list['transaction_details'],))
             thread.start()
             return response.json(0)
@@ -1244,7 +1247,7 @@ class CronComparedDataView(View):
             return response.json(500)
 
     @staticmethod
-    def thread_compared_order(order_list):
+    def thread_compared_pyapal_order(order_list):
         now_time = int(time.time())
         for item in order_list:
             trade_no = item['transaction_info']['transaction_id']
@@ -1252,7 +1255,7 @@ class CronComparedDataView(View):
                 trade_no = item['transaction_info']['paypal_reference_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', '')
+                transaction_subject = 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()
@@ -1264,11 +1267,13 @@ class CronComparedDataView(View):
                     'price': item['transaction_info']['transaction_amount']['value'],
                     'pay_type': 1,
                     'upd_time': now_time,
-                    'status': 0
+                    'status': 0,
+                    'meal_name': transaction_subject
                 }
                 if agreement_id:
                     order_dict['pay_type'] = 0
-                    order_dict['order_id'] = order_id
+                    order_dict['meal_name'] = 'paypal_cycle'
+                    order_dict['order_id'] = transaction_subject
                 params = {'trade_no': trade_no}
                 response = requests.get('https://www.zositeche.com/testApi/checkOrderExist', params=params)
                 if response.status_code != 200:
@@ -1279,3 +1284,39 @@ class CronComparedDataView(View):
                 if result['result_code'] != 0 or not result['result']['is_exist']:
                     # 如果响应结果为空,记录在数据库
                     AbnormalOrder.objects.create(**order_dict)
+
+    @staticmethod
+    def compared_wechat_order(response):
+        today = datetime.datetime.today()
+        start_date = today - datetime.timedelta(days=1)
+        start_date = start_date.strftime("%Y%m%d")
+        try:
+            order_list = WechatPayObject().download_bill(start_date)
+            thread = threading.Thread(target=CronComparedDataView.thread_compared_wechat_order,
+                                      args=(order_list,))
+            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_wechat_order(order_list):
+        now_time = int(time.time())
+        for order in order_list:
+            if order['交易类型'] != '`APP':
+                continue
+            order_id = order['商户订单号'].replace('`', '')
+            order_qs = Order_Model.objects.filter(orderID=order_id)
+            if not order_qs.exists():
+                order_dict = {
+                    'trade_no': order['微信订单号'].replace('`', ''),
+                    'order_id': order_id,
+                    'pay_type': 3,
+                    'price': order['订单金额'].replace('`', ''),
+                    'pay_time': int(datetime.datetime.strptime(order['\ufeff交易时间'], "`%Y-%m-%d %H:%M:%S").timestamp()),
+                    'upd_time': now_time,
+                    'meal_name': order['商品名称'].replace('`', ''),
+                }
+                AbnormalOrder.objects.create(**order_dict)

+ 1 - 0
Model/models.py

@@ -4293,6 +4293,7 @@ class AbnormalOrder(models.Model):
     pay_time = models.IntegerField(verbose_name='支付成功时间', default=0)
     upd_time = models.IntegerField(verbose_name='更新时间', default=0)
     status = models.SmallIntegerField(default=0, verbose_name='处理结果')  # 0:未处理,1:已处理
+    meal_name = models.CharField(default='', blank=True, max_length=32, verbose_name='套餐名')
 
     class Meta:
         db_table = 'abnormal_order'

+ 22 - 1
Object/WechatPayObject.py

@@ -1,3 +1,4 @@
+import datetime
 import hashlib
 import time
 from urllib.parse import quote
@@ -23,6 +24,7 @@ class WechatPayObject:
         self.APIKEY = 'ZHansjeransjeransjer680301000000'
         self.url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'  # 微信请求url
         self.refund_url = 'https://api.mch.weixin.qq.com/secapi/pay/refund'   # 退款url
+        self.downloadbill_url = 'https://api.mch.weixin.qq.com/pay/downloadbill'
         self.error = None
         self.params = None
 
@@ -225,4 +227,23 @@ class WechatPayObject:
         if response['xml']['return_code'] == 'SUCCESS':
             return True
         else:
-            return False
+            return False
+
+    def download_bill(self, date):
+        params = {
+            'appid': self.APPID,  # 公众账号ID
+            'mch_id': self.MCHID,  # 商户号
+            'nonce_str': self.getNonceStr(),  # 随机字符串
+            'bill_date': date,  # 对账单日期
+            'bill_type': 'ALL',  # 账单类型
+        }
+        string_sign = "&".join(['{}={}'.format(k, params[k]) for k in sorted(params)] + ['key={}'.format(self.APIKEY)])
+        params['sign'] = hashlib.md5(string_sign.encode('utf8')).hexdigest().upper()   # MD5签名
+        xml = "<xml>{}</xml>".format("".join(['<{k}>{v}</{k}>'.format(k=k, v=v) for k, v in params.items()]))   # 数据拼接成xml格式
+        r = requests.post(url=self.downloadbill_url, headers={'Content-Type': 'text/xml'}, data=xml.encode('utf-8'))
+        order_text_list = r.text.split('\r\n')
+        key_list = order_text_list[0].split(',')
+        order_list = []
+        for item in order_text_list[1:-3]:
+            order_list.append(dict(zip(key_list, item.split(','))))
+        return order_list