From 0a70259aa5a019920767b43fc23374ebf30b9b85 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 18 十月 2018 20:15:50 +0800
Subject: [PATCH] fix:新增微信商城,注意兑换码不能用多线程有可能发生复用bug

---
 Tool/WebCenter/Coupon/config.ini      |    8 
 Tool/WebCenter/CouponCode/CouponDB.py |    2 
 Tool/WebCenter/Coupon/CouponDB.py     |    2 
 Tool/WebCenter/Coupon/webapp.py       |  373 +++++++++++++---------------------------
 Tool/WebCenter/CouponCode/main.py     |    3 
 Tool/WebCenter/CouponCode/webapp.py   |  133 ++++++++++++++
 6 files changed, 266 insertions(+), 255 deletions(-)

diff --git a/Tool/WebCenter/Coupon/CouponDB.py b/Tool/WebCenter/Coupon/CouponDB.py
index 4a3e9e2..9beca0c 100644
--- a/Tool/WebCenter/Coupon/CouponDB.py
+++ b/Tool/WebCenter/Coupon/CouponDB.py
@@ -21,6 +21,8 @@
 
 g_dbController = None
 
+CouponWXColName = "tagCouponWXSC"   # 微信商城
+
 CouponBatchColName = "tagCouponBatch"
 CouponCodeColName = "tagCouponCode"
 ModuleName = "CouponDB"
diff --git a/Tool/WebCenter/Coupon/config.ini b/Tool/WebCenter/Coupon/config.ini
index d15a211..c3ee9c4 100644
--- a/Tool/WebCenter/Coupon/config.ini
+++ b/Tool/WebCenter/Coupon/config.ini
@@ -23,8 +23,16 @@
 ;CommonCards = ["zj98u2j0ud1"]
 CommonCards = []
 
+;微信商城购物key
+zyxh_wxkey = dcdce6dj
+
+;苹果appid充值key
+key_424064855 = 3ecd1
+key_815035927 = b552a
 
 
+;只允许配置IOS的APPID,如自由星河下有多个苹果appid共用则都要配置
+appid_dict = {"zyxh":["424064855", "815035927"]}
 ;----------------------------------------------------------------------------------------------------
 ;公共固定码,所有人用同一个码,每个人只能领取一次
 ;[zj98u2j0ud1]
diff --git a/Tool/WebCenter/Coupon/webapp.py b/Tool/WebCenter/Coupon/webapp.py
index 227bfe5..9e75617 100644
--- a/Tool/WebCenter/Coupon/webapp.py
+++ b/Tool/WebCenter/Coupon/webapp.py
@@ -211,42 +211,6 @@
     
     return json.dumps({"success":couponid}, ensure_ascii=False)
 
-#/api/Coupon/index.php?couponBatchId=%s&agentName=%s"
-# 涓嬭浇鎸囧畾绀煎寘鎵规 
-@myapp.route('/Coupon/CouponLoad.php')
-def LoadCouponBatch():
-    dataDict = request.GET
-    appid = dataDict.get("channel", "")     # 杩愯惀鎻愪緵鐨凙PPID锛屽嵆娓犻亾
-    if not appid:
-        mylog.debug("no appid")
-        return json.dumps({"error":"param appid"}, ensure_ascii=False)
-    couponid = dataDict.get("couponid", "")
-    if not couponid:
-        return json.dumps({"error":"param couponid"}, ensure_ascii=False)
-    
-    downFile = r".\download\%s.zip"%couponid
-    if os.path.isfile(downFile):
-        return static_file("%s.zip"%couponid, r".\download", download=True)
-    
-    dbController = CouponDB.GetDBEventCon()
-    if not dbController:
-        # 鏃犳硶鑾峰彇鏁版嵁搴�
-        mylog.debug("no dbController")
-        return json.dumps({"error":"db"}, ensure_ascii=False)
-    result, data = dbController.find(CouponDB.CouponCodeColName + "_" + appid, {'channel':appid, 'couponid':couponid})
-    if not data:
-        return json.dumps({"error":"no couponid"}, ensure_ascii=False)
-    
-    fileIO = open(r".\download\%s.txt"%couponid, 'w')
-
-    for codeInfo in data:
-        fileIO.write(codeInfo["code"] + "\n")
-    fileIO.close() 
-    
-    f = zipfile.ZipFile(downFile, 'w', zipfile.ZIP_DEFLATED)
-    f.write(r".\download\%s.txt"%couponid)
-    f.close()
-    return static_file("%s.zip"%couponid, r".\download", download=True)
 
 # 鏌ヨ鍗′娇鐢ㄦ儏鍐�
 @myapp.route('/Coupon/QueryCouponCode.php')
