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
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
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
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
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)
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)
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, '提交成功'
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"验证码已发送!" })