#!/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.生成礼包批次  
 | 
# 2.查询礼包批次  
 | 
# 3.删除礼包批次  
 | 
# 4.下载礼包批次  
 | 
# 5.查询礼包卡号/使用礼包卡号  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
from bottle import Bottle, request, static_file  
 | 
import random  
 | 
import time  
 | 
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() + "\\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")  
 | 
  
 | 
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()  
 | 
     
 | 
myapp = Bottle()  
 | 
  
 | 
#申请礼包卡批次  
 | 
@myapp.route('/Coupon/CouponBatch.php', method='POST')  
 | 
def CouponBatch():  
 | 
    dataDict = request.POST  
 | 
    for key, value in dataDict.items():  
 | 
        mylog.debug("key:%s  value:%s"%(key, value))  
 | 
  
 | 
    appid = dataDict.get("channel", "")     # 运营提供的APPID,即渠道  
 | 
    if not appid:  
 | 
        mylog.debug("no appid")  
 | 
        return json.dumps({"error":"param appid"}, ensure_ascii=False)  
 | 
    couponType = dataDict.get("coupontype", "")    # 礼包卡类型  
 | 
    if not couponType:  
 | 
        mylog.debug("no couponType")  
 | 
        return json.dumps({"error":"param couponType"}, ensure_ascii=False)  
 | 
      
 | 
    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")  
 | 
    else:  
 | 
        return json.dumps({"error":"no couponType"}, ensure_ascii=False)  
 | 
      
 | 
    minSNo = CommFunc.ToIntDef(dataDict.get("minserverno", 0), 0)   # 若只选中一个则代表只有单服使用  
 | 
    maxSNo = CommFunc.ToIntDef(dataDict.get("maxserverno", 0), 0)  
 | 
    amount = int(dataDict.get("amount", 0))     # 礼包数量  
 | 
    expireTime = dataDict.get("expiretime", "") # 过期时间  
 | 
      
 | 
    # 不可重复即可  生成卡号批次标志,随机  
 | 
    coupon_id = md5.md5("%s%s%s%s"%(appid, random.randint(1, 10000), time.time(), couponType)).hexdigest()  
 | 
      
 | 
    dbController = CouponDB.GetDBEventCon()  
 | 
    if not dbController:  
 | 
        # 无法获取数据库  
 | 
        mylog.debug("no dbController")  
 | 
        return json.dumps({"error":"db"}, ensure_ascii=False)  
 | 
      
 | 
    tmpDict = {}  
 | 
    #新增  
 | 
    tmpDict['createtime'] = str(datetime.datetime.today()).split(".")[0]   #创建时间  
 | 
    tmpDict['exportUrl'] = Def_ExportUrl%(coupon_id, appid)  # 卡批次下载地址 提供给运营商获取  
 | 
    tmpDict['couponid'] = coupon_id  # 卡批次,用于控制这一批次卡的使用权限和下载依据  
 | 
      
 | 
    # 若只选中一个则代表只有单服使用,0则不限制使用范围  
 | 
    if minSNo == 0 or maxSNo == 0:  
 | 
        minSNo = max(minSNo, maxSNo)  
 | 
        maxSNo = minSNo  
 | 
    tmpDict["minserverno"] = minSNo  #  使用区服限制  
 | 
    tmpDict["maxserverno"] = maxSNo  
 | 
    tmpDict["amount"] = amount  #此批次卡的总数量  
 | 
    tmpDict["coupontype"] = couponType  # 卡类型 开头字母做标识如 g代表此卡只能使用一次 h卡可以重复使用  
 | 
    tmpDict["expiretime"] = expireTime  # 结束时间 ""空为无限制,具体时间格式为2018-06-07     
 | 
    tmpDict["channel"] = appid  
 | 
    tmpDict["status"] = 0   # 0正常 1不可用  
 | 
      
 | 
    # 插入表1批次清单,表2为具体卡号  
 | 
    result = dbController.insert(CouponDB.CouponBatchColName, tmpDict)  
 | 
    if not result:  
 | 
        mylog.debug("insert error-%s"%(dbController.lastError))  
 | 
        mylog.debug("insert error-%s-%s"%(coupon_id, tmpDict))  
 | 
        return json.dumps({"error":"insert couponid"}, ensure_ascii=False)  
 | 
      
 | 
    #===========================================================================  
 | 
    # { "_id" : ObjectId("5b1a3e474eb1001100f7ad55"), "status" : 0, "code" : "m069cafd  
 | 
    # 8ea1b30ajn", "coupontype" : "3", "couponid" : "0300229afaa52bbce59e7e6c104f307  
 | 
    # e", "createtime" : "2018-06-08 16:28:55", "channel" : "asd" }  
 | 
    #===========================================================================  
 | 
    #批量插入卡号,暂且一次性插入十万  
 | 
    tmpCodeList = []  
 | 
    for i in xrange(amount):  
 | 
        tmpCodeDoc = {}  
 | 
        # 前3位为类型标识  
 | 
        tmpCodeDoc['code'] = prefix + tmpDict["coupontype"][0] + md5.md5(tmpDict['channel'] + str(tmpDict['createtime']) + str(i) + \  
 | 
                                     str(random.randint(1000, 2000000))).hexdigest()[2:14] + \  
 | 
                                     random.choice('1234567890abcdefghijklmnopqrstuvwxyz') +\  
 | 
                                     random.choice('1234567890abcdefghijklmnopqrstuvwxyz')   
 | 
        tmpCodeDoc['coupontype'] = tmpDict['coupontype']  
 | 
        tmpCodeDoc['couponid'] = tmpDict['couponid']  
 | 
          
 | 
        tmpCodeDoc['channel'] = tmpDict['channel']  
 | 
        tmpCodeDoc['status'] = 0  
 | 
        tmpCodeDoc['usetime'] = ""  
 | 
        tmpCodeDoc['accid'] = ""  
 | 
        tmpCodeList.append(tmpCodeDoc)  
 | 
  
 | 
    result = dbController.insert(CouponDB.CouponCodeColName + "_" + tmpDict['channel'], tmpCodeList)  
 | 
    if not result:  
 | 
        return json.dumps({"error":"insert card"}, ensure_ascii=False)  
 | 
    if "_id" in tmpDict:  
 | 
        del tmpDict["_id"]  
 | 
  
 | 
    mylog.debug("插入成功%s"%json.dumps(tmpDict, ensure_ascii=False))  
 | 
          
 | 
    return json.dumps(tmpDict, ensure_ascii=False)  
 | 
  
 | 