@@ -271,219 +235,6 @@
     
     return json.dumps(data, ensure_ascii=False)
 
-# 鍗$被鍨� 寮�澶村瓧姣嶅仛鏍囪瘑濡� g1~999浠h〃姝ゅ崱鍙兘浣跨敤涓�娆� h1~999鍗″彲浠ラ噸澶嶄娇鐢� z寮�澶翠唬琛ㄥ浐瀹氱爜
-# 鐜╁浣跨敤鍗″彿 鍙傛暟 骞冲彴 鍖烘湇 璐﹀彿 鍖烘湇閾炬帴锛圙M鐢級鍗″彿
-# http://center.xxx.com:53003/Coupon/CouponCode.php?channel=appid&code=XXX&accid=YYY&sid=222&pushurl=s222.xxx.com
-@myapp.route('/Coupon/CouponCode.php')
-def CouponCode():
-    dataDict = request.GET
-    
-    for key, value in dataDict.items():
-        mylog.debug("CouponCode key:%s  value:%s"%(key, value))
-    
-    agentName = dataDict.get("channel", "")     # 杩愯惀鎻愪緵鐨凙PPID锛屽嵆娓犻亾
-    if not agentName:
-        mylog.debug("no appid")
-        return
-    codeStr = dataDict.get("code", "")
-    if not codeStr:
-        return
-    
-    accid = dataDict.get("accid", "")
-    if not accid:
-        return
-    
-    sid = CommFunc.ToIntDef(dataDict.get("sid", 0), 0)
-    if not sid:
-        return
-    pushurl = dataDict.get("pushurl", "")
-    if not pushurl:
-        return
-    
-    # 杞寲涓烘父鎴忚处鍙� 
-    accid = "%s@%s@s%s"%(accid, agentName, sid)
-    
-    dbController = CouponDB.GetDBEventCon()
-    if not dbController:
-        # 鏃犳硶鑾峰彇鏁版嵁搴�
-        mylog.debug("no dbController")
-        return
-
-    #閫氳繃GM鎺ュ彛鍛婄煡鐜╁浣跨敤鎯呭喌
-    gmresult = {'accID':accid, 'sid':sid, 'channel':agentName}
-
-    #-----------缁熶竴鍥哄畾鐮佸鐞�----------------------
-    if codeStr in CommonCards:
-        # 涓嶅悓鍥哄畾鐮佸悇鑷彧鑳介涓�娆�
-        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)
-        
-        gmresult['status'] = 1
-        gmresult['code'] = codeStr
-        gmresult['coupontype'] = codeStr  # 缁熶竴鏍煎紡锛屾湇鍔″櫒涓嶄竴瀹氭湁鐢紝鍥哄畾鐮佹牴鎹� codeStr 鍙戝鍔�
-        
-        dbController.insert(CouponDB.CouponCodeColName + "_Common", {"code":codeStr, "accid":accid})
-        mylog.debug("common ok")
-        return SendGm(gmresult, pushurl)
-
-    result, data = dbController.find_one(CouponDB.CouponCodeColName + "_" + agentName, {"code":codeStr, "channel":agentName})
-
-    if not data:
-        #鏃犳鍗�
-        gmresult['status'] = 0
-        mylog.debug("no card")
-        return SendGm(gmresult, pushurl)
-    if int(data['status']) == 1:
-        #宸蹭娇鐢紝鍚屽崱鍙疯褰曢粯璁ゅ彲鐢紝閬垮厤鏂嚎鍙戦�佸け璐ョ殑鎯呭喌锛堟湭杩斿洖缁撴灉楠岃瘉鎯呭喌涓嬶級
-        gmresult['status'] = 2
-        mylog.debug("card used!")
-        return SendGm(gmresult, pushurl)
-    
-    result, data2 = dbController.find_one(CouponDB.CouponBatchColName, {"couponid":data["couponid"]})
-    if not data2:
-        #姝ゆ壒娆″崱宸插垹闄�
-        gmresult['status'] = 0
-        mylog.debug("no couponid")
-        return SendGm(gmresult, pushurl)
-    if int(data2['status']) == 1:
-        #鏆傚仠浣跨敤璇ユ壒娆″崱
-        gmresult['status'] = 0
-        mylog.debug("couponid frozed")
-        return SendGm(gmresult, pushurl)
-    if (data2["minserverno"] != 0 and data2["maxserverno"] != 0):
-        if int(data2["minserverno"]) > sid or int(data2["maxserverno"]) < sid:
-            #涓嶅湪鎸囧畾鍖�
-            gmresult['status'] = 0
-            mylog.debug("no sid")
-            return SendGm(gmresult, pushurl)
-    if data2["expiretime"] != "" and datetime.datetime.today() > GetDateTimeByStr(data2["expiretime"]):
-        #宸茶繃鏈�
-        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)
-    
-    data['status'] = 1
-    data['accid'] = accid
-    data['usetime'] = str(datetime.datetime.today())
-    
-    dbController.update(CouponDB.CouponCodeColName + "_" + agentName, {"code":codeStr, "channel":agentName}, data)
-    # 0 涓嶅彲鐢紝1.鍙敤鍙戞斁濂栧姳 锛�2.宸蹭娇鐢� 3.鍚岀被鍨嬪崱涓嶈兘浣跨敤涓ゆ
-    gmresult['status'] = 1
-    gmresult['code'] = codeStr
-    gmresult['coupontype'] = data["coupontype"]
-    
-    mylog.debug("card ok!")
-    return SendGm(gmresult, pushurl)
-
-
-
-def SendGm(gmresult, pushurl):
-    try:
-        # GM鎺ㄩ�佸湴鍧�
-        #GMToolPage = http://s1.yhlz.09ge.com:30001/Server/Tool.php
-        gmurl = "http://%s:%s/Server/Tool.php"%(pushurl, PushPort)
-        gmkey = PushKey
-        if not gmkey or not gmurl:
-            return
-        
-        useStatus = gmresult['status']
-        
-        gmresult['notifyMsg'] = Def_CardMsg.get(useStatus, "CodeRewardSys2")
-        
-        
-        if useStatus != 1:
-            #澶辫触绯荤粺鎻愮ず
-            pack_data = {};
-            pack_data["queryType"] = "accID"
-            pack_data["playerFind"] = gmresult["accID"]
-            pack_data["pack_type"] = "GMT_MediaCard"
-            pack_data["notifyMsg"] = gmresult['notifyMsg']
-        
-            pack_data["key"] = gmkey;
-            pack_data['coding'] = "utf8";
-        
-            #浣跨敤key鍔犲瘑
-            pack_data_dict = json.dumps(pack_data)
-            sign = md5.md5(pack_data_dict+gmkey).hexdigest()
-            post = {}
-            post['pack'] = pack_data_dict;
-            post['sign'] = sign;
-            urllib2.urlopen(gmurl, urllib.urlencode(post), 3)
-            return
-        
-        mylog.debug("SendGm:%s"%gmurl)
-        pack_data = {};
-        pack_data["queryType"] = "accID"
-        pack_data["playerList"] = gmresult["accID"]
-        pack_data["Title"] = ConfigIO.GetValue(gmresult["coupontype"], "MailTitle").decode("gbk")
-        pack_data["Text"] = ConfigIO.GetValue(gmresult["coupontype"], "MailText").decode("gbk")
-        pack_data["EndTime"] = str(datetime.datetime.today() + datetime.timedelta(days=15)).split('.')[0]
-        pack_data["Sender"] = ConfigIO.GetValue(gmresult["coupontype"], "MailSender").decode("gbk")
-
-        
-        Items =  eval(ConfigIO.GetValue(gmresult["coupontype"], "Items"))
-        pack_data["itemNums"] = ','.join([str(i) for i in range(len(Items))])
-        i = 0
-        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'
-            i += 1
-            
-        pack_data["pack_type"] = "GMT_AddPersonalCompensation"
-        pack_data["Detail"] = "cardCode:" + gmresult["code"]
-
-        pack_data["key"] = gmkey;
-        pack_data['coding'] = "utf8";
-    
-        #浣跨敤key鍔犲瘑
-        pack_data_dict = json.dumps(pack_data)
-        sign = md5.md5(pack_data_dict+gmkey).hexdigest()
-        post = {}
-        post['pack'] = pack_data_dict;
-        post['sign'] = sign;
-        result = urllib2.urlopen(gmurl, urllib.urlencode(post), 10)
-
-        content = result.read()
-        result.close()
-        
-        # 鎴愬姛鎻愮ず
-        pack_data = {};
-        pack_data["queryType"] = "accID"
-        pack_data["playerFind"] = gmresult["accID"]
-        pack_data["pack_type"] = "GMT_MediaCard"
-        pack_data["notifyMsg"] = gmresult['notifyMsg']
-    
-        pack_data["key"] = gmkey;
-        pack_data['coding'] = "utf8";
-    
-        #浣跨敤key鍔犲瘑
-        pack_data_dict = json.dumps(pack_data)
-        sign = md5.md5(pack_data_dict+gmkey).hexdigest()
-        post = {}
-        post['pack'] = pack_data_dict;
-        post['sign'] = sign;
-        urllib2.urlopen(gmurl, urllib.urlencode(post), 3)
-        
-        return content
-    except Exception, e:
-        mylog.debug("gm error %s"%e)
-    return
-    
     
 def GetDateTimeByStr(timeStr, timeFomat="%Y-%m-%d"):
     try:
