def validate_code(mobile, verify_code):
    """
    Only indicate whether or not verify_code is valid.
    """
    if not verify_code:
        return False

    current_time = datetime.datetime.now()
    earliest_send_time = current_time - datetime.timedelta(
        seconds=CODE_TIME_LIMIT)
    reg = Register.objects.filter(vmobile=mobile).first()

    if not (reg and reg.code_time and reg.verify_code):
        return False

    verify_code = verify_code.strip()
    if reg.code_time > earliest_send_time and reg.verify_code == verify_code:
        reg.submit_count = 0
        reg.verify_count += 1
        reg.verify_code = ''
        reg.save(update_fields=['submit_count', 'verify_count', 'verify_code'])
        return True

    if XiaoluSwitch.is_switch_open(6):
        logger.error(
            u'validate_code false, reg.verify_code=%s,verify_code=%s' %
            (reg.verify_code, verify_code))

    return False
Exemple #2
0
def request_getway(data, notify_type, account):
    if XiaoluSwitch.is_switch_open(11):
        logger.info({
            'action': 'fengchao_request',
            'action_time': datetime.datetime.now(),
            'notify_type': notify_type,
            'data': data,
        })

    data_str = str(json.dumps(data, ensure_ascii=False, encoding='utf8'))
    req_params = {
        'app_id': FENGCHAO_APPID,
        'notify_type': notify_type,
        'sign_type': 'md5',
        'sign': sign_string(data_str, FENGCHAO_SECRET),
        'data': data_str,
    }

    resp = requests.post(FENGCHAO_API_GETWAY, data=req_params, verify=False)
    if not resp.status_code == 200:
        raise FengchaoApiException('蜂巢api错误: %s' % resp.text)

    content = json.loads(resp.text)
    if not content.get('success'):
        raise FengchaoApiException('蜂巢api错误: %s' % content.get('error_msg'))

    return content
Exemple #3
0
    def verify_request(self, data):
        if XiaoluSwitch.is_switch_open(11):
            logger.info({
                'action': 'fengchao_callback',
                'action_time': datetime.datetime.now(),
                'data': data,
            })

        owapp = OutwareAccount.objects.filter(
            app_id=data.get('app_id', '')).first()
        verify_data = deepcopy(data)
        sign = verify_data.pop('sign', '')
        return owapp and owapp.sign_verify(verify_data, sign) or False
Exemple #4
0
def task_activate_xiaolumama(openid, wx_pubid):
    wx_api = WeiXinAPI()
    wx_api.setAccountId(wxpubId=wx_pubid)
    app_key = wx_api.getAppKey()

    fan = WeixinFans.objects.filter(openid=openid, app_key=app_key).first()
    if not fan:
        return

    unionid = fan.unionid
    mama = XiaoluMama.objects.filter(openid=unionid,
                                     charge_status=XiaoluMama.UNCHARGE,
                                     status=XiaoluMama.EFFECT).first()
    if not mama:
        return

    # 内部测试
    if XiaoluSwitch.is_switch_open(2):
        return

    mama_id = mama.id
    charge_time = datetime.datetime.now()
    renew_date = datetime.date.today()
    renew_time = datetime.datetime(renew_date.year, renew_date.month,
                                   renew_date.day)
    XiaoluMama.objects.filter(id=mama_id).update(
        charge_status=XiaoluMama.CHARGED,
        charge_time=charge_time,
        last_renew_type=XiaoluMama.SCAN,
        renew_time=renew_time,
        agencylevel=XiaoluMama.A_LEVEL)

    referal_from_mama_id = None
    qrscene = fan.get_qrscene()
    if qrscene and qrscene.isdigit():
        referal_from_mama_id = int(qrscene)
    else:
        return

    if referal_from_mama_id < 1:
        return
