From eda1e177e9227ce1a60423a77fa03e3a1f60e73d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 17 三月 2021 17:34:29 +0800
Subject: [PATCH] 8835 【BT2】【主干】【后端】Part3-2 5)新增多日连充(领奖记录支持多个值)

---
 Tool/WebCenter/CouponCode/webapp.py |  225 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 203 insertions(+), 22 deletions(-)

diff --git a/Tool/WebCenter/CouponCode/webapp.py b/Tool/WebCenter/CouponCode/webapp.py
index 97cb5b8..afef13f 100644
--- a/Tool/WebCenter/CouponCode/webapp.py
+++ b/Tool/WebCenter/CouponCode/webapp.py
@@ -24,6 +24,7 @@
 from lib import mylog, CommFunc
 import os.path
 import zipfile
+import time
 
 # get: request.query.username request.GET.get('username','')
 # post: request.forms.get('username')  request.POST.get('username')
@@ -49,15 +50,26 @@
         
 Def_CardMsg = {
                0:"CodeRewardSys2", #  鍏戞崲鐮佹棤鏁�
-               1: "CodeRewardSys1", #   鍏戞崲鍗″鍔卞凡鍙戣嚦閭欢
+               1:"CodeRewardSys1", #   鍏戞崲鍗″鍔卞凡鍙戣嚦閭欢
                2:"CodeRewardSys3", #  鍏戞崲鐮佸凡浣跨敤杩�
                3:"CodeRewardSys4",  # 鍚岀被鍨嬪厬鎹㈢爜鍙兘浣跨敤涓�娆�
+               4:"LvErr", # 绛夌骇涓嶈冻
+               5:"VipLevel", # VIP绛夌骇涓嶈冻
          }
                 
                 
                 
 myapp = Bottle()
 
+# 闃叉鐭椂闂村唴鐨勫娆℃棤鏁堣闂� accid锛歵ime
+AccID_Cache_Dict = {}
+
+def CleanAccID():
+    global AccID_Cache_Dict
+    
+    if len(AccID_Cache_Dict) < 100:
+        return 
+    AccID_Cache_Dict = {}
 
 
 #/api/Coupon/index.php?couponBatchId=%s&agentName=%s"
@@ -98,11 +110,25 @@
     return static_file("%s.zip"%couponid, r".\download", download=True)
 
 
-# 鍗$被鍨� 寮�澶村瓧姣嶅仛鏍囪瘑濡� g1~999浠h〃姝ゅ崱鍙兘浣跨敤涓�娆� h1~999鍗″彲浠ラ噸澶嶄娇鐢� z寮�澶翠唬琛ㄥ浐瀹氱爜
+#================瀹㈡埛绔姹傚弬鏁�===============================================================
+# channel    鏄�    string    Appid 濡俲sgameios
+# code    鏄�    string    鍏戞崲鐮�
+# accid    鏄�    string    璐﹀彿
+# spid    鏄�    string    杩愯惀鍟咺D锛岀爺鍙戣嚜宸遍厤缃殑锛屽jisu浠h〃鏋侀�熷钩鍙�
+# sid    鏄�    int    鏈嶅姟鍣↖D 鏁板瓧
+# pushurl    鏄�    string    鍩熷悕閾炬帴s222.xxx.com
+# roleid    鏄�    string    鐜╁娓告垙鍚�
+# level    鏄�    int    鐜╁绛夌骇
+# viplevel    鏄�    Int    鐜╁VIP绛夌骇
+#===============================================================================
+
+#2018.10.10 娣锋湇鏀寔瀵艰嚧璐﹀彿鎷兼帴閫昏緫鍙樻洿闇�瑕乻pid
+# 鍗$被鍨� 寮�澶村瓧姣嶅仛鏍囪瘑濡� g1~999浠h〃姝ゅ崱鍙兘浣跨敤涓�娆� h1~999鍗″彲浠ラ噸澶嶄娇鐢� z寮�澶翠唬琛ㄥ浐瀹氱爜 wx寮�澶翠唬琛ㄥ井淇″晢搴�
 # 鐜╁浣跨敤鍗″彿 鍙傛暟 骞冲彴 鍖烘湇 璐﹀彿 鍖烘湇閾炬帴锛圙M鐢級鍗″彿
