Browse Source

Merge branch 'dev' of http://192.168.136.99:3000/servers/ASJServer into dev

lang 4 năm trước cách đây
mục cha
commit
2043d88569

+ 26 - 6
Controller/CloudStorage.py

@@ -819,6 +819,7 @@ class CloudStorageView(View):
             paypalrestsdk.configure(PAYPAL_CRD)
             # ID of the payment. This ID is provided when creating payment.
             payment = paypalrestsdk.Payment.find(paymentId)
+            print(payment)
             payres = payment.execute({"payer_id": PayerID})
             print(payres)
             if not payres:
@@ -1066,7 +1067,6 @@ class CloudStorageView(View):
 
         orderID = CommonService.createOrderID()
         if pay_type == 1:
-
             cal_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
             if lang != 'cn':
                 cal_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
@@ -1091,6 +1091,7 @@ class CloudStorageView(View):
                 print(payment.error)
                 return response.json(10, payment.error)
             print(payment)
+            paymentID = payment['id']   # 获取paymentID
             for link in payment.links:
                 if link.rel == "approval_url":
                     approval_url = str(link.href)
@@ -1100,7 +1101,7 @@ class CloudStorageView(View):
                                                price=price, currency=currency, addTime=nowTime, updTime=nowTime,
                                                pay_url=approval_url, isSelectDiscounts=is_select_discount,
                                                commodity_code=commodity_code, commodity_type=commodity_type,
-                                               rank_id=rank)
+                                               rank_id=rank, paymentID=paymentID)
                     return response.json(0, {"redirectUrl": approval_url, "orderID": orderID})
             return response.json(10, 'generate_order_false')
         elif pay_type == 2:
@@ -1678,7 +1679,8 @@ class CloudStorageView(View):
         if not orderID:
             return response.json(444)
         try:
-            order_qs = Order_Model.objects.filter(orderID=orderID).values('status', 'payType', 'price')
+            order_qs = Order_Model.objects.filter(orderID=orderID).\
+                values('status', 'payType', 'price', 'currency', 'paymentID')
             if not order_qs.exists():
                 return response.json(173)
 
@@ -1690,10 +1692,29 @@ class CloudStorageView(View):
             now_time = int(time.time())
             payType = order_qs[0]['payType']
             refund_amount = order_qs[0]['price']    # 退款金额
+            currency = order_qs[0]['currency']      # 货币
+            paymentID = order_qs[0]['paymentID']    # 退款id
             out_request_no = str(time.strftime('%Y%m%d%H%M%S', time.localtime(now_time)))    # 退款请求号
             # 根据支付类型处理退款
             if payType == 1:    # PayPal
-                pass
+                paypalrestsdk.configure(PAYPAL_CRD)
+                payment = paypalrestsdk.Payment.find(paymentID)
+                print(payment)
+                related_resources = payment['transactions'][0]['related_resources']
+                if not related_resources:
+                    return response.json(805)
+                sale = related_resources[0]['sale']
+                if sale['state'] != 'completed':
+                    return response.json(805)
+                sale_id = sale['id']
+                paypalSale = paypalrestsdk.Sale.find(sale_id)
+                refund = paypalSale.refund({
+                    'amount': {
+                        'total': refund_amount,
+                        'currency': currency
+                    }
+                })
+                status = 5 if refund.success() else 4
             elif payType == 2:  # 支付宝
                 aliPayObj = AliPayObject()
                 alipay = aliPayObj.conf()
@@ -1701,16 +1722,15 @@ class CloudStorageView(View):
                                                                  out_request_no=out_request_no)
                 # 退款成功,修改订单支付状态为'退款成功',否则改为'退款失败'
                 status = 5 if refund_response['code'] == '10000' else 4
-                order_qs.update(status=status, updTime=now_time)
             elif payType == 3:  # 微信
                 wechatPayObj = WechatPayObject()
                 refund_amount = int(float(refund_amount) * 100)  # 退款金额,单位为分,只能为整数
                 refund_success = wechatPayObj.refund(out_trade_no=orderID, out_refund_no=out_request_no,
                                                      total_fee=refund_amount, refund_fee=refund_amount)
                 status = 5 if refund_success else 4
-                order_qs.update(status=status, updTime=now_time)
             else:   # 不支持退款的支付类型
                 return response.json(805)
+            order_qs.update(status=status, updTime=now_time)    # 更新订单状态
             return response.json(0)
         except Exception as e:
             print(e)

+ 2 - 0
Controller/DetectController.py

@@ -176,6 +176,8 @@ class DetectControllerView(View):
         # 如果传空上来,就默认为0
         if tz == '':
             tz = 0
+        else:
+            tz = tz.replace("GMT", "")
         detect_group = request_dict.get('detect_group', None)
         interval = request_dict.get('interval', None)
         if not status:

+ 2 - 0
Controller/DetectControllerV2.py

@@ -108,6 +108,8 @@ class DetectControllerViewV2(View):
         # 如果传空上来,就默认为0
         if tz == '':
             tz = 0
