|  |  | 
 |  |  | import os.path
 | 
 |  |  | import zipfile
 | 
 |  |  | import time
 | 
 |  |  | import traceback
 | 
 |  |  | 
 | 
 |  |  | # get: request.query.username request.GET.get('username','')
 | 
 |  |  | # post: request.forms.get('username')  request.POST.get('username')
 | 
 |  |  | 
 |  |  | # GM端口
 | 
 |  |  | PushPort = ConfigIO.GetValue("Coupon", "PushPort")
 | 
 |  |  | PushKey = ConfigIO.GetValue("Coupon", "PushKey")
 | 
 |  |  | PushTimeout = ConfigIO.GetInt("Coupon", "PushTimeout", 5)
 | 
 |  |  | CommonCards = eval(ConfigIO.GetValue("Coupon", "CommonCards"))
 | 
 |  |  |                  | 
 |  |  |          | 
 |  |  | Def_CardMsg = {
 | 
 |  |  |                0:"CodeRewardSys2", #  兑换码无效
 | 
 |  |  |                1: "CodeRewardSys1", #   兑换卡奖励已发至邮件
 | 
 |  |  |                2:"CodeRewardSys3", #  兑换码已使用过
 | 
 |  |  |                3:"CodeRewardSys4",  # 同类型兑换码只能使用一次
 | 
 |  |  |          }
 | 
 |  |  |                  | 
 |  |  |                  | 
 |  |  | 
 | 
 |  |  | # 发放奖励邮件内容json,utf8编码
 | 
 |  |  | f = open(os.getcwd() + "\\..\\Coupon\\CodeMail.json", "r")
 | 
 |  |  | MailJson = eval(f.read())
 | 
 |  |  | f.close()
 | 
 |  |  | 
 | 
 |  |  | # 礼包使用返回结果码定义
 | 
 |  |  | ErrCode_OK = 0 # 成功,非0的码均代表错误
 | 
 |  |  | ErrCode_Invalid = 1 # 兑换码无效
 | 
 |  |  | ErrCode_Used = 2 # 礼包码已被使用
 | 
 |  |  | ErrCode_TypeUsed = 3 # 已经使用过同类型的礼包码
 | 
 |  |  | ErrCode_LVLimit = 4 # 等级不足
 | 
 |  |  | ErrCode_VIPLVLimit = 5 # VIP等级不足
 | 
 |  |  | ErrCode_ParamErr = 97 # 参数错误
 | 
 |  |  | ErrCode_FrequentRequest = 98 # 频繁请求
 | 
 |  |  | ErrCode_OtherErr = 99 # 其他错误,比如运行错误等
 | 
 |  |  | 
 | 
 |  |  | # 礼包码处理结果码信息 {code:["码信息说明", "给玩家的系统提示key"], ...}
 | 
 |  |  | ErrCodeMsgInfo = {
 | 
 |  |  |                   ErrCode_OK:["OK", "CodeRewardSys1"],
 | 
 |  |  |                   ErrCode_Invalid:["code invalid", "CodeRewardSys2"],
 | 
 |  |  |                   ErrCode_Used:["code has been used", "CodeRewardSys3"],
 | 
 |  |  |                   ErrCode_TypeUsed:["You has been used this Giftcode type", "CodeRewardSys4"],
 | 
 |  |  |                   ErrCode_LVLimit:["level limit", "LvErr"],
 | 
 |  |  |                   ErrCode_VIPLVLimit:["vip level limit", "VipLevel"],
 | 
 |  |  |                   ErrCode_ParamErr:["parameter error", ""],
 | 
 |  |  |                   ErrCode_FrequentRequest:["frequent request", ""],
 | 
 |  |  |                   ErrCode_OtherErr:["other error", ""],
 | 
 |  |  |                   }
 | 
 |  |  | 
 | 
 |  |  | def CouponCodeResponse(errcode, msgEx=""):
 | 
 |  |  |     errmsg = ""
 | 
 |  |  |     if errcode in ErrCodeMsgInfo:
 | 
 |  |  |         errmsg = ErrCodeMsgInfo[errcode][0]
 | 
 |  |  |     if msgEx:
 | 
 |  |  |         errmsg = "%s : %s" % (errmsg, msgEx)
 | 
 |  |  |     resData = {"errcode":errcode, "errmsg":errmsg}
 | 
 |  |  |     if errcode != ErrCode_OK:
 | 
 |  |  |         mylog.error("resError: %s" % str(resData))
 | 
 |  |  |     else:
 | 
 |  |  |         mylog.debug("resData: %s" % str(resData))
 | 
 |  |  |         #mylog.info("resData: %s" % str(resData))
 | 
 |  |  |     return json.dumps(resData, ensure_ascii=False)
 | 
 |  |  | 
 | 
 |  |  |                 
 | 
 |  |  | 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"
 | 
 |  |  | 
 |  |  |     if not couponid:
 | 
 |  |  |         return json.dumps({"error":"param couponid"}, ensure_ascii=False)
 | 
 |  |  |     
 | 
 |  |  |     downFile = r".\download\%s.zip"%couponid
 | 
 |  |  |     downFile = r".\download\%s.zip" % couponid
 | 
 |  |  |     if os.path.isfile(downFile):
 | 
 |  |  |         return static_file("%s.zip"%couponid, r".\download", download=True)
 | 
 |  |  |         return static_file("%s.zip" % couponid, r".\download", download=True)
 | 
 |  |  |     
 | 
 |  |  |     dbController = CouponDB.GetDBEventCon()
 | 
 |  |  |     if not dbController:
 | 
 |  |  | 
 |  |  |     if not data:
 | 
 |  |  |         return json.dumps({"error":"no couponid"}, ensure_ascii=False)
 | 
 |  |  |     
 | 
 |  |  |     fileIO = open(r".\download\%s.txt"%couponid, 'w')
 | 
 |  |  |     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.write(r".\download\%s.txt" % couponid)
 | 
 |  |  |     f.close()
 | 
 |  |  |     return static_file("%s.zip"%couponid, r".\download", download=True)
 | 
 |  |  |     return static_file("%s.zip" % couponid, r".\download", download=True)
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | #================客户端请求参数===============================================================
 | 
 |  |  | 
 |  |  | # 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():
 | 
 |  |  |         mylog.debug("CouponCode key:%s  value:%s"%(key, value))
 | 
 |  |  |         mylog.debug("CouponCode key:%s  value:%s" % (key, value))
 | 
 |  |  |     
 | 
 |  |  |     agentName = dataDict.get("channel", "")     # 运营提供的APPID,即渠道
 | 
 |  |  |     if not agentName:
 | 
 |  |  |         mylog.debug("no appid")
 | 
 |  |  |         return
 | 
 |  |  |         return CouponCodeResponse(ErrCode_ParamErr, "no channel appid")
 | 
 |  |  |     codeStr = dataDict.get("code", "")
 | 
 |  |  |     if not codeStr:
 | 
 |  |  |         return
 | 
 |  |  |      | 
 |  |  |         return CouponCodeResponse(ErrCode_ParamErr, "no code")
 | 
 |  |  |     codeStr = codeStr.strip()
 | 
 |  |  |     #只是用来拼接账号
 | 
 |  |  |     spID = dataDict.get("spid", "")
 | 
 |  |  |          | 
 |  |  |     if not spID:
 | 
 |  |  |         return CouponCodeResponse(ErrCode_ParamErr, "no spid")
 | 
 |  |  |      | 
 |  |  |     accid = dataDict.get("accid", "")
 | 
 |  |  |     if not accid:
 | 
 |  |  |         return
 | 
 |  |  |         return CouponCodeResponse(ErrCode_ParamErr, "no accid")
 | 
 |  |  |     
 | 
 |  |  |     sid = CommFunc.ToIntDef(dataDict.get("sid", 0), 0)
 | 
 |  |  |     if not sid:
 | 
 |  |  |         return
 | 
 |  |  |         return CouponCodeResponse(ErrCode_ParamErr, "no sid")
 | 
 |  |  |     pushurl = dataDict.get("pushurl", "")
 | 
 |  |  |     if not pushurl:
 | 
 |  |  |         return
 | 
 |  |  |         return CouponCodeResponse(ErrCode_ParamErr, "no pushurl")
 | 
 |  |  |     
 | 
 |  |  |     # 转化为游戏账号 
 | 
 |  |  |     accid = "%s@%s@s%s"%(accid.lower(), 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 CouponCodeResponse(ErrCode_FrequentRequest)
 | 
 |  |  |              | 
 |  |  |         AccID_Cache_Dict[accid] = int(time.time())
 | 
 |  |  |     except:
 | 
 |  |  |         pass
 | 
 |  |  |      | 
 |  |  |     
 | 
 |  |  |     dbController = CouponDB.GetDBEventCon()
 | 
 |  |  |     if not dbController:
 | 
 |  |  |         # 无法获取数据库
 | 
 |  |  |         mylog.debug("no dbController")
 | 
 |  |  |         return
 | 
 |  |  | 
 | 
 |  |  |         return CouponCodeResponse(ErrCode_OtherErr, "no dbController")
 | 
 |  |  |      | 
 |  |  |     #通过GM接口告知玩家使用情况
 | 
 |  |  |     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)
 | 
 |  |  |             return SendGm(ErrCode_Used, gmresult, pushurl)[1]
 | 
 |  |  |         
 | 
 |  |  |         gmresult['status'] = 1
 | 
 |  |  |         commCheckStatus = CommCheck(dataDict, codeStr)
 | 
 |  |  |         if commCheckStatus != None:
 | 
 |  |  |             return SendGm(commCheckStatus, gmresult, pushurl)[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)
 | 
 |  |  | 
 | 
 |  |  |         retCode, retMsg = SendGm(ErrCode_OK, gmresult, pushurl)
 | 
 |  |  |         if retCode == ErrCode_OK:
 | 
 |  |  |             dbController.insert(CouponDB.CouponCodeColName + "_Common", {"code":codeStr, "accid":accid})
 | 
 |  |  |             mylog.debug("common ok")
 | 
 |  |  |         return retMsg
 | 
 |  |  |      | 
 |  |  |     #-----------微信商城----------------------
 | 
 |  |  |     if codeStr.startswith('wx'):
 | 
 |  |  |         operateID = GetOperateID(agentName)
 | 
 |  |  |         if not operateID:
 | 
 |  |  |             mylog.debug("wx no appid  = %s"%agentName)
 | 
 |  |  |             return
 | 
 |  |  |             return CouponCodeResponse(ErrCode_OtherErr, "wx no appid  = %s" % agentName)
 | 
 |  |  |         result, wxdata = dbController.find_one(CouponDB.CouponWXColName, {"code":codeStr, "operateid":operateID})
 | 
 |  |  |         if not wxdata:
 | 
 |  |  |             return
 | 
 |  |  |             return CouponCodeResponse(ErrCode_OtherErr, "not wxdata code(%s) operateID(%s)" % (codeStr, operateID))
 | 
 |  |  |         
 | 
 |  |  |         if int(wxdata['status']) == 1:
 | 
 |  |  |             gmresult['status'] = 2
 | 
 |  |  |             mylog.debug("wxcard used!")
 | 
 |  |  |             return SendGm(gmresult, pushurl)
 | 
 |  |  |             return SendGm(ErrCode_Used, gmresult, pushurl)[1]
 | 
 |  |  |         
 | 
 |  |  |         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['serverid'] = 's%s' % sid
 | 
 |  |  |         wxdata['roleid'] = dataDict.get("roleid", "")
 | 
 |  |  |         wxdata['level'] = dataDict.get("level", "")
 | 
 |  |  |         wxdata['viplevel'] = dataDict.get("viplevel", "")
 | 
 |  |  | 
 |  |  |             dbController.update(CouponDB.CouponWXColName, {"code":codeStr, "operateid":operateID}, wxdata)
 | 
 |  |  |             # 通知后台记录
 | 
 |  |  |             SendDataCollectorBillInfo(wxdata, pushurl, operateID)
 | 
 |  |  |         return  | 
 |  |  |             return CouponCodeResponse(ErrCode_OK)
 | 
 |  |  |         return CouponCodeResponse(ErrCode_OtherErr, "SendWXBill error")
 | 
 |  |  |     
 | 
 |  |  |     #-----------批量兑换码处理,同类型可重复领取----------------------
 | 
 |  |  |     if codeStr.startswith('h'):
 | 
 |  |  |         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)
 | 
 |  |  |          | 
 |  |  |         #可重复领取则不验证同批次卡
 | 
 |  |  |         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)
 | 
 |  |  | 
 | 
 |  |  |     #-----------批量兑换码处理,同类型只领取一次----------------------
 | 
 |  |  |     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)
 | 
 |  |  |         return SendGm(ErrCode_Invalid, gmresult, pushurl)[1]
 | 
 |  |  |     if int(data['status']) == 1:
 | 
 |  |  |         #已使用,同卡号记录默认可用,避免断线发送失败的情况(未返回结果验证情况下)
 | 
 |  |  |         gmresult['status'] = 2
 | 
 |  |  |         mylog.debug("card used!")
 | 
 |  |  |         return SendGm(gmresult, pushurl)
 | 
 |  |  |         return SendGm(ErrCode_Used, gmresult, pushurl)[1]
 | 
 |  |  |          | 
 |  |  |     couponType = data["coupontype"]
 | 
 |  |  |     commCheckStatus = CommCheck(dataDict, data["coupontype"])
 | 
 |  |  |     if commCheckStatus != None:
 | 
 |  |  |         return SendGm(commCheckStatus, gmresult, pushurl)[1]
 | 
 |  |  |     
 | 
 |  |  |     result, data2 = dbController.find_one(CouponDB.CouponBatchColName, {"couponid":data["couponid"]})
 | 
 |  |  |     if not data2:
 | 
 |  |  |         #此批次卡已删除
 | 
 |  |  |         gmresult['status'] = 0
 | 
 |  |  |         mylog.debug("no couponid")
 | 
 |  |  |         return SendGm(gmresult, pushurl)
 | 
 |  |  |         return SendGm(ErrCode_Invalid, gmresult, pushurl)[1]
 | 
 |  |  |     if int(data2['status']) == 1:
 | 
 |  |  |         #暂停使用该批次卡
 | 
 |  |  |         gmresult['status'] = 0
 | 
 |  |  |         mylog.debug("couponid frozed")
 | 
 |  |  |         return SendGm(gmresult, pushurl)
 | 
 |  |  |         return SendGm(ErrCode_Invalid, gmresult, pushurl)[1]
 | 
 |  |  |     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)
 | 
 |  |  |             return SendGm(ErrCode_Invalid, gmresult, pushurl)[1]
 | 
 |  |  |     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)
 | 
 |  |  |         return SendGm(ErrCode_Invalid, gmresult, pushurl)[1]
 | 
 |  |  |     
 | 
 |  |  |     prefix = "" # 固定前缀
 | 
 |  |  |     if couponType in MailJson:
 | 
 |  |  |         mailInfo = MailJson[couponType]
 | 
 |  |  |         prefix = mailInfo.get("Prefix", "")
 | 
 |  |  |     elif ConfigIO.HasSection(couponType):
 | 
 |  |  |         if ConfigIO.HasOption(couponType, "Prefix"):
 | 
 |  |  |             prefix = ConfigIO.GetValue(couponType, "Prefix")
 | 
 |  |  |              | 
 |  |  |     # h 开头的卡类型可重复使用
 | 
 |  |  |     if not codeStr.startswith(prefix + 'h'):
 | 
 |  |  |         #再查一次是否用过此批次的其他卡,  | 
 |  |  |         result, data3 = dbController.find_one(CouponDB.CouponCodeColName + "_" + agentName, \
 | 
 |  |  |                                               {"coupontype":data["coupontype"], "accid":accid})
 | 
 |  |  |         if data3:
 | 
 |  |  |             #用过同类卡,已记录过不再做新记录
 | 
 |  |  |             gmresult['coupontype'] = data["coupontype"]
 | 
 |  |  |             gmresult['code'] = codeStr
 | 
 |  |  |             mylog.debug("use again")
 | 
 |  |  |             return SendGm(ErrCode_TypeUsed, gmresult, pushurl)[1]
 | 
 |  |  |          | 
 |  |  |     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)
 | 
 |  |  |     retCode, retMsg = SendGm(ErrCode_OK, gmresult, pushurl)
 | 
 |  |  |     if retCode == ErrCode_OK:
 | 
 |  |  |         dbController.update(CouponDB.CouponCodeColName + "_" + agentName, {"code":codeStr, "channel":agentName}, data)
 | 
 |  |  |         mylog.debug("card ok!")
 | 
 |  |  |     return retMsg
 | 
 |  |  | 
 | 
 |  |  | def CommCheck(dataDict, coupontype):
 | 
 |  |  |     ## 通用常规检查
 | 
 |  |  |      | 
 |  |  |     if coupontype in MailJson:
 | 
 |  |  |         mailInfo = MailJson[coupontype]
 | 
 |  |  |         lvLimit = mailInfo.get("LV", 0)
 | 
 |  |  |         vipLVLimit = mailInfo.get("VIPLV", 0)
 | 
 |  |  |     else:
 | 
 |  |  |         lvLimit = ConfigIO.GetInt(coupontype, "LV")
 | 
 |  |  |         vipLVLimit = ConfigIO.GetInt(coupontype, "VIPLV")
 | 
 |  |  |          | 
 |  |  |     # 使用等级
 | 
 |  |  |     playerLV = CommFunc.ToIntDef(dataDict.get("level", 0))
 | 
 |  |  |     if lvLimit > 0 and playerLV < lvLimit:
 | 
 |  |  |         mylog.debug("playerLV(%s) < lvLimit(%s)" % (playerLV, lvLimit))
 | 
 |  |  |         return ErrCode_LVLimit
 | 
 |  |  |      | 
 |  |  |     # vip等级相关
 | 
 |  |  |     playerVIPLV = CommFunc.ToIntDef(dataDict.get("viplevel", 0))
 | 
 |  |  |     if vipLVLimit > 0 and playerVIPLV < vipLVLimit:
 | 
 |  |  |         mylog.debug("playerVIPLV(%s) < vipLVLimit(%s)" % (playerVIPLV, vipLVLimit))
 | 
 |  |  |         return ErrCode_VIPLVLimit
 | 
 |  |  |      | 
 |  |  |     return
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | def SendGm(gmresult, pushurl):
 | 
 |  |  | def SendGm(errcode, gmresult, pushurl):
 | 
 |  |  |     try:
 | 
 |  |  |         # GM推送地址
 | 
 |  |  |         #GMToolPage = http://s1.yhlz.09ge.com:30001/Server/Tool.php
 | 
 |  |  |         gmurl = "http://%s:%s/Server/Tool.php"%(pushurl, PushPort)
 | 
 |  |  |         # 兼容两种入口,一种客户端只发服务器域名的,一种GM工具直接读取的服务器GM工具地址
 | 
 |  |  |         if pushurl.endswith("Tool.php"):
 | 
 |  |  |             gmurl = pushurl
 | 
 |  |  |         else:
 | 
 |  |  |             gmurl = "http://%s:%s/Server/Tool.php" % (pushurl, PushPort)             | 
 |  |  |         gmkey = PushKey
 | 
 |  |  |         if not gmkey or not gmurl:
 | 
 |  |  |             return
 | 
 |  |  |         if not gmkey or not PushPort:
 | 
 |  |  |             return ErrCode_OtherErr, CouponCodeResponse(ErrCode_OtherErr, "no PushKey or not PushPort")
 | 
 |  |  |         mylog.debug("SendGm:%s" % gmurl)
 | 
 |  |  |         
 | 
 |  |  |         useStatus = gmresult['status']
 | 
 |  |  |         notifyMsg = ""
 | 
 |  |  |         if errcode in ErrCodeMsgInfo:
 | 
 |  |  |             notifyMsg = ErrCodeMsgInfo[errcode][1]
 | 
 |  |  |         if not notifyMsg:
 | 
 |  |  |             notifyMsg = "CodeRewardSys2"
 | 
 |  |  |              | 
 |  |  |         if notifyMsg:
 | 
 |  |  |             gmtData = {"queryType":"accID", "playerFind":gmresult["accID"], "notifyMsg":notifyMsg}
 | 
 |  |  |             SendGMTCMD(gmurl, gmtData, gmkey, "GMT_MediaCard")
 | 
 |  |  |              | 
 |  |  |         if errcode != ErrCode_OK:
 | 
 |  |  |             return errcode, CouponCodeResponse(errcode)
 | 
 |  |  |         
 | 
 |  |  |         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 = {};
 | 
 |  |  |         coupontype = gmresult["coupontype"]
 | 
 |  |  |         if coupontype in MailJson:
 | 
 |  |  |             mailInfo = MailJson[coupontype]
 | 
 |  |  |             mailTitle = mailInfo.get("MailTitle", "MailTitle")
 | 
 |  |  |             mailText = mailInfo.get("MailText", "")
 | 
 |  |  |             mailSender = mailInfo.get("MailSender", "System")
 | 
 |  |  |             mailItems = mailInfo.get("Items", [])
 | 
 |  |  |         else:
 | 
 |  |  |             mailTitle = ConfigIO.GetValue(gmresult["coupontype"], "MailTitle").decode("gbk")
 | 
 |  |  |             mailText = ConfigIO.GetValue(gmresult["coupontype"], "MailText").decode("gbk")
 | 
 |  |  |             mailSender = ConfigIO.GetValue(gmresult["coupontype"], "MailSender").decode("gbk")
 | 
 |  |  |             mailItems = eval(ConfigIO.GetValue(gmresult["coupontype"], "Items"))
 | 
 |  |  |         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["Title"] = mailTitle
 | 
 |  |  |         pack_data["Text"] = mailText
 | 
 |  |  |         pack_data["EndTime"] = str(datetime.datetime.today() + datetime.timedelta(days=15)).split('.')[0]
 | 
 |  |  |         pack_data["Sender"] = ConfigIO.GetValue(gmresult["coupontype"], "MailSender").decode("gbk")
 | 
 |  |  | 
 | 
 |  |  |         pack_data["Sender"] = mailSender
 | 
 |  |  |         
 | 
 |  |  |         Items =  eval(ConfigIO.GetValue(gmresult["coupontype"], "Items"))
 | 
 |  |  |         Items = mailItems
 | 
 |  |  |         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'
 | 
 |  |  |             pack_data["ItemID%s" % i] = str(itemList[0])
 | 
 |  |  |             pack_data["ItemCnt%s" % i] = str(itemList[1])
 | 
 |  |  |             pack_data["IsBind%s" % i] = str(itemList[2] if len(itemList) > 2 else 0)
 | 
 |  |  |             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']
 | 
 |  |  |         ResultType = SendGMTCMD(gmurl, pack_data, gmkey, "GMT_AddPersonalCompensation")
 | 
 |  |  |         if ResultType == 0:
 | 
 |  |  |             return ErrCode_OK, CouponCodeResponse(ErrCode_OK)
 | 
 |  |  |         else:
 | 
 |  |  |             return ErrCode_OtherErr, CouponCodeResponse(ErrCode_OtherErr, "ResultType error is %s" % ResultType)
 | 
 |  |  |     except BaseException:
 | 
 |  |  |         mylog.error("SendGm error %s" % traceback.format_exc())
 | 
 |  |  |     return ErrCode_OtherErr, CouponCodeResponse(ErrCode_OtherErr, "gm error")
 | 
 |  |  | 
 | 
 |  |  | def SendGMTCMD(gmurl, gmtData, gmkey, pack_type):
 | 
 |  |  |     ## 发送GM工具命令
 | 
 |  |  |     pack_data = {}
 | 
 |  |  |     if gmtData and isinstance(gmtData, dict):
 | 
 |  |  |         pack_data.update(gmtData)
 | 
 |  |  |     pack_data["pack_type"] = pack_type
 | 
 |  |  |     pack_data["key"] = gmkey
 | 
 |  |  |     pack_data['coding'] = "utf8"
 | 
 |  |  |     
 | 
 |  |  |         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
 | 
 |  |  |      | 
 |  |  |     #使用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), PushTimeout)
 | 
 |  |  |     retContent = result.read()
 | 
 |  |  |     resultDict = json.loads(retContent)
 | 
 |  |  |     result.close()
 | 
 |  |  |     ResultType = resultDict.get("ResultType", 5) # 5未知错误
 | 
 |  |  |     return ResultType
 | 
 |  |  | 
 | 
 |  |  |     
 | 
 |  |  | def GetDateTimeByStr(timeStr, timeFomat="%Y-%m-%d"):
 | 
 |  |  |     try:
 | 
 |  |  |         return datetime.datetime.strptime(timeStr, timeFomat)
 | 
 |  |  |     
 | 
 |  |  |     except:
 | 
 |  |  |         mylog.debug("GetDateTimeByStr error %s"%timeStr)
 | 
 |  |  |         mylog.debug("GetDateTimeByStr error %s" % timeStr)
 | 
 |  |  |     
 | 
 |  |  |     return
 | 
 |  |  |     
 | 
 |  |  | 
 |  |  | # 微信入口充值
 | 
 |  |  | def SendWXBill(wxdata, pushurl):
 | 
 |  |  |     try:
 | 
 |  |  |         billurl = "http://%s/api/exchange/index.php"%pushurl
 | 
 |  |  |         billurl = "http://%s/api/exchange/index.php" % pushurl
 | 
 |  |  | 
 | 
 |  |  |         post = {}
 | 
 |  |  |         post['AccountID'] = wxdata['accid']
 | 
 |  |  | 
 |  |  |         post['OrderInfo'] = wxdata['orderinfo'] 
 | 
 |  |  |         post['OperatorID'] = wxdata['appid'] 
 | 
 |  |  |         
 | 
 |  |  |         key = ConfigIO.GetValue("Coupon", "key_%s"%post['OperatorID'])
 | 
 |  |  |         key = ConfigIO.GetValue("Coupon", "key_%s" % post['OperatorID'])
 | 
 |  |  |         # $sign=md5($AccountID.$OrderAmount.$BillNO.$RegionName.$key)
 | 
 |  |  |         mylog.debug("appid = %s  key = %s"%(post['OperatorID'], key))
 | 
 |  |  |         mylog.debug("appid = %s  key = %s" % (post['OperatorID'], key))
 | 
 |  |  |         
 | 
 |  |  |         sign = md5.md5(post['AccountID'] + str(post['OrderAmount']) + post['BillNO'] + post['RegionName'] + key).hexdigest()
 | 
 |  |  |         
 | 
 |  |  | 
 |  |  |         result = urllib2.urlopen(billurl, urllib.urlencode(post), 3)
 | 
 |  |  |         resultDict = json.loads(result.read())
 | 
 |  |  |         
 | 
 |  |  |         mylog.debug("resultDict = %s "%(resultDict))
 | 
 |  |  |         mylog.debug("resultDict = %s " % (resultDict))
 | 
 |  |  | 
 | 
 |  |  |         if int(resultDict["errorcode"]) > 0:
 | 
 |  |  |             return True
 | 
 |  |  |     except Exception, e:
 | 
 |  |  |         mylog.info("SendWXBill error %s"%e)
 | 
 |  |  |         mylog.info("SendWXBill error %s" % e)
 | 
 |  |  |     return False
 | 
 |  |  | 
 | 
 |  |  | # 通知后台数据中心记录
 | 
 |  |  | 
 |  |  |         post['regionid'] = wxdata['serverid'] 
 | 
 |  |  |         post['orderid'] = wxdata['orderid'] 
 | 
 |  |  |         post['passport'] = wxdata['accid'] 
 | 
 |  |  |         post['roleid'] =  wxdata['roleid']
 | 
 |  |  |         post['roleid'] = wxdata['roleid']
 | 
 |  |  |         post['ordertitle'] = wxdata['ordertitle'].encode("UTF8")
 | 
 |  |  |         post['orderinfo'] = wxdata['orderinfo']
 | 
 |  |  |         post['money'] = wxdata['money'] 
 | 
 |  |  | 
 |  |  |         post['viplevel'] = wxdata['viplevel'] 
 | 
 |  |  |         post['time'] = int(time.time())
 | 
 |  |  |         
 | 
 |  |  |         key = ConfigIO.GetValue("Coupon", "key_%s"%post['appid'])
 | 
 |  |  |         key = ConfigIO.GetValue("Coupon", "key_%s" % post['appid'])
 | 
 |  |  |         #md5(appid=$appid®ionid=$regionid&passport=$passport&&money=$money&time=$time$app_secret) 
 | 
 |  |  |         signStr = "appid=%s®ionid=%s&passport=%s&money=%s&time=%s%s"%(\
 | 
 |  |  |         signStr = "appid=%s®ionid=%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)
 | 
 |  |  |         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)
 | 
 |  |  |         mylog.debug("SendDataCollectorBillInfo error %s" % e)
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | # 查询审核时间
 | 
 |  |  | @myapp.route('/auditdate.php')
 | 
 |  |  | def QueryAuditdate():
 | 
 |  |  |     return "2021-06-22 11:30:00"
 |