-# http://center.xxx.com:53003/Coupon/CouponCode.php?channel=appid&code=XXX&accid=YYY&sid=222&pushurl=s222.xxx.com
+# http://center.xxx.com:53003/Coupon/CouponCode.php
 @myapp.route('/Coupon/CouponCode.php')
 def CouponCode():
+    global AccID_Cache_Dict
     dataDict = request.GET
     
     for key, value in dataDict.items():
@@ -115,7 +141,10 @@
     codeStr = dataDict.get("code", "")
     if not codeStr:
         return
-    
+    codeStr = codeStr.strip()
+    #鍙槸鐢ㄦ潵鎷兼帴璐﹀彿
+    spID = dataDict.get("spid", "")
+        
     accid = dataDict.get("accid", "")
     if not accid:
         return
@@ -128,7 +157,21 @@
         return
     
     # 杞寲涓烘父鎴忚处鍙� 
-    accid = "%s@%s@s%s"%(accid, agentName, sid)
+    accid = "%s@%s@s%s"%(accid.lower(), spID, sid)
+    
+    try:
+        CleanAccID()
+        #mylog.debug("AccID_Cache_Dict : %s"%str(AccID_Cache_Dict))
+        if accid not in AccID_Cache_Dict:
+            AccID_Cache_Dict[accid] = int(time.time())
+        elif time.time() - AccID_Cache_Dict[accid] < 2:
+            mylog.debug("==========bad: fast click  %s"%accid)
+            return  
+            
+        AccID_Cache_Dict[accid] = int(time.time())
+    except:
+        pass
+    
     
     dbController = CouponDB.GetDBEventCon()
     if not dbController:
@@ -140,13 +183,19 @@
     gmresult = {'accID':accid, 'sid':sid, 'channel':agentName}
 
     #-----------缁熶竴鍥哄畾鐮佸鐞�----------------------
-    if codeStr in CommonCards:
+    CommonCardsList = CommonCards.get(agentName, [])
+    if codeStr in CommonCardsList:
         # 涓嶅悓鍥哄畾鐮佸悇鑷彧鑳介涓�娆�
         result, commondata = dbController.find_one(CouponDB.CouponCodeColName + "_Common", {"code":codeStr, "accid":accid})
         if commondata:
             # 宸蹭娇鐢�
             gmresult['status'] = 2
             mylog.debug("common status=2")
+            return SendGm(gmresult, pushurl)
+        
+        commCheckStatus = CommCheck(dataDict, codeStr)
+        if commCheckStatus != None:
+            gmresult['status'] = commCheckStatus
             return SendGm(gmresult, pushurl)
         
         gmresult['status'] = 1
@@ -157,8 +206,40 @@
         mylog.debug("common ok")
         return SendGm(gmresult, pushurl)
 
+    #-----------寰俊鍟嗗煄----------------------
+    if codeStr.startswith('wx'):
+        operateID = GetOperateID(agentName)
+        if not operateID:
+            mylog.debug("wx no appid  = %s"%agentName)
+            return
+        result, wxdata = dbController.find_one(CouponDB.CouponWXColName, {"code":codeStr, "operateid":operateID})
+        if not wxdata:
+            return
+        
+        if int(wxdata['status']) == 1:
+            gmresult['status'] = 2
+            mylog.debug("wxcard used!")
+            return SendGm(gmresult, pushurl)
+        
+        wxdata['status'] = 1
+        wxdata['accid'] = dataDict.get("accid", "")     # 姝ゅ鐢ㄥ師濮嬭处鍙�
+        wxdata['usetime'] = str(datetime.datetime.today()).split(".")[0]
+        
+        wxdata['appid'] = agentName
+        wxdata['serverid'] = 's%s'%sid
+        wxdata['roleid'] = dataDict.get("roleid", "")
+        wxdata['level'] = dataDict.get("level", "")
+        wxdata['viplevel'] = dataDict.get("viplevel", "")
+        if SendWXBill(wxdata, pushurl):
+            # 鍏呭�兼垚鍔�
+            dbController.update(CouponDB.CouponWXColName, {"code":codeStr, "operateid":operateID}, wxdata)
+            # 閫氱煡鍚庡彴璁板綍
+            SendDataCollectorBillInfo(wxdata, pushurl, operateID)
+        return
+    
+    #-----------鎵归噺鍏戞崲鐮佸鐞嗭紝鍚岀被鍨嬪彧棰嗗彇涓�娆�----------------------
     result, data = dbController.find_one(CouponDB.CouponCodeColName + "_" + agentName, {"code":codeStr, "channel":agentName})
