Jelajahi Sumber

优化ai支付回调接口

locky 2 tahun lalu
induk
melakukan
678d76990c
1 mengubah file dengan 119 tambahan dan 87 penghapusan
  1. 119 87
      Controller/AiController.py

+ 119 - 87
Controller/AiController.py

@@ -39,10 +39,10 @@ class AiView(View):
     def validation(self, request_dict, request, operation):
         response = ResponseObject()
         if operation is None:
-            return response.json(444, 'error path')
+            return response.json(414)
         # 支付回调接口
         elif operation == 'doPayPalCallBack':  # paypal支付回调
-            return self.do_pay_by_paypal_callback(request_dict, response)
+            return self.do_paypal_callback(request_dict, response)
         elif operation == 'doAlipayCallBack':  # 支付宝支付回调
             return self.do_alipay_callback(request_dict, response)
         elif operation == 'doWechatCallBack':  # 微信支付回调
@@ -57,11 +57,11 @@ class AiView(View):
 
             # 套餐相关接口
             if operation == 'commoditylist':        # 查询套餐列表
-                return self.do_commodity_list(request_dict, response)
+                return self.commodity_list(request_dict, response)
             elif operation == 'experienceOrder':    # 体验套餐
                 return self.experience_order(request_dict, user_id, response)
             elif operation == 'createpayorder':     # 创建支付订单
-                return self.do_create_pay_order(request_dict, request, user_id, response)
+                return self.create_pay_order(request_dict, request, user_id, response)
             elif operation == 'queryorderlist':     # 查询订单列表
                 return self.query_order_list(request_dict, user_id, response)
             elif operation == 'getUsingPackage':    # 获取当前使用套餐
@@ -70,12 +70,12 @@ class AiView(View):
             elif operation == 'getAiStatus':        # 获取开关状态
                 return self.get_ai_status(request_dict, response)
             elif operation == 'changeaistatus':     # 修改开关状态
-                return self.do_change_ai_status(request_dict, user_id, response)
+                return self.change_ai_status(request_dict, user_id, response)
             else:
                 return response.json(414)
 
     @staticmethod
-    def do_commodity_list(request_dict, response):
+    def commodity_list(request_dict, response):
         """
         查询套餐列表
         @param request_dict: 请求数据
@@ -231,7 +231,7 @@ class AiView(View):
             return response.json(474)
 
     @classmethod
-    def do_create_pay_order(cls, request_dict, request, user_id, response):
+    def create_pay_order(cls, request_dict, request, user_id, response):
         """
         创建支付订单
         @param request_dict: 请求数据
@@ -453,7 +453,7 @@ class AiView(View):
             return response.json(500, repr(e))
 
     @staticmethod
