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:time
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"
@@ -116,6 +128,7 @@
# 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():
@@ -128,14 +141,9 @@
    codeStr = dataDict.get("code", "")
    if not codeStr:
        return
    codeStr = codeStr.strip()
    #只是用来拼接账号
    spID = dataDict.get("spid", "")
    if not spID:
        tdict = {"jisugame":"jisu", 'spxjgame':'sipu', 'mrgame':'maoer',
                 "jisugameios":"jisu", 'spyxxjios':'sipu', 'mrgameios':'maoer'}
        # 没传的话默认和appid一样
        spID = tdict.get(agentName, agentName)
        
    accid = dataDict.get("accid", "")
    if not accid:
@@ -149,7 +157,21 @@
        return
    
    # 转化为游戏账号 
    accid = "%s@%s@s%s"%(accid, spID, 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:
@@ -161,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
@@ -195,7 +223,7 @@
        
        wxdata['status'] = 1
        wxdata['accid'] = dataDict.get("accid", "")     # 此处用原始账号
        wxdata['usetime'] = str(datetime.datetime.today())
        wxdata['usetime'] = str(datetime.datetime.today()).split(".")[0]
        
        wxdata['appid'] = agentName
        wxdata['serverid'] = 's%s'%sid
@@ -207,12 +235,11 @@
            dbController.update(CouponDB.CouponWXColName, {"code":codeStr, "operateid":operateID}, wxdata)
            # 通知后台记录
            SendDataCollectorBillInfo(wxdata, pushurl, operateID)
        return
        return
    
    #-----------批量兑换码处理----------------------
    #-----------批量兑换码处理,同类型只领取一次----------------------
    result, data = dbController.find_one(CouponDB.CouponCodeColName + "_" + agentName, {"code":codeStr, "channel":agentName})
    if not data:
        #无此卡
        gmresult['status'] = 0
@@ -222,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"]})
@@ -246,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())
@@ -270,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:
@@ -322,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"
@@ -337,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()
        
        # 成功提示
@@ -360,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
@@ -434,16 +486,17 @@
        post['ip'] = wxdata['ip'] 
        post['level'] = wxdata['level'] 
        post['viplevel'] = wxdata['viplevel'] 
        post['time'] = wxdata['usetime']
        post['time'] = int(time.time())
        
        key = ConfigIO.GetValue("Coupon", "%s_wxkey"%operateID)
        key = ConfigIO.GetValue("Coupon", "key_%s"%post['appid'])
        #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())
        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)