Пример #1
0
def search_open_expect():
    """轮询开奖期号
    """
    rds = db_pool.get_redis("main")
    dlt_expect = dlt_logic.DltDraw().get_newest_opencode()
    dlt_expect = dlt_expect.get("expect", None)
    if dlt_expect:
        rds.set(rediskey.REDIS_OPENCODE_EXPECT.format("dlt"),
                dlt_expect,
                ex=60)
    logger.debug("Search opencode expect! lotname=dlt|expect=%s", dlt_expect)

    gx11x5_expect = syxw_logic.SyxwDraw(44).get_newest_opencode()
    gx11x5_expect = gx11x5_expect.get("expect", None)
    if gx11x5_expect:
        rds.set(rediskey.REDIS_OPENCODE_EXPECT.format("gx11x5"),
                gx11x5_expect,
                ex=60)
    logger.debug("Search opencode expect! lotname=gx11x5|expect=%s",
                 gx11x5_expect)

    ssq_expect = ssq_logic.SsqDraw().get_newest_opencode()
    ssq_expect = ssq_expect.get("expect", None)
    if ssq_expect:
        rds.set(rediskey.REDIS_OPENCODE_EXPECT.format("ssq"),
                ssq_expect,
                ex=60)
    logger.debug("Search opencode expect! lotname=ssq|expect=%s", ssq_expect)
Пример #2
0
    def place_chasenumber(self, params):
        #TODO 下单参数校验
        lotid = params.get("lotid")
        obj_order = Trade.get(int(lotid))
        resp = obj_order.place_chasenumber(params) if obj_order else {}

        #异步通知支付
        if resp.get("cid"):
            params = {
                "lotid": resp.get("lotid"),
                "oid": resp.get("cid"),
                "msgtype": define.MSG_TYPE_CHASENUMBER_PLACED,
                "msgcnt": ujson.dumps(resp)
            }
            try:
                mid = MsgRecord().insert(params)
                resp.update({"mid": mid})
            except:
                # 防止重复插入
                logger.error(traceback.format_exc())
                raise
            else:
                rds = db_pool.get_redis("msgbus")
                rds.publish("TRADE#CHASENUMBER#PLACED", ujson.dumps(resp))
        else:
            raise RpcException("交易服务发起追号异常!lotid={}".format(lotid))
        return {"cid": resp.get("cid", ""), "pid": resp.get("pid", "")}
Пример #3
0
def get_by_ck(ck, ss_err=True):
    """通过ck获取session信息
    @param ck: 通过登录得到的ck串
    @return: session内容,dict类型
    """
    mc = db_pool.get_redis('session')
    try:
        uid = mc.get(MC_PREFIX_UID + str(ck))
        if uid:
            # 校验当前用户是否在其他设备多点登录
            uid_ck = mc.get(MC_PREFIX_CK + str(uid))
            if ck != uid_ck:
                logger.debug('uid=%s^^^^^^ck=%s^^^^^uid_ck=%s', uid, ck, uid_ck)
                mc.delete(MC_PREFIX_UID + str(ck))
                raise ews.EwsError(ews.STATUS_MULTI_LOGIN_ERR)

            # 刷新ck有效期并返回
            set_ck_to_redis(ck, uid, refresh=True)
            return {
                'ck': ck,
                'uid': uid,
                'usertype': mc.get(MC_UT_PREFIX + str(ck)),
            }
        if ss_err:
            logger.debug(detailtrace("DetailTrace:{}".format(ck)))
            raise ews.EwsError(ews.STATUS_SESSION_ERR)
        else:
            return None
    finally:
        pass
Пример #4
0
    def get_verify_code_img(self, params):
        """获取验证码图片
        """
        deviceid = params.get("deviceid", "")
        username = params.get("username", "")
        vtype = params.get("vtype", define.VTYPE_LOGIN)
        redis_opt = db_pool.get_redis("main")
        code = ""
        for i in range(4):
            code += chr(random.randrange(ord('a'), ord('z') + 1))

        vkey = deviceid  # 默认的验证码key用设备码
        if vtype == define.VTYPE_LOGIN:
            # 登陆
            vkey = deviceid
        elif vtype == define.VTYPE_UNLOCK:
            # 解锁
            vkey = username
        logger.debug(vkey)
        rds_name = rediskey.CRAZY_VERIFY_CODE_PREFIX.format(vtype=vtype,
                                                            vkey=vkey)
        redis_opt.set(rds_name, code, ex=5 * 60)
        logger.info("rds_name=%s|code=%s|deviceid=%s|username=%s", rds_name,
                    code, deviceid, username)
        img = get_img(code)
        return img
Пример #5
0
 def __init__(self):
     self.conn_r = db_pool.get_mysql("nncp_ro")
     self.conn_w = db_pool.get_mysql("nncp_wr")
     self.conn = db_pool.get_mysql("nncp")
     self.cursor = self.conn.cursor(MySQLdb.cursors.DictCursor)
     self.rds = db_pool.get_redis("msgbus")
     self.mongo = MongoDataModel()