Exemple #5
0
def task_create_mama_referal_qrcode_and_response_weixin(
        wxpubId, openid, event, eventKey):
    """ to_username: 公众号id, from_username: 关注用户id """
    if XiaoluSwitch.is_switch_open(3):
        return

    try:
        #xiaolumm = get_or_create_weixin_xiaolumm(wxpubId, openid, event, eventKey)

        userinfo = get_or_fetch_userinfo(openid, wxpubId)
        unionid = userinfo['unionid']
        if not userinfo:
            return

        mama = XiaoluMama.objects.filter(openid=unionid).first()
        if not mama:
            # raise XiaoluMama.DoesNotExist()
            return

        # 获取创建用户小鹿妈妈信息,
        media_id = fetch_wxpub_mama_custom_qrcode_media_id(
            mama.id, userinfo, wxpubId)

        wx_api = WeiXinAPI(wxpubId=wxpubId)
        # 调用客服回复接口返回二维码图片消息
        try:
            wx_api.send_custom_message({
                "touser": openid,
                "msgtype": "image",
                "image": {
                    "media_id": media_id
                }
            })
        except Exception, exc:
            pass
    except Exception, exc:
        raise task_create_mama_referal_qrcode_and_response_weixin.retry(
            exc=exc)
Exemple #6
0
def weixinfans_create_awardcarry(sender, instance, created, **kwargs):
    if not created:
        return

    if instance.app_key != settings.WX_PUB_APPID: # 关注小鹿美美有奖励,否则没有
        return
    
    if XiaoluSwitch.is_switch_open(2):
        return

    referal_from_mama_id = None
    qrscene = instance.get_qrscene()
    if qrscene and qrscene.isdigit():
        referal_from_mama_id = int(qrscene)
    elif qrscene:
        # qrscene has content (not digital), we simply return
        return

    from shopapp.weixin.tasks import task_weixinfans_create_subscribe_awardcarry, task_weixinfans_create_fans_awardcarry

    referal_to_unionid = instance.unionid
    task_weixinfans_create_subscribe_awardcarry.delay(referal_to_unionid)
    if referal_from_mama_id >= 1:
        task_weixinfans_create_fans_awardcarry.delay(referal_from_mama_id, referal_to_unionid)
