hch
2018-09-21 c2bc7f00ca8508e767f478109970f1707fb590fe
1 礼包卡以权限分应用
1个文件已添加
323 ■■■■■ 已修改文件
Tool/WebCenter/CouponCode/webapp.py 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Tool/WebCenter/CouponCode/webapp.py
New file
@@ -0,0 +1,323 @@
#!/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