Пример #6
0
def chasenumber_update_paid(channel,msg):
    """追号订单已支付,更新订单状态
    """
    logger.debug('callback for [channel:%s]:[msg:%s]',channel,msg)
    msg = ujson.loads(msg)

    #校验订单数据
    mid = msg.pop("mid")
    lotid = int(msg.get("lotid", 0))
    cid = msg.get("cid")
    pid = msg.get("pid")
    couponid = msg.get("couponid")
    paymoney = msg.get("paymoney")
    couponmoney = msg.get("couponmoney")

    #更新订单状态
    obj_order = Trade.get(lotid)
    paystatus = msg.get("paystatus")
    try:
        params = {
            "mid": mid,
            "cid": cid,
            "pid": pid,
            "couponid": couponid,
            "paymoney": paymoney,
            "couponmoney": couponmoney,
            "chase_originstatus": define.CHASE_STATUS_UNPAY,
            "chase_targetstatus": define.CHASE_STATUS_SUCC if paystatus == define.ORDER_PAY_STATUS_SUCC else define.CHASE_STATUS_FAILPAY,
            "order_originstatus": define.ORDER_STATUS_UNPAY,
            "order_targetstatus": define.ORDER_STATUS_SUCC if paystatus == define.ORDER_PAY_STATUS_SUCC else define.ORDER_STATUS_FAILPAY,
            "remark": define.PAY_STATUS_REMARK[paystatus]
        }
        obj_order.update_chasenumber_status(params)
    except:
        #更新订单状态异常处理, 告警+重试
        logger.error(traceback.format_exc())
        raise
    else:
        # 通知第一期订单成功支付
        if paystatus == define.ORDER_PAY_STATUS_SUCC:
            params = {
                "lotid": lotid,
                "oid": pid,
                "msgtype": define.MSG_TYPE_ORDER_SUCCPAY,
                "msgcnt": ujson.dumps(msg)
            }
            try:
                mid = MsgRecord().insert(params)
                msg.update({"mid": mid})
            except:
                # 防止重复插入
                logger.error(traceback.format_exc())
            else:
                rds = db_pool.get_redis("msgbus")
                rds.publish("TRADE#ORDER#SUCCPAY", ujson.dumps(msg))
        else:
            pass
Пример #7
0
def order_chasepay(channel, msg):
    """追号下单成功,直接扣款
    """
    logger.debug('callback for [channel:%s]:[msg:%s]', channel, msg)
    msg = ujson.loads(msg)
    cid = msg.get("cid")
    pid = msg.get("pid")
    uid = msg.get("uid")
    lotid = msg.get("lotid")
    mid = msg.get("mid")
    allmoney = float(msg.get("allmoney"))
    couponid = int(msg.get("couponid"))

    #直接扣款
    params = {
        "uid": uid,
        "cid": cid,
        "pid": pid,
        "lotid": lotid,
        "couponid": couponid,
        "allmoney": allmoney,
        "mid": mid
    }
    paystatus, paymoney, couponmoney = UserAccountLogic().order_chasepay(
        params)

    #异步通知支付状态
    msg = {
        "uid": uid,
        "cid": cid,
        "pid": pid,
        "lotid": lotid,
        "allmoney": allmoney,
        "paymoney": paymoney,
        "couponmoney": couponmoney,
        "couponid": couponid,
        "paystatus": paystatus
    }

    params = {
        "oid": cid,
        "lotid": lotid,
        "msgtype": define.MSG_TYPE_CHASENUMBER_PAID,
        "msgcnt": ujson.dumps(msg)
    }
    try:
        mid = MsgRecord().insert(params)
        msg.update({"mid": mid})
    except:
        # 防止重复插入
        logger.error(traceback.format_exc())
        raise
    else:
        rds = db_pool.get_redis("msgbus")
        rds.publish("TRADE#CHASENUMBER#PAID", ujson.dumps(msg))
    return
Пример #8
0
def cal_prize_ssq():
    """双色球算奖
    """
    try:
        rds = db_pool.get_redis("main")
        expect = rds.get(rediskey.REDIS_OPENCODE_EXPECT.format("ssq"))
        with get_rpc_conn("ticket") as proxy:
            proxy.call("Jprize", {"lotid": 3, "expect": expect})
    except:
        logger.error(traceback.format_exc())
Пример #9
0
def del_ck_from_redis(ck):
    """从redis删除ck
    """
    if not ck:
        raise ews.EwsError(ews.STATUS_SESSION_ERR)

    uid_key = MC_PREFIX_UID + str(ck)
    mc = db_pool.get_redis('session')
    try:
        mc.delete(uid_key)
    except:
        raise ews.EwsError(ews.STATUS_SESSION_ERR)
    finally:
        pass
Пример #10
0
def user_verify_code(handler):
    json_args = handler.json_args
    deviceid = json_args.get("mbimei", "")

    rds = db_pool.get_redis('main')
    key = rediskey.REDIS_MOBILE_LOGIN_COUNT_LIMIT.format(deviceid=deviceid)

    login_times = rds.get(key)
    iscode = "0"
    if login_times and int(login_times) > 4:
        iscode = "1"

    ret = {"vcode_img_url": get_img_url(deviceid), "iscode": iscode}
    return handler.ok(ret)
Пример #11
0
def get_wechat_access_token():
    url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={corpid}&corpsecret={corpsecret}".format(
        corpid=corpid, corpsecret=corpsecret)
    r = db_pool.get_redis("main")
    access_token = r.get("nncp:wechat:work:token")
    if not access_token:
        try:
            req = requests.get(url, verify=False)
        except:
            req = requests.get(url, verify=False)
        access_token = ujson.loads(req.content).get("access_token")
        r.set("nncp:wechat:work:token", access_token, 60 * 60)
        return access_token
    else:
        return access_token
