Просмотр исходного кода

支付回调增加redis锁,防止订单重复

lang 3 лет назад
Родитель
Сommit
be8131c425
1 измененных файлов с 19 добавлено и 9 удалено
  1. 19 9
      Controller/CloudStorage.py

+ 19 - 9
Controller/CloudStorage.py

@@ -729,12 +729,17 @@ class CloudStorageView(View):
             data.pop('sign')
             data.pop('sign')
             orderID = data['out_trade_no']
             orderID = data['out_trade_no']
 
 
-            order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
+            # 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)
             aliPayObj = AliPayObject()
             aliPayObj = AliPayObject()
             alipay = aliPayObj.conf()
             alipay = aliPayObj.conf()
             success = alipay.verify(data, signature)
             success = alipay.verify(data, signature)
-
             if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
             if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
                 print("trade succeed")
                 print("trade succeed")
 
 
@@ -815,11 +820,13 @@ class CloudStorageView(View):
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                     if lang != 'cn':
                     if lang != 'cn':
                         red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                         red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
+                    redisObj.del_data(key=orderID + 'do_notify')
                     return HttpResponseRedirect(red_url)
                     return HttpResponseRedirect(red_url)
             return response.json(0, signature)
             return response.json(0, signature)
         except Exception as e:
         except Exception as e:
             if order_qs:
             if order_qs:
                 order_qs.update(status=10, promotion_rule_id=promotion_rule_id)
                 order_qs.update(status=10, promotion_rule_id=promotion_rule_id)
+            redisObj.del_data(key=orderID + 'do_notify')
             red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
             red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
             if lang != 'cn':
             if lang != 'cn':
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
@@ -830,6 +837,12 @@ class CloudStorageView(View):
         PayerID = request_dict.get('PayerID', None)
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
         orderID = request_dict.get('orderID', None)
         lang = request_dict.get('lang', 'en')
         lang = request_dict.get('lang', 'en')
+        # 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)
         try:
         try:
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
 
 
@@ -850,6 +863,7 @@ class CloudStorageView(View):
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 if lang != 'cn':
                 if lang != 'cn':
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
+                redisObj.del_data(key=orderID + 'do_notify')
                 return HttpResponseRedirect(red_url)
                 return HttpResponseRedirect(red_url)
             print("Payment execute successfully")
             print("Payment execute successfully")
 
 
@@ -937,7 +951,7 @@ class CloudStorageView(View):
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 if lang != 'cn':
                 if lang != 'cn':
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
-
+                redisObj.del_data(key=orderID + 'do_notify')
                 return HttpResponseRedirect(red_url)
                 return HttpResponseRedirect(red_url)
         except Exception as e:
         except Exception as e:
             print(repr(e))
             print(repr(e))
@@ -946,6 +960,7 @@ class CloudStorageView(View):
             red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
             red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
             if lang != 'cn':
             if lang != 'cn':
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
+            redisObj.del_data(key=orderID + 'do_notify')
             return HttpResponseRedirect(red_url)
             return HttpResponseRedirect(red_url)
 
 
     def do_pay_by_wechat_callback(self, request, response):  # 微信支付回调
     def do_pay_by_wechat_callback(self, request, response):  # 微信支付回调
@@ -965,6 +980,7 @@ class CloudStorageView(View):
                 if not check_sign:
                 if not check_sign:
                     return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '签名失败'}))
                     return HttpResponse(pay.xml_to_dict({'return_code': 'FAIL', 'return_msg': '签名失败'}))
                 orderID = out_trade_no
                 orderID = out_trade_no
+
                 #redis加锁,防止订单重复
                 #redis加锁,防止订单重复
                 redisObj = RedisObject()
                 redisObj = RedisObject()
                 isLock = redisObj.CONN.setnx(orderID + 'do_notify', 1)
                 isLock = redisObj.CONN.setnx(orderID + 'do_notify', 1)
@@ -976,12 +992,6 @@ class CloudStorageView(View):
                 order_list = order_qs.values("UID", "channel", "commodity_code", "rank", "isSelectDiscounts",
                 order_list = order_qs.values("UID", "channel", "commodity_code", "rank", "isSelectDiscounts",
                                              "userID__userID", "userID__username","status")
                                              "userID__userID", "userID__username","status")
 
 
-                if order_list[0]['status'] == 1:
-                    return HttpResponse("<xml>\
-                                          <return_code><![CDATA[SUCCESS]]></return_code>\
-                                          <return_msg><![CDATA[OK]]></return_msg>\
-                                        </xml>")
-
                 logger.info(order_list[0]['UID'])
                 logger.info(order_list[0]['UID'])
                 logger.info(orderID)
                 logger.info(orderID)