# 查询此平台礼包批次或者指定礼包批次查询  
 | 
@myapp.route('/Coupon/CouponQuery.php')  
 | 
def QueryCouponBatch():  
 | 
    dataDict = request.GET  
 | 
    appid = dataDict.get("channel", "")     # 运营提供的APPID,即渠道  
 | 
    if not appid:  
 | 
        mylog.debug("no appid")  
 | 
        return json.dumps({"error":"param channel"}, ensure_ascii=False)  
 | 
    couponid = dataDict.get("couponid", "")  
 | 
    # 单查  
 | 
    dbController = CouponDB.GetDBEventCon()  
 | 
    if not dbController:  
 | 
        # 无法获取数据库  
 | 
        mylog.debug("no dbController")  
 | 
        return json.dumps({"error":"db"}, ensure_ascii=False)  
 | 
    if couponid:  
 | 
        result, findList = dbController.find(CouponDB.CouponBatchColName, {'channel':appid, 'couponid':couponid})  
 | 
    else:  
 | 
        result, findList = dbController.find(CouponDB.CouponBatchColName, {'channel':appid})  
 | 
      
 | 
    if not findList:  
 | 
        return json.dumps({"error":"no couponid"}, ensure_ascii=False)  
 | 
      
 | 
    return json.dumps(findList, ensure_ascii=False)  
 | 
  
 | 
  
 | 
# 更新指定礼包批次 0:正常  其他异常  
 | 
@myapp.route('/Coupon/CouponUpdate.php')  
 | 
def UpdateCouponBatch():  
 | 
    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)  
 | 
      
 | 
    status = CommFunc.ToIntDef(dataDict.get("status", 0), 0)  
 | 
      
 | 
    dbController = CouponDB.GetDBEventCon()  
 | 
    if not dbController:  
 | 
        # 无法获取数据库  
 | 
        mylog.debug("no dbController")  
 | 
        return json.dumps({"error":"db"}, ensure_ascii=False)  
 | 
      
 | 
    result, data = dbController.find_one(CouponDB.CouponBatchColName, {'channel':appid, 'couponid':couponid})  
 | 
    if not data:  
 | 
        return json.dumps({"error":"no couponid"}, ensure_ascii=False)  
 | 
      
 | 
    data['status'] = status  
 | 
    dbController.update(CouponDB.CouponBatchColName, {'channel':appid, 'couponid':couponid}, data)  
 | 
      
 | 
      
 | 
    return json.dumps({"success":couponid}, ensure_ascii=False)  
 | 
  
 | 
  
 | 