Exemple #7
0
    def action_budget_cashout(self,
                              cash_out_amount,
                              verify_code=None,
                              channel=None,
                              name=None,
                              card_id=None):
        """
        用户钱包提现
        cash_out_amount 整型 以分为单位
        """
        from flashsale.restpro.v2.views.xiaolumm import CashOutPolicyView
        min_cashout_amount = CashOutPolicyView.MIN_CASHOUT_AMOUNT
        max_cashout_amount = CashOutPolicyView.MAX_CASHOUT_AMOUNT
        audit_cashout_amount = CashOutPolicyView.AUDIT_CASHOUT_AMOUNT

        mobile = self.user.mobile
        if not (mobile and mobile.isdigit() and len(mobile) == 11):
            return 8, '提现请先至个人中心绑定手机号,以便接收验证码!'

        from flashsale.restpro.v2.views.verifycode_login import validate_code
        if not validate_code(mobile, verify_code):
            return 9, '验证码不对或已过期,请重新发送验证码!'

        if not isinstance(cash_out_amount, int):  # 参数类型错误(如果不是整型)
            return 3, '参数错误'

        if cash_out_amount < min_cashout_amount:
            info = u'最小提现额%s元' % int(min_cashout_amount * 0.01)
            return 1, info
        elif cash_out_amount > max_cashout_amount and channel != 'wx_transfer':
            info = u'一次提现不能超过%s元' % int(max_cashout_amount * 0.01)
            return 5, info
        elif cash_out_amount > self.amount:
            return 2, '提现金额大于账户余额'

        from shopback.monitor.models import XiaoluSwitch
        if XiaoluSwitch.is_switch_open(4):
            return 11, '系统维护中,提现功能暂时关闭!'

        try:
            if not self.user.unionid:
                return 5, '提现请先关注公众号[小鹿美美]'
            from shopapp.weixin.models import WeixinUnionID
            wx_union = WeixinUnionID.objects.get(app_key=settings.WX_PUB_APPID,
                                                 unionid=self.user.unionid)
        except WeixinUnionID.DoesNotExist:
            return 4, '提现请先关注公众号[小鹿美美]'  # 用户没有公众号提现账户

        # 发放公众号红包
        recipient = wx_union.openid  # 接收人的openid
        body = constants.ENVELOP_BODY  # 红包祝福语
        description = constants.ENVELOP_CASHOUT_DESC.format(
            self.user.id, self.amount)  # 备注信息 用户id, 提现前金额

        customer_id = self.user.id
        if BudgetLog.is_cashout_limited(customer_id):
            return 6, '今日提现次数已满,请明天再来哦!'

        uni_key = BudgetLog.gen_uni_key(customer_id, BudgetLog.BUDGET_OUT,
                                        BudgetLog.BG_CASHOUT)
        bl = BudgetLog.objects.filter(uni_key=uni_key).first()
        if bl:
            return 7, '您两次提交间隔太短,稍等下再试哦!'

        if channel == 'wx_transfer' and (not name):
            return 101, '请填写真实姓名'

        with transaction.atomic():
            # 创建钱包提现记录
            budget_log = BudgetLog.create(customer_id,
                                          BudgetLog.BUDGET_OUT,
                                          cash_out_amount,
                                          BudgetLog.BG_CASHOUT,
                                          status=BudgetLog.PENDING,
                                          uni_key=uni_key)

            # TODO@meron后面如果要改公众号转账, 则platform需要修改
            if channel in ('wx_transfer', Envelop.SANDPAY):
                platform = channel == Envelop.SANDPAY and Envelop.SANDPAY or Envelop.WX_TRANSFER
                if channel == Envelop.SANDPAY:
                    recipient = card_id
                envelop = Envelop.objects.create(
                    amount=cash_out_amount,
                    platform=platform,
                    recipient=recipient,
                    subject=Envelop.XLAPP_CASHOUT,
                    body=name or '',
                    receiver=self.user.mobile,
                    description=description,
                    referal_id=budget_log.id,
                    customer_id=self.user.id,
                )
            else:
                envelop = Envelop.objects.create(
                    amount=cash_out_amount,
                    platform=Envelop.WXPUB,
                    recipient=recipient,
                    subject=Envelop.XLAPP_CASHOUT,
                    body=body,
                    receiver=self.user.mobile,
                    description=description,
                    referal_id=budget_log.id,
                    customer_id=self.user.id,
                )
            budget_log.referal_id = envelop.id
            budget_log.save()

        # 通过微信公众号小额提现,直接发红包,无需审核,一天限制2次
        if cash_out_amount <= audit_cashout_amount and cash_out_amount >= min_cashout_amount:
            envelop.send_envelop()

        return 0, '提交成功'
