#!/usr/bin/python # -*- coding: utf-8 -*- # ##@package # # @todo: 激活码 # # @author: Alee # @date 2018-5-4 22:10:51 # @version 1.0 # # @note: 中文必须传utf8,收到的为urlencode内容 .decode('gbk').encode('utf8') # 1.使用礼包卡号 #--------------------------------------------------------------------- from bottle import Bottle, request, static_file import md5 import CouponDB import datetime from lib import ReadConfig import json import urllib2 import urllib from lib import mylog, CommFunc import os.path import zipfile # get: request.query.username request.GET.get('username','') # post: request.forms.get('username') request.POST.get('username') #=============================================================================== # @myapp.route('/cool/kk/:name3/:count#\\d+#') # def maybe(name3, count): # client_ip = request.environ.get('REMOTE_ADDR') # client_ip = request.environ.get('HTTP_X_FORWARDED_FOR') or request.environ.get('REMOTE_ADDR') #=============================================================================== ConfigIO = ReadConfig.ReadConfig(os.getcwd() + "\\..\\Coupon\\config.ini") # 应用端口 CenterPort = ConfigIO.GetValue("Coupon", "CenterPort") #mobiletest.173on.com:55000 Def_ExportUrl = ConfigIO.GetValue("Coupon", "exporturl") + "/Coupon/CouponLoad.php?couponid=%s&channel=%s" # GM端口 PushPort = ConfigIO.GetValue("Coupon", "PushPort") PushKey = ConfigIO.GetValue("Coupon", "PushKey") CommonCards = eval(ConfigIO.GetValue("Coupon", "CommonCards")) Def_CardMsg = { 0:"CodeRewardSys2", # 兑换码无效 1: "CodeRewardSys1", # 兑换卡奖励已发至邮件 2:"CodeRewardSys3", # 兑换码已使用过 3:"CodeRewardSys4", # 同类型兑换码只能使用一次 } myapp = Bottle() #/api/Coupon/index.php?couponBatchId=%s&agentName=%s" # 下载指定礼包批次 @myapp.route('/Coupon/CouponLoad.php') def LoadCouponBatch(): dataDict = request.GET appid = dataDict.get("channel", "") # 运营提供的APPID,即渠道 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) # 卡类型 开头字母做标识如 g1~999代表此卡只能使用一次 h1~999卡可以重复使用 z开头代表固定码 # 玩家使用卡号 参数 平台 区服 账号 区服链接(GM用)卡号 # 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", "") # 运营提供的APPID,即渠道 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: return datetime.datetime.strptime(timeStr, timeFomat) except: mylog.debug("GetDateTimeByStr error %s"%timeStr) return