Пример #12
0
def set_ck_to_redis(ck, uid, ttl=7 * 24 * 60 * 60, refresh=False):
    """设置memcached值
    """
    if not ck or not uid:
        raise ews.EwsError(ews.STATUS_SESSION_ERR)

    uid_key = MC_PREFIX_UID + str(ck)
    ck_key = MC_PREFIX_CK + str(uid)
    logger.debug('uid=%s^^^^^^ck=%s^^^^^uid_key=%s^^^^^^^^ck_key=%s', uid, ck, uid_key, ck_key)
    mc = db_pool.get_redis('session')
    try:
        mc.setex(uid_key, uid, ttl)
        mc.setex(ck_key, ck, ttl)
    except:
        raise ews.EwsError(ews.STATUS_SESSION_ERR)
    finally:
        pass
Пример #13
0
def user_verify_code_img(handler):
    """图片验证码
    """
    json_args = handler.json_args
    deviceid = json_args.get("deviceid", "")
    vtype = json_args.get("vtype", define.VTYPE_LOGIN)
    redis_opt = db_pool.get_redis("main")
    code = ""
    for i in range(4):
        code += chr(random.randrange(ord('a'), ord('z') + 1))

    rds_name = rediskey.CRAZY_VERIFY_CODE_PREFIX.format(vtype=vtype,
                                                        vkey=deviceid)
    redis_opt.set(rds_name, code, ex=5 * 60)
    handler.set_header('Content-Type', 'image/png')
    out = get_img(code)
    return handler.ok(out, extd="verifycode")
Пример #14
0
def apply_data_token(dt_type):
    """申请一个data_token
    """
    rds = db_pool.get_redis('main')
    for i in range(4):
        dt_key = hashlib.md5(str(random.random())).hexdigest()
        dt_secret = hashlib.md5(str(random.random())).hexdigest()
        if rds.setnx(DATA_TOKEN_PREFIX + dt_key, dt_secret) <= 0:
            continue
        rds.expire(DATA_TOKEN_PREFIX + dt_key, DATA_TOKEN_TTL)
        return {
            'key': dt_key,
            'secret': dt_secret,
            'ttl': DATA_TOKEN_TTL,
            'type': dt_type,
        }
    else:
        raise ews.EwsError(ews.STATUS_STATUS_BUSY)
Пример #15
0
    def verify_img_code(self, verifycode, deviceid):
        """验证图片验证码

        """
        rds = db_pool.get_redis('main')
        key = rediskey.REDIS_MOBILE_LOGIN_COUNT_LIMIT.format(deviceid=deviceid)
        login_count = rds.get(key) or 0
        logger.info("verifycode:%s, deviceid:%s", verifycode, deviceid)
        if int(login_count) <= 4:
            return True

        rds_name = rediskey.CRAZY_VERIFY_CODE_PREFIX.format(
            vtype=define.VTYPE_LOGIN, vkey=deviceid)
        code = rds.get(rds_name)

        if code.lower() == verifycode.lower():
            return True
        return False
Пример #16
0
    def user_verify_sms(self, mobile, code):
        pt = re.compile('^0\d{2,3}\d{ 7,8}$|^1[3456789]\d{9}$|^147\d{8}')
        phonematch = pt.match(mobile)
        if not phonematch:
            raise ews.EwsError(ews.STATUS_USER_MOBILE_FORMAT_ERROR)

        if not code:
            raise ews.EwsError(ews.STATUS_USER_MOBILE_CODE_EMPTY)

        rds = db_pool.get_redis('main')
        _code = rds.get(
            rediskey.REDIS_USER_MOBILE_SMS_CODE.format(mobile=mobile)) or ""

        if not _code:
            raise ews.EwsError(ews.STATUS_USER_MOBILE_CODE_EXPIRE)

        if str(_code) != str(code):
            raise ews.EwsError(ews.STATUS_USER_MOBILE_CODE_ERROR)

        checksum = hashlib.md5(
            str(mobile) + str(code) + define.DEFIND_SMS_SALT).hexdigest()
        return {"checksum": checksum, "code": code, "mobile": mobile}