+        else:
+            tz = tz.replace("GMT", "")
         detect_group = request_dict.get('detect_group', None)
         interval = request_dict.get('interval', None)
         if not status:

+ 9 - 4
Controller/PctestController.py

@@ -191,9 +191,11 @@ class PcTest(View):
 
         function_list = PctestfunctionModel.objects.filter(id__in=functions.split(','))
         # 判断设备与此职能是否有关联,避免重复添加
-        PctestModel.objects.filter(device_id=device_qs[0].id, function__in=function_list).delete()
-        for fun in function_list:
-            PctestModel.objects.create(device_id=device_qs[0].id, function_id=fun.id)
+        PctestModel.objects.filter(device_id=device_qs[0].id).delete()
+        for fid in functions.split(','):
+            for fun in function_list:
+                if int(fid) ==fun.id:
+                    PctestModel.objects.create(device_id=device_qs[0].id, function_id=fun.id)
         return response.json(0)
 
 
@@ -224,8 +226,10 @@ class PcTest(View):
         id = request_dict.get('id', None)
         device_qs = PctestdeviceModel.objects.filter(id=id)
         if device_qs.exists:
-            device_qs.delete()
+            PctestjobdeviceModel.objects.filter(device__in=device_qs).delete()
             PctestModel.objects.filter(device__in=device_qs).delete()
+            device_qs.delete()
+
 
         return response.json(0)
 
@@ -253,6 +257,7 @@ class PcTest(View):
         function_qs = PctestfunctionModel.objects.filter(id=id)
 
         if function_qs.exists:
+            PctestModel.objects.filter(function__in=function_qs).delete()
             function_qs.delete()
         return response.json(0)
 

+ 6 - 5
Model/models.py

@@ -569,9 +569,9 @@ class App_Colophon(models.Model):
 
 class Order_Model(models.Model):
     orderID = models.CharField(blank=True, max_length=20, primary_key=True, verbose_name=u'订单id')
+    paymentID = models.CharField(blank=True, max_length=64, default='', verbose_name='付款id')
     trade_no = models.CharField(blank=True, max_length=32, default='', verbose_name='第三方订单号')
-    # 订单关联用户
-    userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
+    userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)    # 订单关联用户
     UID = models.CharField(max_length=20, verbose_name='设备UID')
     channel = models.SmallIntegerField(default=0, verbose_name=u'通道数')
     desc = models.CharField(max_length=50, default='', verbose_name='商品描述')
@@ -579,10 +579,11 @@ class Order_Model(models.Model):
     currency = models.CharField(blank=True, default='$', max_length=32, verbose_name=u'货币')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
-    # endTime = models.IntegerField(verbose_name='结束时间', default=0)
     isSelectDiscounts = models.SmallIntegerField(default=0, verbose_name=u'用户是否选择了第二年优惠 [0=否,1是]')
-    status = models.SmallIntegerField(default=0, verbose_name='付款状态')  # 0:待支付,1:成功,2:取消,3:已退款,4: 退款失败,5: 退款成功, 9:处理中,10:付款失败
-    payType = models.SmallIntegerField(default=0, verbose_name='付款类型0:paypal,1:alipay')
+    # 0: 待支付, 1:支付成功, 2: 取消支付, 4: 退款失败, 5: 退款成功, 9:处理中, 10:支付失败
+    status = models.SmallIntegerField(default=0, verbose_name='付款状态')
+    # 1: PayPal, 2: 支付宝, 3: 微信, 10: 免费体验, 11: 激活码
+    payType = models.SmallIntegerField(default=0, verbose_name='支付方式')
     payTime = models.IntegerField(verbose_name='支付成功时间', default=0)
     rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='套餐类型')
     nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')

+ 4 - 4
Object/WechatPayObject.py

@@ -214,11 +214,11 @@ class WechatPayObject:
             'refund_fee': refund_fee    # 退款金额
         }
         # doc: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
-        string_sign = "&".join([f"{k}={params[k]}" for k in sorted(params)] + [f"{'key'}={self.APIKEY}"])
+        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([f"<{k}>{v}</{k}>" for k, v in params.items()]))   # 数据拼接成xml格式
-        cert = f"{BASE_DIR}/Ansjer/file/wechatpay/apiclient_cert.pem"
-        key = f"{BASE_DIR}/Ansjer/file/wechatpay/apiclient_key.pem"
+        xml = "<xml>{}</xml>".format("".join(['<{k}>{v}</{k}>'.format(k=k, v=v) for k, v in params.items()]))   # 数据拼接成xml格式
+        cert = '{}/Ansjer/file/wechatpay/apiclient_cert.pem'.format(BASE_DIR)
+        key = '{}/Ansjer/file/wechatpay/apiclient_key.pem'.format(BASE_DIR)
         r = requests.post(url=self.refund_url, headers={'Content-Type': 'text/xml'}, data=xml.encode('utf-8'),
                           cert=(cert, key), verify=True)
         response = xmltodict.parse(r.text)