-
+    
     if not data:
         #鏃犳鍗�
         gmresult['status'] = 0
@@ -168,6 +249,11 @@
         #宸蹭娇鐢紝鍚屽崱鍙疯褰曢粯璁ゅ彲鐢紝閬垮厤鏂嚎鍙戦�佸け璐ョ殑鎯呭喌锛堟湭杩斿洖缁撴灉楠岃瘉鎯呭喌涓嬶級
         gmresult['status'] = 2
         mylog.debug("card used!")
+        return SendGm(gmresult, pushurl)
+    
+    commCheckStatus = CommCheck(dataDict, data["coupontype"])
+    if commCheckStatus != None:
+        gmresult['status'] = commCheckStatus
         return SendGm(gmresult, pushurl)
     
     result, data2 = dbController.find_one(CouponDB.CouponBatchColName, {"couponid":data["couponid"]})
@@ -192,17 +278,20 @@
         gmresult['status'] = 0
         mylog.debug("time pass")
         return SendGm(gmresult, pushurl)
-    #鍐嶆煡涓�娆℃槸鍚︾敤杩囨鎵规鐨勫叾浠栧崱, 
-    result, data3 = dbController.find_one(CouponDB.CouponCodeColName + "_" + agentName, \
-                                          {"couponid":data["couponid"], "accid":accid})
-    if data3:
-        #鐢ㄨ繃鍚岀被鍗★紝宸茶褰曡繃涓嶅啀鍋氭柊璁板綍
-        gmresult['status'] = 3
-        gmresult['coupontype'] = data["coupontype"]
-        gmresult['code'] = codeStr
-        mylog.debug("use again")
-        return SendGm(gmresult, pushurl)
     
+    # h 寮�澶寸殑鍗$被鍨嬪彲閲嶅浣跨敤
+    if not codeStr.startswith('h'):
+        #鍐嶆煡涓�娆℃槸鍚︾敤杩囨鎵规鐨勫叾浠栧崱, 
+        result, data3 = dbController.find_one(CouponDB.CouponCodeColName + "_" + agentName, \
+                                              {"coupontype":data["coupontype"], "accid":accid})
+        if data3:
+            #鐢ㄨ繃鍚岀被鍗★紝宸茶褰曡繃涓嶅啀鍋氭柊璁板綍
+            gmresult['status'] = 3
+            gmresult['coupontype'] = data["coupontype"]
+            gmresult['code'] = codeStr
+            mylog.debug("use again")
+            return SendGm(gmresult, pushurl)
+        
     data['status'] = 1
     data['accid'] = accid
     data['usetime'] = str(datetime.datetime.today())
@@ -216,7 +305,24 @@
     mylog.debug("card ok!")
     return SendGm(gmresult, pushurl)
 
-
+def CommCheck(dataDict, coupontype):
+    ## 閫氱敤甯歌妫�鏌�
+    
+    # 浣跨敤绛夌骇
+    lvLimit = ConfigIO.GetInt(coupontype, "LV")
+    playerLV = CommFunc.ToIntDef(dataDict.get("level", 0))
+    if lvLimit > 0 and playerLV < lvLimit:
+        mylog.debug("playerLV(%s) < lvLimit(%s)" % (playerLV, lvLimit))
+        return 4
+    
+    # vip绛夌骇鐩稿叧
+    vipLVLimit = ConfigIO.GetInt(coupontype, "VIPLV")
+    playerVIPLV = CommFunc.ToIntDef(dataDict.get("viplevel", 0))
+    if vipLVLimit > 0 and playerVIPLV < vipLVLimit:
+        mylog.debug("playerVIPLV(%s) < vipLVLimit(%s)" % (playerVIPLV, vipLVLimit))
+        return 5
+    
+    return
 
 def SendGm(gmresult, pushurl):
     try:
@@ -268,7 +374,7 @@
         for itemList in Items:
             pack_data["ItemID%s"%i] = str(itemList[0])
             pack_data["ItemCnt%s"%i] = str(itemList[1])
-            pack_data["IsBind%s"%i] = '1'
+            pack_data["IsBind%s"%i] = str(itemList[2] if len(itemList) > 2 else 0)
             i += 1
             
         pack_data["pack_type"] = "GMT_AddPersonalCompensation"