# 查询卡使用情况  
 | 
@myapp.route('/Coupon/QueryCouponCode.php')  
 | 
def QueryCouponCode():  
 | 
    dataDict = request.GET  
 | 
    appid = dataDict.get("channel", "")     # 运营提供的APPID,即渠道  
 | 
    if not appid:  
 | 
        mylog.debug("no appid")  
 | 
        return json.dumps({"error":"param appid"}, ensure_ascii=False)  
 | 
    codeStr = dataDict.get("code", "")  
 | 
    if not codeStr:  
 | 
        return json.dumps({"error":"param code"}, ensure_ascii=False)  
 | 
      
 | 
    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, 'code':codeStr})  
 | 
    if not data:  
 | 
        return json.dumps({"error":"no code"}, ensure_ascii=False)  
 | 
      
 | 
    return json.dumps(data, ensure_ascii=False)  
 | 
  
 | 
      
 | 
def GetDateTimeByStr(timeStr, timeFomat="%Y-%m-%d"):  
 | 
    try:  
 | 
        return datetime.datetime.strptime(timeStr, timeFomat)  
 | 
      
 | 
    except:  
 | 
        mylog.debug("GetDateTimeByStr error %s"%timeStr)  
 | 
      
 | 
    return  
 | 
      
 | 
  
 | 
  
 | 
#=================游戏服务器记录==========================================================  
 | 
# $arrayInsert=array( '_id'=>$orderID, 'ServerID'=>$getServer_id,   
 | 
#                    'AccID'=>$qid, 'OrderAmount'=>$nOrderAmount,   
 | 
#                    'OrderID'=>$orderID, 'Sign'=>$recvSign,   
 | 
#                    'BeginOrderTime'=>date("Y-m-d H:i:s"), 'EndOrderTime'=>0,   
 | 
#                    'IsProcess'=>0, "OrderInfo"=>$DataArray['OrderInfo']);  
 | 
#===========================================================================  
 | 
  
 | 
#=================后台数据记录==========================================================  
 | 
# appid    是    string    微信商城用户选择的平台appid  
 | 
# regionid    是    string    区服ID:  s8001  
 | 
# orderid    是    string    微信商城订单号不能与充值订单重复  
 | 
# passport    是    string    玩家游戏帐号  
 | 
# roleid    是    string    角色名称  
 | 
# ordertitle    是    string    订单标题,例如:  128元礼包  
 | 
# orderinfo    是    string    订单信息, 例如:  snxxz.18  
 | 
# money    是    float    付款数保留两位小数  
 | 
# ip    是    string    玩家IP,可空值  
 | 
# level    是    string    等级  
 | 
# viplevel    是    string    VIP等级  
 | 
# time    是    string    充值时间戳 例如: 1539447585  
 | 
# sign    是    string    签名  
 | 
#===========================================================================  
 | 
  
 | 
#http://center.2460web.com:53002/Coupon/CouponWXBill.php  
 | 
#微信商城 参数 ordertitle orderinfo orderid count money(保留两位小数)sign ip time(补发不更新时间)  
 | 
@myapp.route('/Coupon/CouponWXBill.php', method='POST')  
 | 