Пример #17
0
    def user_login(self, params):
        origin_params = params
        login_type = params.get("login_type", "mobile")
        mobile = params.get("mobile", "")
        password = params.get("password", "")
        verifycode = params.get("verifycode", "")
        deviceid = params.get("mbimei")

        rds = db_pool.get_redis('main')
        if login_type == define.DEFIND_USER_LOGIN_TYPE:
            if not re.match(PATTERN, mobile):
                # 手机号非法
                key = rediskey.REDIS_MOBILE_LOGIN_COUNT_LIMIT.format(
                    deviceid=deviceid)
                rds.incr(key, 1)
                raise ews.EwsError(ews.STATUS_USER_MOBILE_FORMAT_ERROR)
            login_password = hashlib.md5(password +
                                         define.DEFIND_LOGIN_SALT).hexdigest()

            verify = self.verify_img_code(verifycode, deviceid)
            if not verify:
                raise ews.EwsError(ews.STATUS_USER_IMG_CODE_ERROR)

            module = "user"
            method = "login"
            params = {
                "mobile": mobile,
                "password": password,
                "logintype": login_type
            }
            user_info = {}
            with get_rpc_conn(module) as proxy:
                user_info = proxy.call(method, params)

                if not user_info:
                    raise ews.EwsError(ews.STATUS_LOGIN_NOT_REG)
                    # 用户没有注册

                loginpwd = user_info.get("f_loginpwd")
                if login_password != loginpwd:
                    key = rediskey.REDIS_MOBILE_LOGIN_COUNT_LIMIT.format(
                        deviceid=deviceid)
                    rds.incr(key, 1)
                    raise ews.EwsError(ews.STATUS_USER_LOGIN_PASSWORD_ERROR)

                #todo 登录日志
                origin_params.update({"uid": user_info.get("f_uid")})
                proxy.call("login_log", origin_params)

                uid = user_info.get("f_uid")
                username = user_info.get("f_username")
                nickname = user_info.get("f_nickname")
                mobile = user_info.get("f_mobile")
                truename = user_info.get("f_truename")
                idcard = user_info.get("f_idcard")
                ck = session.make_ck(uid)
                session.set_ck_to_redis(ck, uid, ttl=24 * 60 * 60)

                module = "account"
                method = "user_account"
                params = {"uid": uid}
                user_account = {}
                with get_rpc_conn(module) as proxy:
                    try:
                        user_account = proxy.call(method, params)
                    except:
                        logger.error(traceback.format_exc())
                        raise ews.EwsError(ews.STATUS_LOGIN_FAIL)
                    user_account = ujson.loads(user_account)

                ret = {
                    "uid": uid,
                    "ck": ck,
                    "mobile": mobile,
                    "truename": truename,
                    "idcard": idcard,
                    "username": username,
                    "nickname": nickname
                }
                ret.update(user_account)
                key = rediskey.REDIS_MOBILE_LOGIN_COUNT_LIMIT.format(
                    deviceid=deviceid)
                rds.delete(key)
                return ret

        else:
            raise ews.EwsError(ews.STATUS_LOGIN_FAIL)
Пример #18
0
def get_ck_by_uid(uid):
    mc = db_pool.get_redis('session')
    return mc.get(MC_PREFIX_CK + str(uid))
Пример #19
0
def broadcast(channel, msg):
    """广播
    """
    r = db_pool.get_redis('main')
    r.publish(channel, msg)
Пример #20
0
def send(mq, msg):
    """发消息
    """
    r = db_pool.get_redis('main')
    r.rpush(mq, msg)
Пример #21
0
 def __init__(self):
     self.rds = db_pool.get_redis('main')