@@ -494,3 +245,127 @@
     
     return
     
+
+
+#=================娓告垙鏈嶅姟鍣ㄨ褰�==========================================================
+# $arrayInsert=array( '_id'=>$orderID, 'ServerID'=>$getServer_id, 
+#                    'AccID'=>$qid, 'OrderAmount'=>$nOrderAmount, 
+#                    'OrderID'=>$orderID, 'Sign'=>$recvSign, 
+#                    'BeginOrderTime'=>date("Y-m-d H:i:s"), 'EndOrderTime'=>0, 
+#                    'IsProcess'=>0, "OrderInfo"=>$DataArray['OrderInfo']);
+#===========================================================================
+
+#=================鍚庡彴鏁版嵁璁板綍==========================================================
+# appid    鏄�    string    寰俊鍟嗗煄鐢ㄦ埛閫夋嫨鐨勫钩鍙癮ppid
+# regionid    鏄�    string    鍖烘湇ID:  s8001
+# orderid    鏄�    string    寰俊鍟嗗煄璁㈠崟鍙蜂笉鑳戒笌鍏呭�艰鍗曢噸澶�
+# passport    鏄�    string    鐜╁娓告垙甯愬彿
+# roleid    鏄�    string    瑙掕壊鍚嶇О
+# ordertitle    鏄�    string    璁㈠崟鏍囬,渚嬪:  128鍏冪ぜ鍖�
+# orderinfo    鏄�    string    璁㈠崟淇℃伅, 渚嬪:  snxxz.18
+# money    鏄�    float    浠樻鏁颁繚鐣欎袱浣嶅皬鏁�
+# ip    鏄�    string    鐜╁IP,鍙┖鍊�
+# level    鏄�    string    绛夌骇
+# viplevel    鏄�    string    VIP绛夌骇
+# time    鏄�    string    鍏呭�兼椂闂存埑 渚嬪: 1539447585
+# sign    鏄�    string    绛惧悕
+#===========================================================================
+
+#http://center.2460web.com:53002/Coupon/CouponWXBill.php
+#寰俊鍟嗗煄 鍙傛暟 ordertitle orderinfo orderid count money锛堜繚鐣欎袱浣嶅皬鏁帮級sign ip time锛堣ˉ鍙戜笉鏇存柊鏃堕棿锛�
+@myapp.route('/Coupon/CouponWXBill.php', method='POST')
+def CouponWXBill():
+    dataDict = request.POST
+    for key, value in dataDict.items():
+        mylog.debug("key:%s  value:%s"%(key, value))
+
+    channel = "zyxh"  # 闇�鏀寔澶氫釜appid锛屼竴涓鍗曚竴涓縺娲荤爜
+    orderID = dataDict.get("orderid", "")    # 璁㈠崟锛屾牴鎹暟閲忓垎鏀嚭澶氫釜璁㈠崟瀵瑰簲涓�涓縺娲荤爜
+    if not orderID:
+        return json.dumps({"error":"param orderid"}, ensure_ascii=False)
+    
+    orderInfo = dataDict.get("orderinfo", "")    # 鍟嗗搧缂栧彿
+    if not orderInfo:
+        return json.dumps({"error":"param orderInfo"}, ensure_ascii=False)
+    
+    count = int(dataDict.get("count", 0))     # 绀煎寘鏁伴噺
+    if count <= 0:
+        return json.dumps({"error":"param count"}, ensure_ascii=False)
+    
+    money = float(dataDict.get("money", 0))     # 浠锋牸
+    if money <= 0:
+        return json.dumps({"error":"param money"}, ensure_ascii=False)
+    
+    
+    timeStr = dataDict.get("time", "")     # 鍏呭�兼椂闂达紝琛ュ彂涓嶆洿鏂版椂闂�
+    if not timeStr:
+        return json.dumps({"error":"param time"}, ensure_ascii=False)
+    
+    sign = dataDict.get("sign", "")     # 鍏呭�兼椂闂达紝琛ュ彂涓嶆洿鏂版椂闂�
+    if not sign:
+        return json.dumps({"error":"param sign"}, ensure_ascii=False)
+    
+    key = ConfigIO.GetValue("Coupon", channel + "_wxkey")
+    calcSign = md5.md5(str(count) + orderID + timeStr + key).hexdigest()
+    if calcSign != sign:
+        mylog.debug("error sign=%s"%calcSign)
+        return json.dumps({"error":"sign"}, ensure_ascii=False)
+    
+    
+    dbController = CouponDB.GetDBEventCon()
+    if not dbController:
+        # 鏃犳硶鑾峰彇鏁版嵁搴�
+        mylog.debug("no dbController")
+        return json.dumps({"error":"db"}, ensure_ascii=False)
+    
+    # 楠岃瘉鏄惁閲嶅璁㈠崟
+    result = dbController.find(CouponDB.CouponWXColName, {"realorderid":orderID})
+    if result[1]:
+        codeList = []
+        for cardInfo in result[1]:
+            codeList.append(cardInfo['code'])
+        #return json.dumps({"error":"orderid repeat"}, ensure_ascii=False)
+        mylog.debug("orderid repeat")
+        return json.dumps({orderID:codeList}, ensure_ascii=False)
+    
+    #鎵归噺鎻掑叆鍗″彿
+    tmpCodeList = []    # 鍗′俊鎭�
+    codeList = []   # 鍗″彿
+    for i in xrange(count):
+        tmpCodeDoc = {}
+        # 鍓�3浣嶄负绫诲瀷鏍囪瘑
+        tmpCodeDoc['code'] = "wx" + md5.md5( channel + str(i) + orderID + timeStr + str(i) + \
+                                     str(random.randint(1000, 2000000))).hexdigest()[5:17] + \
+                                     random.choice('1234567890abcdefghijklmnopqrstuvwxyz') +\
+                                     random.choice('1234567890abcdefghijklmnopqrstuvwxyz') 
+        tmpCodeDoc['operateid'] = channel   # appid缁勫悎鏍囪瘑 涓�瀹惰繍钀ュ晢鍙兘鏈夊涓猘ppid
+        tmpCodeDoc['status'] = 0
+        tmpCodeDoc['usetime'] = ""
+        
+        tmpCodeDoc['count'] = count
+        
+        tmpCodeDoc['appid'] = ""    # 璁板綍鐢�
+        tmpCodeDoc['serverid'] = ""    # 璁板綍鐢�
+        tmpCodeDoc['realorderid'] = orderID    # 璐墿鐨刼rderID锛屼細鏍规嵁鏁伴噺鎷嗚В
+        tmpCodeDoc['orderid'] = orderID + "_" + str(i+1)    # 鎷嗚В鐨刼rderID锛屼細鏍规嵁鏁伴噺鎷嗚В
+        tmpCodeDoc['accid'] = ""
+        tmpCodeDoc['roleid'] = ""
+        tmpCodeDoc['ordertitle'] = dataDict.get("ordertitle", "")
+        tmpCodeDoc['orderinfo'] = orderInfo
+        tmpCodeDoc['money'] = money
+        tmpCodeDoc['ip'] = dataDict.get("ip", "")
+        tmpCodeDoc['level'] = ""
+        tmpCodeDoc['viplevel'] = ""
+        tmpCodeDoc['createtime'] = timeStr
+        
+        tmpCodeList.append(tmpCodeDoc)
+        codeList.append(tmpCodeDoc['code'])
+        
+        
+    result = dbController.insert(CouponDB.CouponWXColName, tmpCodeList)
+    if not result:
+        return json.dumps({"error":"insert card"}, ensure_ascii=False)
+
+    mylog.debug("鎻掑叆鎴愬姛%s"%tmpCodeList)
+   
+    return json.dumps({orderID:codeList}, ensure_ascii=False)
diff --git a/Tool/WebCenter/CouponCode/CouponDB.py b/Tool/WebCenter/CouponCode/CouponDB.py
index 395239b..911912b 100644
--- a/Tool/WebCenter/CouponCode/CouponDB.py
+++ b/Tool/WebCenter/CouponCode/CouponDB.py
@@ -21,6 +21,8 @@
 
 g_dbController = None
 