@@ -283,9 +389,9 @@
         post = {}
         post['pack'] = pack_data_dict;
         post['sign'] = sign;
-        result = urllib2.urlopen(gmurl, urllib.urlencode(post), 10)
+        result = urllib2.urlopen(gmurl, urllib.urlencode(post), 3)
 
-        content = result.read()
+        #content = result.read()
         result.close()
         
         # 鎴愬姛鎻愮ず
@@ -306,7 +412,7 @@
         post['sign'] = sign;
         urllib2.urlopen(gmurl, urllib.urlencode(post), 3)
         
-        return content
+        return 0
     except Exception, e:
         mylog.debug("gm error %s"%e)
     return
@@ -321,3 +427,78 @@
     
     return
     
+
+# 閫氳繃appid鎵惧埌杩愯惀鍟�
+def GetOperateID(appid):
+    appidDict = eval(ConfigIO.GetValue("Coupon", "appid_dict"))
+    for key, value in appidDict.items():
+        if appid in value:
+            return key
+    return ""
+
+
+
+# 寰俊鍏ュ彛鍏呭��
+def SendWXBill(wxdata, pushurl):
+    try:
+        billurl = "http://%s/api/exchange/index.php"%pushurl
+
+        post = {}
+        post['AccountID'] = wxdata['accid']
+        post['RegionName'] = wxdata['serverid'] 
+        post['OrderAmount'] = wxdata['money'] 
+        post['BillNO'] = wxdata['orderid'] 
+        post['OrderInfo'] = wxdata['orderinfo'] 
+        post['OperatorID'] = wxdata['appid'] 
+        
+        key = ConfigIO.GetValue("Coupon", "key_%s"%post['OperatorID'])
+        # $sign=md5($AccountID.$OrderAmount.$BillNO.$RegionName.$key)
+        mylog.debug("appid = %s  key = %s"%(post['OperatorID'], key))
+        
+        sign = md5.md5(post['AccountID'] + str(post['OrderAmount']) + post['BillNO'] + post['RegionName'] + key).hexdigest()
+        
+        post['Sign'] = sign
+        result = urllib2.urlopen(billurl, urllib.urlencode(post), 3)
+        resultDict = json.loads(result.read())
+        
+        mylog.debug("resultDict = %s "%(resultDict))
+
+        if int(resultDict["errorcode"]) > 0:
+            return True
+    except Exception, e:
+        mylog.info("SendWXBill error %s"%e)
+    return False
+
+# 閫氱煡鍚庡彴鏁版嵁涓績璁板綍
+def SendDataCollectorBillInfo(wxdata, pushurl, operateID):
+    try:
+        billurl = "http://recharge.game.2460web.com:12000/api/notify/swwx"
+    
+        post = {}
+        post['appid'] = wxdata['appid']
+        post['regionid'] = wxdata['serverid'] 
+        post['orderid'] = wxdata['orderid'] 
+        post['passport'] = wxdata['accid'] 
+        post['roleid'] =  wxdata['roleid']
+        post['ordertitle'] = wxdata['ordertitle'].encode("UTF8")
+        post['orderinfo'] = wxdata['orderinfo']
+        post['money'] = wxdata['money'] 
+        post['ip'] = wxdata['ip'] 
+        post['level'] = wxdata['level'] 
+        post['viplevel'] = wxdata['viplevel'] 
+        post['time'] = int(time.time())
+        
+        key = ConfigIO.GetValue("Coupon", "key_%s"%post['appid'])
+        #md5(appid=$appid&regionid=$regionid&passport=$passport&&money=$money&time=$time$app_secret) 
+        signStr = "appid=%s&regionid=%s&passport=%s&money=%s&time=%s%s"%(\
+                    post['appid'], post['regionid'], post['passport'], post['money'], post['time'], key)
+        sign = md5.md5(signStr).hexdigest()
+        #mylog.debug("SendDataCollectorBillInfo  %s-%s-%s-%s"%(signStr, sign, key, post))
+        post['sign'] = sign
+        result = urllib2.urlopen(billurl +"?" + urllib.urlencode(post), timeout =3)
+        #mylog.debug("SendDataCollectorBillInfo result %s"%result.read())
+
+    except Exception, e:
+        mylog.debug("SendDataCollectorBillInfo error %s"%e)
+
+

--
Gitblit v1.8.0