Пример #22
0
def project_prize(channel,msg):
    """校验中奖金额,执行派奖
    """
    logger.debug('callback for [channel:%s]:[msg:%s]',channel,msg)
    try:
        unpack = ujson.loads(msg)
        lotid = unpack.get("lotid")
        pid = unpack.get("pid")
        uid = unpack.get("uid")

        obj_ticket = Ticket.get(int(lotid))
        prj_tickets_status = obj_ticket.get_tickets_status_by_project(pid)
        ticketnum = sum(ts["cnt"] for ts in prj_tickets_status)
        prj_tickets_status = {ts["status"]:{"cnt":ts["cnt"],
                                            "allmoney": ts["allmoney"],
                                            "calgetmoney": ts["calgetmoney"],
                                            "getmoney": ts["getmoney"]} for ts in prj_tickets_status}

        rds = db_pool.get_redis("msgbus")
        obj_order = Trade.get(int(lotid))
        order = obj_order.get_project_by_pid(pid)
        getmoney = Decimal(0)
        if order.get("f_isjprize") == define.ORDER_JPRIZE_PRIZED:
            logger.warning("彩种lotid=%s方案pid=%s重复派奖拦截", lotid, pid)
            AlertMoniter().add_alert_msg("[重要]彩种lotid={}方案pid={}重复派奖拦截".format(lotid, pid))
        else:
            # 全部出票
            if define.TICKET_STATUS_SAVED not in prj_tickets_status:
                # 全部算奖
                if define.TICKET_STATUS_PRINTED not in prj_tickets_status:
                    if define.TICKET_STATUS_PRIZED in prj_tickets_status:
                        calgetmoney = prj_tickets_status[define.TICKET_STATUS_PRIZED].get("calgetmoney")
                        getmoney = prj_tickets_status[define.TICKET_STATUS_PRIZED].get("getmoney")
                        cancelmoney = Decimal(0)
                        #if calgetmoney != getmoney:
                        if False:  #TODO 暂时屏蔽奖金校验
                            logger.debug("彩种lotid=%s方案pid=%s派奖失败[算奖金额不匹配]", lotid, pid)
                            AlertMoniter().add_alert_msg("[重要]彩种lotid={}方案pid={}派奖失败[算奖金额不匹配]".format(lotid, pid))
                        else:
                            #部分撤单
                            if define.TICKET_STATUS_CANCEL in prj_tickets_status:
                                cancelmoney = prj_tickets_status[define.TICKET_STATUS_CANCEL].get("allmoney")
                                logger.debug("彩种lotid=%s方案pid=%s派奖完成[中奖%s元撤单%s元]", lotid, pid, getmoney, cancelmoney)
                            else:
                                logger.debug("彩种lotid=%s方案pid=%s派奖完成[中奖%s元]", lotid, pid, getmoney)
                            rds.publish("TRADE#ORDER#PRIZED", ujson.dumps({"lotid":lotid,
                                                                        "pid":pid,
                                                                        "uid":uid,
                                                                        "allmoney":order.get("f_allmoney"),
                                                                        "couponmoney":order.get("f_couponmoney"),
                                                                        "cid": order.get("f_chaseid", 0) or 0,  #竞篮竞足没有chaseid
                                                                        "fid": order.get("f_fid", 0) or 0,
                                                                        "getmoney":getmoney,
                                                                        "cancelmoney":cancelmoney}))
                    elif define.TICKET_STATUS_CANCEL in prj_tickets_status:
                        cancelmoney = prj_tickets_status[define.TICKET_STATUS_CANCEL].get("allmoney")
                        logger.debug("彩种lotid=%s方案pid=%s派奖完成[撤单%s元]", lotid, pid, cancelmoney)
                        rds.publish("TRADE#ORDER#PRIZED", ujson.dumps({"lotid":lotid,
                                                                    "pid":pid,
                                                                    "uid":uid,
                                                                    "allmoney":order.get("f_allmoney"),
                                                                    "couponmoney":order.get("f_couponmoney"),
                                                                    "cid": order.get("f_chaseid", 0) or 0,  #竞篮竞足没有chaseid
                                                                    "fid": order.get("f_fid", 0) or 0,
                                                                    "getmoney": Decimal(0),
                                                                    "cancelmoney":cancelmoney}))
                    else:
                        logger.debug("彩种lotid=%s方案pid=%s派奖完成[未中奖]", lotid, pid)
                        # 活动消息: [方案派奖成功]
                        activity_msg = {
                            "uid": order.get("f_uid"),
                            "pid": order.get("f_pid"),
                            "lotid": order.get("f_lotid"),
                            "wtype": order.get("f_wtype"),
                            "zhushu": order.get("f_zhushu"),
                            "beishu": order.get("f_beishu"),
                            "allmoney": order.get("f_allmoney"),
                            "couponmoney": order.get("f_couponmoney"),
                            "returnmoney": order.get("f_cancelmoney"),
                            "prize": order.get("f_getmoney"),
                            "buytime": order.get("f_crtime"),
                            "firsttime": order.get("f_firsttime", "") or "",
                            "lasttime": order.get("f_lasttime", "") or "",
                            "fadan": order.get("f_ptype", 0) or 0,
                            "followpid": order.get("f_fid", 0) or 0,
                            "orderstatus": order.get("f_orderstatus"),
                            "isjprize": order.get("f_isjprize"),
                            "platform": order.get("f_platform")
                        }
                        MQ.send_msg('prize_suc', activity_msg)


                    # 追号方案继续追号
                    chaseid = order.get("f_chaseid", 0)
                    if chaseid > 0:
                        params = {
                            'cid': chaseid,
                            'getmoney': getmoney
                        }
                        resp = obj_order.continue_chasenumber(params)

                        #异步通知拆票
                        if resp.get("pid", ""):
                            params = {
                                "lotid": resp.get("lotid"),
                                "oid": resp.get("pid"),
                                "msgtype": define.MSG_TYPE_ORDER_SUCCPAY,
                                "msgcnt": ujson.dumps(resp)
                            }
                            try:
                                mid = MsgRecord().insert(params)
                                unpack.update({"mid": mid,
                                               "pid": resp.get("pid"),
                                               "paystatus": define.ORDER_PAY_STATUS_SUCC}) #更新为新订单的pid
                            except:
                                # 防止重复插入
                                logger.error(traceback.format_exc())
                            else:
                                rds = db_pool.get_redis("msgbus")
                                rds.publish("TRADE#ORDER#SUCCPAY", ujson.dumps(unpack))
                else:
                    logger.debug("彩种lotid=%s方案pid=%s派奖失败[未全部算奖]", lotid, pid)
            else:
                logger.debug("彩种lotid=%s方案pid=%s派奖失败[未全部出票]", lotid, pid)
    except:
        logger.error(traceback.format_exc())
        AlertMoniter().add_alert_msg("[重要]派奖或追号异常! info={}".format(msg))
