Browse Source

PayPal退款

locky 4 years ago
parent
commit
12e43fd194
1 changed files with 26 additions and 6 deletions
  1. 26 6
      Controller/CloudStorage.py

+ 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)