+CouponWXColName = "tagCouponWXSC"   # 微信商城
+
 CouponBatchColName = "tagCouponBatch"
 CouponCodeColName = "tagCouponCode"
 ModuleName = "CouponDB"
diff --git a/Tool/WebCenter/CouponCode/main.py b/Tool/WebCenter/CouponCode/main.py
index 5e52cf1..0e8b363 100644
--- a/Tool/WebCenter/CouponCode/main.py
+++ b/Tool/WebCenter/CouponCode/main.py
@@ -33,7 +33,8 @@
     
     CenterPort = int(ReadConfig.ReadConfig(os.getcwd() + "\\..\\Coupon\\config.ini").GetValue("Coupon", "CodePort", 53003))
     
-    run(host='0.0.0.0', port=CenterPort, app=webapp.myapp, server='waitress')
+    # 此处不要用多线程,不然会导致同时间复用的情况,造成刷单
+    run(host='0.0.0.0', port=CenterPort, app=webapp.myapp)
     return
 
 if __name__ == '__main__':
diff --git a/Tool/WebCenter/CouponCode/webapp.py b/Tool/WebCenter/CouponCode/webapp.py
index 2eab82e..333ab34 100644
--- a/Tool/WebCenter/CouponCode/webapp.py
+++ b/Tool/WebCenter/CouponCode/webapp.py
@@ -97,10 +97,23 @@
     f.close()
     return static_file("%s.zip"%couponid, r".\download", download=True)
 