Exemple #8
0
    def get(self, request, linkid):
        from django_statsd.clients import statsd

        statsd.incr('xiaolumm.weixin_click')
        content = request.GET
        next_page = content.get('next', None)
        click_url = request.get_full_path()
        # print 'next_page:', next_page
        # logger.error('next_page %s-path:%s' % (next_page, content))
        click_time = datetime.datetime.now()
        if not self.is_from_weixin(request):
            share_url = get_share_url(next_page=next_page,
                                      mm_linkid=linkid,
                                      ufrom='web')
            response = redirect(share_url)
            response.set_cookie('mm_linkid', linkid, max_age=86400)
            if XiaoluSwitch.is_switch_open(10):
                logger.info({
                    'action': 'ClickLogView',
                    'code': 1,
                    'mm_linkid': linkid,
                    'redirect_url': share_url,
                    'click_url': click_url,
                    'created': datetime.datetime.now(),
                })
            return response

        self.set_appid_and_secret(settings.WX_PUB_APPID,
                                  settings.WX_PUB_APPSECRET)
        openid, unionid = self.get_openid_and_unionid(request)
        if not valid_openid(openid):
            redirect_url = self.get_wxauth_redirct_url(request)
            return redirect(redirect_url)

        ctasks.task_Create_Click_Record.delay(linkid, openid, unionid,
                                              click_time,
                                              settings.WX_PUB_APPID, click_url)

        if not valid_openid(unionid):
            unionid = get_unionid_by_openid(openid, settings.WX_PUB_APPID)

        # 2017-2-27 正式的小鹿妈妈为精英妈妈及以上
        if int(linkid) <= 0:
            xlmms = XiaoluMama.objects.filter(
                openid=unionid,
                status=XiaoluMama.EFFECT,
                charge_status=XiaoluMama.CHARGED,
                last_renew_type__gte=XiaoluMama.ELITE)
            linkid = xlmms.exists() and xlmms[0].id or linkid

        if int(linkid) <= 0 and XiaoluSwitch.is_switch_open(10):
            logger.info({
                'action': 'ClickLogView',
                'code': 2,
                'unionid': unionid,
                'mm_linkid': linkid,
                'http_referer': request.META.get('HTTP_REFERER'),
                'click_url': click_url,
                'cookies': request.COOKIES,
                'created': datetime.datetime.now(),
            })

        # 2017-2-27 如果打开链接的人是个你的铺子妈妈,以前是会用你的铺子妈妈id替换next里面的mamaid,现在不这样做,还是使用原来的linkid
        # share_url = get_share_url(next_page=next_page, mm_linkid=mm_linkid, ufrom='wx')
        share_url = get_share_url(next_page=next_page,
                                  mm_linkid=linkid,
                                  ufrom='wx')
        response = redirect(share_url)
        self.set_cookie_openid_and_unionid(response, openid, unionid)
        response.set_cookie('mm_linkid', linkid, max_age=86400)
        return response
    def post(self, request):
        content = request.data
        mobile = content.get("mobile", "0")
        action = content.get("action", "")

        valid_request = valid_send_request(request)
        if not valid_request:
            import random
            rnum = random.randint(1, 10)
            if rnum % 2 == 1:
                return Response({
                    "rcode": 0,
                    "code": 0,
                    "msg": u"手机已注册",
                    "info": u"手机已注册"
                })
            else:
                return Response({
                    "rcode": 0,
                    "code": 0,
                    "msg": u"验证码已发送",
                    "info": u"验证码已发送"
                })

        # 稳定后,日志可以移到valid_request 之后,降低系统负担
        if XiaoluSwitch.is_switch_open(9):
            logger.info({
                'action':
                'api.v2.send_code',
                'ip':
                request.META.get('REMOTE_ADDR', ''),
                'http_user_agent':
                request.META.get('HTTP_USER_AGENT', ''),
                'cookie':
                request.META.get('HTTP_COOKIE', ''),
                'http_origin':
                request.META.get('HTTP_ORIGIN', ''),
                'http_referer':
                request.META.get('HTTP_REFERER', ''),
                'mobile':
                mobile,
                'type':
                action,
            })

        if not validate_mobile(mobile):
            info = u"亲,手机号码错啦!"
            return Response({"rcode": 1, "code": 1, "msg": info, "info": info})

        if not validate_action(action):
            info = u"亲,操作错误!"
            return Response({"rcode": 1, "code": 1, "msg": info, "info": info})

        customer = get_customer(request, mobile)

        if customer:
            if action == 'register':
                info = u"该用户已经存在啦!"
                return Response({
                    "rcode": 2,
                    "code": 2,
                    "msg": info,
                    "info": info
                })
        else:
            if action in ['find_pwd', 'change_pwd', 'bind', 'sms_login']:
                info = u"该用户还不存在呢!"
                return Response({
                    "rcode": 3,
                    "code": 3,
                    "msg": info,
                    "info": info
                })

        reg, created = get_register(mobile)
        if not created:
            # if reg is not just created, we have to check
            # day limit and resend condition.
            if check_day_limit(reg):
                info = u"当日验证次数超过限制!"
                return Response({
                    "rcode": 4,
                    "code": 4,
                    "msg": info,
                    "info": info
                })
            if not should_resend_code(reg):
                info = u"验证码刚发过咯,请{}秒后重试!".format(delay_seconds(reg))
                return Response({
                    "rcode": 5,
                    "code": 5,
                    "msg": info,
                    "info": info
                })

        if should_generate_new_code(reg):
            reg.verify_code = reg.genValidCode()
            reg.code_time = datetime.datetime.now()

        reg.mail_time = datetime.datetime.now()
        reg.submit_count += 1
        reg.save()

        task_register_code.delay(mobile, "3")
        return Response({
            "rcode": 0,
            "code": 0,
            "msg": u"验证码已发送!",
            "info": u"验证码已发送!"
        })