Пример #23
0
def order_update_paid(channel,msg):
    """投注订单已支付,更新订单状态
    """
    logger.debug('callback for [channel:%s]:[msg:%s]',channel,msg)
    msg = ujson.loads(msg)

    #校验订单数据
    mid = msg.pop("mid")
    lotid = int(msg.get("lotid", 0))
    pid = msg.get("pid")
    uid = msg.get("uid")
    couponid = msg.get("couponid")
    paymoney = msg.get("paymoney")
    couponmoney = msg.get("couponmoney")

    #更新订单状态
    obj_order = Trade.get(lotid)
    paystatus = msg.get("paystatus")
    try:
        params = {
            "mid": mid,
            "pid": pid,
            "couponid": couponid,
            "paymoney": paymoney,
            "couponmoney": couponmoney,
            "originstatus": define.ORDER_STATUS_UNPAY,
            "targetstatus": define.ORDER_STATUS_SUCC if paystatus == define.ORDER_PAY_STATUS_SUCC else define.ORDER_STATUS_FAILPAY,
            "remark": define.PAY_STATUS_REMARK[paystatus]
        }
        obj_order.update_order_status(params)
    except:
        #更新订单状态异常处理, 告警+重试
        logger.error(traceback.format_exc())
        raise
    else:
        if paystatus == define.ORDER_PAY_STATUS_SUCC:
            params = {
                "lotid": lotid,
                "oid": pid,
                "msgtype": define.MSG_TYPE_ORDER_SUCCPAY,
                "msgcnt": ujson.dumps(msg)
            }
            try:
                mid = MsgRecord().insert(params)
                msg.update({"mid": mid})
            except:
                # 防止重复插入
                logger.error(traceback.format_exc())
            else:
                rds = db_pool.get_redis("msgbus")
                rds.publish("TRADE#ORDER#SUCCPAY", ujson.dumps(msg))

                # 活动消息: [用户购买成功]
                order = obj_order.get_project_by_pid(pid)
                activity_msg = {
                    "uid": order.get("f_uid"),
                    "pid": order.get("f_pid"),
                    "lotid": order.get("f_lotid"),
                    "wtype": order.get("f_wtype"),
                    "zhushu": order.get("f_zhushu"),
                    "beishu": order.get("f_beishu"),
                    "allmoney": order.get("f_allmoney"),
                    "couponmoney": order.get("f_couponmoney"),
                    "returnmoney": order.get("f_cancelmoney"),
                    "prize": order.get("f_getmoney"),
                    "buytime": order.get("f_crtime"),
                    "firsttime": order.get("f_firsttime", "") or "",
                    "lasttime": order.get("f_lasttime", "") or "",
                    "fadan": order.get("f_ptype", 0) or 0,
                    "followpid": order.get("f_fid", 0) or 0,
                    "orderstatus": order.get("f_orderstatus"),
                    "isjprize": order.get("f_isjprize"),
                    "platform": order.get("f_platform")
                }
                MQ.send_msg('buy_suc', activity_msg)
        else:
            pass
Пример #24
0
def tickets_update_project(lotid, pid, uid):
    obj_ticket = Ticket.get(int(lotid))
    prj_tickets_status = obj_ticket.get_tickets_status_by_project(pid)
    ticketnum = sum(ts["cnt"] for ts in prj_tickets_status)
    prj_tickets_status = {ts["status"]:ts["cnt"] for ts in prj_tickets_status}
    logger.debug("prj_tickets_status=%s", prj_tickets_status)

    orderstatus = isjprize = None
    rds = db_pool.get_redis("msgbus")
    # 全部出票
    if define.TICKET_STATUS_SAVED not in prj_tickets_status:
        # 全部算奖
        if define.TICKET_STATUS_PRINTED not in prj_tickets_status:
            # 全部未中奖
            if define.TICKET_STATUS_PRIZED not in prj_tickets_status:
                # 全部撤单
                if define.TICKET_STAUTS_LOSE not in prj_tickets_status:
                    orderstatus = define.ORDER_STATUS_CANCEL
                    isjprize = define.ORDER_JPRIZE_UNCAL
                else:
                    if define.TICKET_STATUS_CANCEL in prj_tickets_status:
                        orderstatus = define.ORDER_STATUS_PRINT_PART
                    else:
                        orderstatus = define.ORDER_STATUS_PRINT_ALL
                    isjprize = define.ORDER_JPRIZE_LOSE
            else:
                #部分撤单
                if define.TICKET_STATUS_CANCEL in prj_tickets_status:
                    orderstatus = define.ORDER_STATUS_PRINT_PART
                else:
                    orderstatus = define.ORDER_STATUS_PRINT_ALL
                isjprize = define.ORDER_JPRIZE_PRIZE

            #全部票已经算奖或者撤单, 触发派奖
            #票状态入库与消息推送异步,此处会有重复消息
            rds.publish("TRADE#ORDER#PRIZE", ujson.dumps({"lotid": lotid, "pid": pid, "uid": uid}))
        else:
            if define.TICKET_STATUS_CANCEL in prj_tickets_status:
                orderstatus = define.ORDER_STATUS_PRINT_PART
            else:
                orderstatus = define.ORDER_STATUS_PRINT_ALL
            isjprize = define.ORDER_JPRIZE_UNCAL
        obj_order = Trade.get(int(lotid))
        order = None
        try:
            obj_order.tickets_update_project(pid, orderstatus, isjprize)
            order = obj_order.get_project_by_pid(pid)
            # 活动消息: [方案出票成功]
            if orderstatus in [define.ORDER_STATUS_PRINT_PART, define.ORDER_STATUS_PRINT_ALL]:
                activity_msg = {
                    "uid": order.get("f_uid"),
                    "pid": order.get("f_pid"),
                    "lotid": order.get("f_lotid"),
                    "wtype": order.get("f_wtype"),
                    "zhushu": order.get("f_zhushu"),
                    "beishu": order.get("f_beishu"),
                    "allmoney": order.get("f_allmoney"),
                    "couponmoney": order.get("f_couponmoney"),
                    "returnmoney": order.get("f_cancelmoney"),
                    "prize": order.get("f_getmoney"),
                    "buytime": order.get("f_crtime"),
                    "firsttime": order.get("f_firsttime", "") or "",
                    "lasttime": order.get("f_lasttime", "") or "",
                    "fadan": order.get("f_ptype", 0) or 0,
                    "followpid": order.get("f_fid", 0) or 0,
                    "orderstatus": order.get("f_orderstatus"),
                    "isjprize": order.get("f_isjprize"),
                    "platform": order.get("f_platform")
                }
                MQ.send_msg('print_suc', activity_msg)
        except:
            pass
        else:
            #非追号订单, 通知解冻扣款
            if order.get("f_chaseid", 0) == 0:
                msg = {
                    "lotid": lotid,
                    "pid": pid,
                    "uid": uid
                }
                params = {
                    "lotid": lotid,
                    "oid": pid,
                    "msgtype": define.MSG_TYPE_TICKET_PRINTED,
                    "msgcnt": ujson.dumps(msg)
                }
                try:
                    mid = MsgRecord().insert(params)
                    msg.update({"mid": mid})
                except:
                    pass
                    # 防止重复插入
                    #logger.error(traceback.format_exc())
                else:
                    rds.publish("TRADE#ORDER#PRINTED", ujson.dumps(msg))
            else:
                pass
    else:
        pass
    return orderstatus, isjprize