-    def do_change_ai_status(request_dict, user_id, response):
+    def change_ai_status(request_dict, user_id, response):
         """
         修改AI开关状态
         @param request_dict: 请求数据
@@ -680,102 +680,131 @@ class AiView(View):
             print(e)
             return {}
 
-    def do_pay_by_paypal_callback(self, request_dict, response):
+    @classmethod
+    def do_paypal_callback(cls, request_dict, response):
+        """
+        paypal支付回调
+        @param request_dict: 请求数据
+        @request_dict paymentId: 支付id
+        @request_dict PayerID: 支付账号id
+        @request_dict orderID: 订单id
+        @request_dict lang: 语言
+        @param response: 响应
+        @return: response
+        """
         logger = logging.getLogger('info')
         logger.info('AI订单---paypal支付回调')
-        paymentId = request_dict.get('paymentId', None)
-        PayerID = request_dict.get('PayerID', None)
-        orderID = request_dict.get('orderID', None)
+        payment_id = request_dict.get('paymentId', None)
+        payer_id = request_dict.get('PayerID', None)
+        order_id = request_dict.get('orderID', None)
         lang = request_dict.get('lang', 'en')
 
-        if not orderID:
+        if not order_id:
             pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
             return HttpResponseRedirect(pay_failed_url)
 
-        logger.info("paymentID: {}, payerID: {}".format(paymentId, PayerID))
-
         # redis加锁,防止订单重复
-        redisObj = RedisObject()
-        isLock = redisObj.CONN.setnx(orderID + 'do_notify', 1)
-        redisObj.CONN.expire(orderID + 'do_notify', 60)
+        redis_obj = RedisObject()
+        isLock = redis_obj.CONN.setnx(order_id + 'creating_ai_order', 1)
+        redis_obj.CONN.expire(order_id + 'creating_ai_order', 60)
         if not isLock:
             return response.json(5)
 
-        try:
-            order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
-            if not order_qs.exists():
-                return response.json(173)
+        order_qs = Order_Model.objects.filter(orderID=order_id, status=0)
+        if not order_qs.exists():
+            return response.json(173)
 
+        try:
             paypalrestsdk.configure(PAYPAL_CRD)
-            payment = paypalrestsdk.Payment.find(paymentId)
-            logger.info("payment: {}".format(payment))
-
-            payer = payment.execute({"payer_id": PayerID})
-            logger.info('payres: {}'.format(payer))
+            payment = paypalrestsdk.Payment.find(payment_id)
+            payer = payment.execute({'payer_id': payer_id})
             if not payer:
                 pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
-                redisObj.del_data(key=orderID + 'do_notify')
+                redis_obj.del_data(key=order_id + 'creating_ai_order')
                 return HttpResponseRedirect(pay_failed_url)
-            return self.payment_success(orderID, lang, order_qs, redisObj)
+            return cls.payment_success(order_id, lang, order_qs, redis_obj)
         except Exception as e:
             logger.info('AI订单paypal支付回调异常:{}'.format(repr(e)))
             order_qs.update(status=10)
             pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
-            redisObj.del_data(key=orderID + 'do_notify')
+            redis_obj.del_data(key=order_id + 'creating_ai_order')
             return HttpResponseRedirect(pay_failed_url)
 
-    def do_alipay_callback(self, request_dict, response):  # 支付宝支付回调
+    @classmethod
+    def do_alipay_callback(cls, request_dict, response):
+        """
+        支付宝支付回调
+        @param request_dict: 请求数据
+        @param response: 响应
+        @return: response
+        """
         logger = logging.getLogger('info')
         logger.info('AI订单---支付宝支付回调')
-        try:
-            data = request_dict.dict()
-            passback_params = data['passback_params']
-            parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
-            lang = parmap['lang']
-            signature = data['sign']
-            data.pop('sign')
-            orderID = data['out_trade_no']
-
-            # redis加锁,防止订单重复
-            redisObj = RedisObject()
-            isLock = redisObj.CONN.setnx(orderID + 'do_notify', 1)
-            redisObj.CONN.expire(orderID + 'do_notify', 60)
-            if not isLock:
-                return response.json(5)
-
-            order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
-            if not order_qs.exists():
-                return response.json(173)
 
-            aliPayObj = AliPayObject()
-            alipay = aliPayObj.conf()
+        data = request_dict.dict()
+        passback_params = data['passback_params']
+        params = dict([(k, v[0]) for k, v in parse_qs(unquote(passback_params)).items()])
+        lang = params['lang']
+        signature = data['sign']
+        data.pop('sign')
+        order_id = data['out_trade_no']
+
+        # redis加锁,防止订单重复
+        redis_obj = RedisObject()
+        isLock = redis_obj.CONN.setnx(order_id + 'creating_ai_order', 1)
+        redis_obj.CONN.expire(order_id + 'creating_ai_order', 60)
+        if not isLock:
+            return response.json(5)
+
+        order_qs = Order_Model.objects.filter(orderID=order_id, status=0)
+        if not order_qs.exists():
+            return response.json(173)
+
+        try:
+            alipay_obj = AliPayObject()
+            alipay = alipay_obj.conf()
             success = alipay.verify(data, signature)
-            if not success or data["trade_status"] not in ("TRADE_SUCCESS", "TRADE_FINISHED"):
+            if not success or data['trade_status'] not in ('TRADE_SUCCESS', 'TRADE_FINISHED'):
                 return response.json(0, signature)
-            return self.payment_success(orderID, lang, order_qs, redisObj)
+            return cls.payment_success(order_id, lang, order_qs, redis_obj)
         except Exception as e:
             logger.info('AI订单支付宝支付回调异常:{}'.format(repr(e)))
             order_qs.update(status=10)
-            redisObj.del_data(key=orderID + 'do_notify')
+            redis_obj.del_data(key=order_id + 'creating_ai_order')
             pay_failed_url = CommonService.get_payment_status_url(lang, 'fail')
-            redisObj.del_data(key=orderID + 'do_notify')
+            redis_obj.del_data(key=order_id + 'creating_ai_order')
             return HttpResponseRedirect(pay_failed_url)
 
-    def do_wechat_callback(self, request, response):  # 微信支付回调
+    @classmethod
+    def do_wechat_callback(cls, request, response):
+        """
+        微信支付回调
+        @param request: 请求体
+        @param response: 响应
+        @return: response
+        """
         logger = logging.getLogger('info')
         logger.info('AI订单---微信支付回调')
-        try:
-            pay = WechatPayObject()
-            data = pay.weixinpay_call_back(request.body)
-            attach = data["attach"]
-            parmap = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
-            lang = parmap['lang']
-            trade_status = data['result_code']  # 业务结果  SUCCESS/FAIL
-            orderID = data['out_trade_no']  # 商户订单号
-            order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
-            if not order_qs.exists():
-                return response.json(173)
 
+        pay = WechatPayObject()
+        data = pay.weixinpay_call_back(request.body)
+        attach = data["attach"]
+        params = dict([(k, v[0]) for k, v in parse_qs(unquote(attach)).items()])
+        lang = params['lang']
+        trade_status = data['result_code']  # 业务结果  SUCCESS/FAIL
+        order_id = data['out_trade_no']  # 商户订单号
+
+        # redis加锁,防止订单重复
+        redis_obj = RedisObject()
+        isLock = redis_obj.CONN.setnx(order_id + 'creating_ai_order', 1)
+        redis_obj.CONN.expire(order_id + 'creating_ai_order', 60)
+        if not isLock:
+            return response.json(5)
+
+        order_qs = Order_Model.objects.filter(orderID=order_id, status=0)
+        if not order_qs.exists():
+            return response.json(173)
+        try:
             if trade_status != 'SUCCESS':
                 order_qs.update(status=10)
                 return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL'}))
@@ -783,23 +812,26 @@ class AiView(View):
             if not check_sign:
                 return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '签名失败'}))
 
-            # redis加锁,防止订单重复
-            redisObj = RedisObject()
-            isLock = redisObj.CONN.setnx(orderID + 'do_notify', 1)
-            redisObj.CONN.expire(orderID + 'do_notify', 60)
-            if not isLock:
-                return response.json(5)
-
-            return self.payment_success(self, orderID, lang, order_qs, redisObj, True)
+            return cls.payment_success(order_id, lang, order_qs, redis_obj, True)
         except Exception as e:
             order_qs.update(status=10)
-            redisObj.del_data(key=orderID + 'do_notify')
+            redis_obj.del_data(key=order_id + 'creating_ai_order')
             return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': repr(e)}))
 
-    def payment_success(self, orderID, lang, order_qs, redisObj, is_wechat_pay=False):
-        nowTime = int(time.time())
-        order_list = order_qs.values("UID", "channel", "commodity_code", "ai_rank__effective_day", "isSelectDiscounts",
-                                     "userID__userID", "userID__username", "coupon_id")
+    @staticmethod
+    def payment_success(order_id, lang, order_qs, redis_obj, is_wechat_pay=False):
+        """
+        支付成功
+        @param order_id: 订单id
+        @param lang: 语言
+        @param order_qs: 订单QuerySet对象
+        @param redis_obj: redis对象
+        @param is_wechat_pay: 是否为微信支付
+        @return: HttpResponse or HttpResponseRedirect
+        """
+        now_time = int(time.time())
+        order_list = order_qs.values('UID', 'channel', 'commodity_code', 'ai_rank__effective_day', 'isSelectDiscounts',
+                                     'userID__userID', 'userID__username', 'coupon_id')
         userid = order_list[0]['userID__userID']
         username = order_list[0]['userID__username']
         UID = order_list[0]['UID']
@@ -807,29 +839,29 @@ class AiView(View):
         effective_day = order_list[0]['ai_rank__effective_day']
 
         ai_service_qs = AiService.objects.filter(Q(uid=UID), Q(channel=channel), Q(use_status=1))
-        ai_service_dict = {'orders_id': orderID,
+        ai_service_dict = {'orders_id': order_id,
                            'uid': UID,
                            'channel': channel,
                            'detect_status': 1,
-                           'addTime': nowTime,
-                           'updTime': nowTime,
+                           'addTime': now_time,
+                           'updTime': now_time,
                            }
         if ai_service_qs.exists():  # 有正在使用的套餐,套餐结束时间保存为套餐有效期
             ai_service_dict['endTime'] = effective_day * 24 * 60 * 60
         else:
             ai_service_dict['use_status'] = 1
-            ai_service_dict['endTime'] = nowTime + effective_day * 24 * 60 * 60
+            ai_service_dict['endTime'] = now_time + effective_day * 24 * 60 * 60
         with transaction.atomic():
             # 更新设备主用户
             Device_Info.objects.filter(UID=UID, vodPrimaryUserID='', vodPrimaryMaster=''). \
                 update(vodPrimaryUserID=userid, vodPrimaryMaster=username)
             # 更新订单数据,返回支付成功url
-            order_qs.update(status=1, updTime=nowTime)
+            order_qs.update(status=1, updTime=now_time)
             # 创建AiService数据
             AiService.objects.create(**ai_service_dict)
 
         pay_success_url = CommonService.get_payment_status_url(lang, 'success')
-        redisObj.del_data(key=orderID + 'do_notify')
+        redis_obj.del_data(key=order_id + 'creating_ai_order')
         if is_wechat_pay:
             return HttpResponse("<xml>\
               <return_code><![CDATA[SUCCESS]]></return_code>\