Tool/WebCenter/CouponCode/webapp.py
@@ -25,6 +25,7 @@
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')
@@ -45,20 +46,64 @@
# 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"
@@ -74,9 +119,9 @@
    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:
@@ -87,16 +132,16 @@
    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)
#================客户端请求参数===============================================================
@@ -117,45 +162,60 @@
# 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}
    #-----------统一固定码处理----------------------
    CommonCardsList = CommonCards.get(agentName, [])
    if codeStr in CommonCardsList:
@@ -163,39 +223,40 @@
        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", "")
@@ -204,222 +265,199 @@
            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
    
@@ -437,7 +475,7 @@
# 微信入口充值
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']
@@ -447,9 +485,9 @@
        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()
        
@@ -457,12 +495,12 @@
        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
# 通知后台数据中心记录
@@ -475,7 +513,7 @@
        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'] 
@@ -484,17 +522,21 @@
        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&regionid=$regionid&passport=$passport&&money=$money&time=$time$app_secret) 
        signStr = "appid=%s&regionid=%s&passport=%s&money=%s&time=%s%s"%(\
        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)
        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"