Пример #25
0
    def user_send_sms(self, mobile, vtype):
        """
        :param mobile:
        :param vtype:
        :return:
        """

        pt = re.compile('^0\d{2,3}\d{6,7,8}$|^1[3456789]\d{9}$|^147\d{8}')
        phonematch = pt.match(mobile)
        if not phonematch:
            raise ews.EwsError(ews.STATUS_USER_MOBILE_FORMAT_ERROR)
        #
        userinfo = self.get_user_info_by_mobile(mobile)
        if vtype == "reg":
            if userinfo:
                raise ews.EwsError(ews.STATUS_USER_MOBILE_ALREAD_REG)
        elif vtype == "auth":
            if not userinfo:
                raise ews.EwsError(ews.STATUS_USER_MOBILE_ACCOUNT_NOT_FOUND)
            if userinfo.get("realname"):
                raise ews.EwsError(ews.STATUS_ALREADY_TRUENAME)

        else:
            if not userinfo:
                raise ews.EwsError(ews.STATUS_USER_MOBILE_ACCOUNT_NOT_FOUND)

        rds = db_pool.get_redis('main')
        data = {}
        # 短信服务发送验证码(频率限制)
        time_limit_key = rediskey.REDIS_USER_MOBILE_SEND_SMS_TIME_LIMIT.format(
            mobile=mobile, vtype=vtype)
        timestamp = rds.get(time_limit_key)
        if timestamp:
            data['timeleft'] = 60 - (int(time.time()) - int(timestamp))
            return data

        tday = datetime.datetime.now().weekday()
        key = rediskey.REDIS_USER_MOBILE_SEND_SMS_COUNT_LIMIT.format(
            mobile=mobile, tday=tday)
        days_code = rds.get(key)
        # TODO  测试屏蔽

        if days_code:
            if int(days_code) >= 20:
                raise ews.EwsError(ews.STATUS_AUTH_MOBILE_CODE_MULNUM)

        # 发送验证码
        codelist = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')
        code = sample(codelist, 4)
        code = ''.join([str(i) for i in code])
        logger.info("mobile %s code:%s", vtype, code)

        params = {"code": code}
        SMS_TPL = {
            'reg': 'SMS_127035066',
            'pwd': 'SMS_127035065',
            'auth': 'SMS_127035069',
            'withdraw': 'SMS_133270931'
        }
        resp = sms.send_sms(uuid.uuid1(), mobile, "小牛",
                            SMS_TPL.get(vtype, 'SMS_127035066'),
                            ujson.dumps(params))
        resp = ujson.loads(resp)
        resp_code = resp.get("Code")

        if resp_code != "OK":
            logger.debug(resp)
            raise ews.EwsError(ews.STATUS_USER_SEND_SMS_FAIL)

        rds.setex(rediskey.REDIS_USER_MOBILE_SMS_CODE.format(mobile=mobile),
                  code, 300)  # 验证码有效期5分钟
        rds.setex(time_limit_key, int(time.time()), 60)  # 频率限制1分钟

        rds.incr(key, 1)
        rds.expire(key, 24 * 60 * 60)

        data['lefttime'] = 60
        data['expired'] = 300
        return data
Пример #26
0
    def realname_auth(self, params):
        """
        实名认证
        :param params:
        :return:
        """
        idcard = params.get("idcard")
        truename = params.get("realname")
        code = params.get("code")
        rds = db_pool.get_redis("main")

        self.__check_auth_idcard(idcard, truename)
        module = "user"
        method = "user_info"
        user_info = {}
        with get_rpc_conn(module) as proxy:
            try:
                user_info = proxy.call(method, params)
                user_info = ujson.loads(user_info)
            except:
                logger.error(traceback.format_exc())
                raise ews.EwsError(ews.STATUS_USER_INFO_FAIL)

        # 获取实名信息接口
        if user_info.get("realname", ""):
            # 实名认证
            raise ews.EwsError(ews.STATUS_ALREADY_TRUENAME)
        mobile = user_info.get("mobile")
        _code = rds.get(
            rediskey.REDIS_USER_MOBILE_SMS_CODE.format(mobile=mobile))
        limit_count = rds.incr(
            rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                mobile=mobile))
        rds.expire(
            rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                mobile=mobile), 6 * 60 * 60)
        if limit_count >= 6:
            logger.error(
                'Mobile sms code verify limit! mobile=%s|count=%s|key=%s',
                mobile, limit_count,
                rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT)
            raise ews.EwsError(ews.STATUS_USER_VERIDFY_CODE_LIMIT_ERROR)
        if _code != code:
            raise ews.EwsError(ews.STATUS_USER_SMS_CODE_ERROR)

        rds.delete(
            rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                mobile=mobile))
        status = self.verifyIdcard(idcard, truename)

        if not status:
            raise ews.EwsError(ews.STATUS_AUTH_TRUENAME_FAIL)
        module = "user"
        method = "realname_auth"
        ret = {}
        with get_rpc_conn(module) as proxy:
            try:
                ret = proxy.call(method, params)
            except:
                logger.error(traceback.format_exc())
                raise ews.EwsError(ews.STATUS_AUTH_TRUENAME_FAIL)
        return