def CouponWXBill():  
 | 
    dataDict = request.POST  
 | 
    for key, value in dataDict.items():  
 | 
        mylog.debug("key:%s  value:%s"%(key, value))  
 | 
  
 | 
    channel = "zyxh"  # 需支持多个appid,一个订单一个激活码  
 | 
    orderID = dataDict.get("orderid", "")    # 订单,根据数量分支出多个订单对应一个激活码  
 | 
    if not orderID:  
 | 
        return json.dumps({"error":"param orderid"}, ensure_ascii=False)  
 | 
      
 | 
    orderInfo = dataDict.get("orderinfo", "")    # 商品编号  
 | 
    if not orderInfo:  
 | 
        return json.dumps({"error":"param orderInfo"}, ensure_ascii=False)  
 | 
      
 | 
    count = int(dataDict.get("count", 0))     # 礼包数量  
 | 
    if count <= 0:  
 | 
        return json.dumps({"error":"param count"}, ensure_ascii=False)  
 | 
      
 | 
    money = float(dataDict.get("money", 0))     # 价格  
 | 
    if money <= 0:  
 | 
        return json.dumps({"error":"param money"}, ensure_ascii=False)  
 | 
      
 | 
      
 | 
    timeStr = dataDict.get("time", "")     # 充值时间,补发不更新时间  
 | 
    if not timeStr:  
 | 
        return json.dumps({"error":"param time"}, ensure_ascii=False)  
 | 
      
 | 
    sign = dataDict.get("sign", "")     # 充值时间,补发不更新时间  
 | 
    if not sign:  
 | 
        return json.dumps({"error":"param sign"}, ensure_ascii=False)  
 | 
      
 | 
    key = ConfigIO.GetValue("Coupon", channel + "_wxkey")  
 | 
    calcSign = md5.md5(str(count) + orderID + timeStr + key).hexdigest()  
 | 
    if calcSign != sign:  
 | 
        mylog.debug("error sign=%s"%calcSign)  
 | 
        return json.dumps({"error":"sign"}, ensure_ascii=False)  
 | 
      
 | 
      
 | 
    dbController = CouponDB.GetDBEventCon()  
 | 
    if not dbController:  
 | 
        # 无法获取数据库  
 | 
        mylog.debug("no dbController")  
 | 
        return json.dumps({"error":"db"}, ensure_ascii=False)  
 | 
      
 | 
    # 验证是否重复订单  
 | 
    result = dbController.find(CouponDB.CouponWXColName, {"realorderid":orderID})  
 | 
    if result[1]:  
 | 
        codeList = []  
 | 
        for cardInfo in result[1]:  
 | 
            codeList.append(cardInfo['code'])  
 | 
        #return json.dumps({"error":"orderid repeat"}, ensure_ascii=False)  
 | 
        mylog.debug("orderid repeat")  
 | 
        return json.dumps({orderID:codeList}, ensure_ascii=False)  
 | 
      
 | 
    #批量插入卡号  
 | 
    tmpCodeList = []    # 卡信息  
 | 
    codeList = []   # 卡号  
 | 
    for i in xrange(count):  
 | 
        tmpCodeDoc = {}  
 | 
        # 前3位为类型标识  
 | 
        tmpCodeDoc['code'] = "wx" + md5.md5( channel + str(i) + orderID + timeStr + str(i) + \  
 | 
                                     str(random.randint(1000, 2000000))).hexdigest()[5:17] + \  
 | 
                                     random.choice('1234567890abcdefghijklmnopqrstuvwxyz') +\  
 | 
                                     random.choice('1234567890abcdefghijklmnopqrstuvwxyz')   
 | 
        tmpCodeDoc['operateid'] = channel   # appid组合标识 一家运营商可能有多个appid  
 | 
        tmpCodeDoc['status'] = 0  
 | 
        tmpCodeDoc['usetime'] = ""  
 | 
          
 | 
        tmpCodeDoc['count'] = count  
 | 
          
 | 
        tmpCodeDoc['appid'] = ""    # 记录用  
 | 
        tmpCodeDoc['serverid'] = ""    # 记录用  
 | 
        tmpCodeDoc['realorderid'] = orderID    # 购物的orderID,会根据数量拆解  
 | 
        tmpCodeDoc['orderid'] = orderID + "_" + str(i+1)    # 拆解的orderID,会根据数量拆解  
 | 
        tmpCodeDoc['accid'] = ""  
 | 
        tmpCodeDoc['roleid'] = ""  
 | 
        tmpCodeDoc['ordertitle'] = dataDict.get("ordertitle", "")  
 | 
        tmpCodeDoc['orderinfo'] = orderInfo  
 | 
        tmpCodeDoc['money'] = money  
 | 
        tmpCodeDoc['ip'] = dataDict.get("ip", "")  
 | 
        tmpCodeDoc['level'] = ""  
 | 
        tmpCodeDoc['viplevel'] = ""  
 | 
        tmpCodeDoc['createtime'] = timeStr  
 | 
          
 | 
        tmpCodeList.append(tmpCodeDoc)  
 | 
        codeList.append(tmpCodeDoc['code'])  
 | 
          
 | 
          
 | 
    result = dbController.insert(CouponDB.CouponWXColName, tmpCodeList)  
 | 
    if not result:  
 | 
        return json.dumps({"error":"insert card"}, ensure_ascii=False)  
 | 
  
 | 
    mylog.debug("插入成功%s条订单"%len(tmpCodeList))  
 | 
     
 | 
    return json.dumps({orderID:codeList}, ensure_ascii=False)  
 | 
  
 |