+
+#================瀹㈡埛绔姹傚弬鏁�===============================================================
+# 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寮�澶翠唬琛ㄥ浐瀹氱爜
+# 鍗$被鍨� 寮�澶村瓧姣嶅仛鏍囪瘑濡� 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&spid=jisu
+# http://center.xxx.com:53003/Coupon/CouponCode.php
 @myapp.route('/Coupon/CouponCode.php')
 def CouponCode():
     dataDict = request.GET
@@ -118,9 +131,12 @@
     
     spID = dataDict.get("spid", "")
     if not spID:
-        mylog.debug("no spid")
-        return
-    
+        tdict = {"jisugame":"jisu", 'spxjgame':'sipu', 'mrgame':'maoer',
+                 "jisugameios":"jisu", 'spyxxjios':'sipu', 'mrgameios':'maoer'}
+        
+        # 娌′紶鐨勮瘽榛樿鍜宎ppid涓�鏍�
+        spID = tdict.get(agentName, agentName)
+        
     accid = dataDict.get("accid", "")
     if not accid:
         return
@@ -162,6 +178,39 @@
         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())
+        
+        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:
@@ -326,3 +375,77 @@
     
     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'] = wxdata['usetime'] 
+        
+        key = ConfigIO.GetValue("Coupon", "%s_wxkey"%operateID)
+        #md5(appid=$appid&regionid=$regionid&passport=$passport&&money=$money&time=$time$app_secret) 
+        sign = md5.md5("appid=%s&regionid=%s&passport=%s&money=%s&time=%s%s"%(\
+                    post['appid'], post['regionid'], post['passport'], post['money'], post['time'], key)).hexdigest()
+        
+        post['Sign'] = sign
+        result = urllib2.urlopen(billurl, urllib.urlencode(post), 3)
+        mylog.debug("SendDataCollectorBillInfo result %s"%result.read())
+
+    except Exception, e:
+        mylog.debug("SendDataCollectorBillInfo error %s"%e)
+
+

--
Gitblit v1.8.0