Пример #27
0
def get_data_token(dt_key):
    """获取data_token
    """
    rds = db_pool.get_redis('main')
    return rds.get(DATA_TOKEN_PREFIX + dt_key)
Пример #28
0
    def lianlian_withdraw(self, params):

        money = params.get("money")
        if float(money) < 1:
            raise ews.EwsError(ews.STATUS_WITHDRAW_MONEY_LIMIT)

        module = "user"
        method = "user_info"
        user_info = {}
        with get_rpc_conn(module) as proxy:
            try:
                user_info = proxy.call(method, params)
                user_info = ujson.loads(user_info)
            except:
                logger.error(traceback.format_exc())
                raise ews.EwsError(ews.STATUS_USER_INFO_FAIL)

                # 获取实名信息接口
        if not user_info.get("realname", ""):
            # 实名认证
            raise ews.EwsError(ews.STATUS_USER_NOT_AUTH)

        card_no = user_info.get("cardno", "")

        if not user_info.get("cardno", ""):
            raise ews.EwsError(ews.STATUS_NOT_BIND_CARD)

        params.update({"card_no": card_no})

        rds = db_pool.get_redis('main')
        mobile = user_info.get("mobile")

        code = params.get("code", "")
        uid = params.get("uid")
        _code = rds.get(
            rediskey.REDIS_USER_MOBILE_SMS_CODE.format(mobile=mobile))
        limit_count = rds.incr(
            rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                mobile=mobile))
        rds.expire(
            rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                mobile=mobile), 6 * 60 * 60)
        if limit_count >= 6:
            raise ews.EwsError(ews.STATUS_USER_VERIDFY_CODE_LIMIT_ERROR)
        if not _code or _code != code:
            raise ews.EwsError(ews.STATUS_USER_SMS_CODE_ERROR)
        rds.delete(
            rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                mobile=mobile))
        module = "account"
        method = "recharge_withdraw"

        oid = None
        with get_rpc_conn(module) as proxy:
            try:
                oid = proxy.call(method, params)

            except RpcException as ex:
                raise ews.EwsError(ews.STATUS_RPC_ERROR, ex.message)

            except:
                logger.error(traceback.format_exc())
                send_textcard_message(msgtype="提款下单异常",
                                      servicename="nncp-api",
                                      exceptinfo="提款下单错误 uid:%s" % (uid))
                raise ews.EwsError(ews.STATUS_USER_WITHDRAW_PLACEORDER_FAIL)

        if not oid:
            send_textcard_message(msgtype="提款下单异常",
                                  servicename="nncp-api",
                                  exceptinfo="提款下单错误 uid:%s" % (uid))
            raise ews.EwsError(ews.STATUS_USER_WITHDRAW_PLACEORDER_FAIL)

        return {}
Пример #29
0
    def user_mobile_reg(self, params):

        password = params.get("password")
        password = hashlib.md5(password + define.DEFIND_LOGIN_SALT).hexdigest()
        mobile = params.get("mobile")
        idfa = params.get("idfa")
        code = params.get("code")

        rds = db_pool.get_redis("main")
        if not re.match(PATTERN, mobile):
            # 手机号非法
            key = rediskey.REDIS_MOBILE_LOGIN_COUNT_LIMIT.format(deviceid=idfa)
            rds.incr(key, 1)
            raise ews.EwsError(ews.STATUS_USER_MOBILE_FORMAT_ERROR)

        params.update({"password": password})

        userinfo = self.get_user_info_by_mobile(mobile)
        if userinfo:
            raise ews.EwsError(ews.STATUS_USER_MOBILE_ALREAD_REG)
        else:
            _code = rds.get(
                rediskey.REDIS_USER_MOBILE_SMS_CODE.format(mobile=mobile))
            limit_count = rds.incr(
                rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                    mobile=mobile))
            rds.expire(
                rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                    mobile=mobile), 6 * 60 * 60)
            if limit_count >= 6:
                logger.error(
                    'Mobile sms code verify limit! mobile=%s|count=%s|key=%s',
                    mobile, limit_count,
                    rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT)
                raise ews.EwsError(ews.STATUS_USER_VERIDFY_CODE_LIMIT_ERROR)
            if _code != code:
                raise ews.EwsError(ews.STATUS_USER_SMS_CODE_ERROR)

            #注册
            module = "user"
            method = "mobile_reg"
            uid = 0
            with get_rpc_conn(module) as proxy:
                try:
                    uid = proxy.call(method, params)
                except:
                    logger.error(traceback.format_exc())
                    raise ews.EwsError(ews.STATUS_USER_REG_FAIL)

                #登录日志
                params.update({"uid": uid})
                proxy.call("login_log", params)

            #写ck
            ck = session.make_ck(uid)
            session.set_ck_to_redis(ck, uid, ttl=7 * 24 * 60 * 60)
            rds.delete(
                rediskey.REDIS_USER_MOBILE_SMS_CODE_VERIFY_LIMIT.format(
                    mobile=mobile))

            return {"uid": uid, "ck": ck}