Exemple #1
0
    def __init__(self, product, user, order_id=None, request=None):
        self.user = user
        self.product = product

        if self.product.status != u"正在招标":
            raise P2PException(u'购买的标不在招标状态')

        self.request = request
        if order_id is None:
            self.order_id = OrderHelper.place_order(user,
                                                    order_type=u'产品申购',
                                                    product_id=product.id,
                                                    status=u'新建').id
        else:
            self.order_id = order_id
        self.margin_keeper = MarginKeeper(user=user, order_id=self.order_id)
        self.product_keeper = ProductKeeper(product, order_id=self.order_id)
        self.equity_keeper = EquityKeeper(user=user,
                                          product=product,
                                          order_id=self.order_id)
        if request:
            self.device = split_ua(request)
            self.device_type = self.device['device_type']
        else:
            self.device = split_ua(request)
            self.device_type = "pc"
Exemple #2
0
def detect(request):
    stype = request.DATA.get("type", "").strip()
    pagesize = request.DATA.get("pagesize", "10").strip()
    pagenum = request.DATA.get("pagenum", "1").strip()
    product_id = request.DATA.get("product_id", "").strip()
    device = rest_utils.split_ua(request)
    device_type = rest_utils.decide_device(device['device_type'])
    try:
        app_version = device['app_version']
    except KeyError:
        app_version = ''

    if not stype or stype not in ("deposit", "withdraw", "amortization"):
        return {"ret_code": 30191, "message": u"错误的类型"}
    if not pagesize.isdigit() or not pagenum.isdigit():
        return {"ret_code": 30192, "message": u"请输入正确的参数"}
    pagesize = int(pagesize)
    pagenum = int(pagenum)
    if pagesize > 100:
        return {"ret_code": 30193, "message": u"参数超出限制"}
    if product_id:
        if not product_id.isdigit():
            return {"ret_code": 30194, "message": u"产品号错误"}
        else:
            product_id = int(product_id)

    user = request.user
    if stype == "deposit":
        res = _deposit_record(user, pagesize, pagenum)
    elif stype == "withdraw":
        res = _withdraw_record(user, pagesize, pagenum, app_version)
    else:
        res = _amo_record(user, pagesize, pagenum, product_id)
    return {"ret_code": 0, "data": res, "pagenum": pagenum}
Exemple #3
0
    def post(self, request):

        red_pack_info = dict()
        period = request.POST.get('period', 0)
        uid = request.POST.get('userId', 0)

        if request.user.id:
            uid = request.user.id

        # if self.request.user.pk and int(self.request.user.pk) == int(uid):
        # 去掉登录验证, 方便PHP
        if period and uid:
            device = utils.split_ua(self.request)

            result = php_redpacks(User.objects.get(pk=uid),
                                  device['device_type'],
                                  period=period)
            redpacks = result['packages'].get('available', [])

            red_pack_info.update(status=1, redpacks=redpacks)
        else:
            red_pack_info.update(status=0, msg=u'authentic error!')

        return HttpResponse(renderers.JSONRenderer().render(
            red_pack_info, 'application/json'))
Exemple #4
0
    def post(self, request):
        logger.info('web_pay_request_para:' + str(request.POST))

        try:
            user = request.user
            amount = fmt_two_amount(request.POST.get('amount'))
            gate_id = request.POST.get('gate_id')
            request_ip = get_client_ip(request)
            device_type = split_ua(request)['device_type']
            channel = PayOrder.get_bank_and_channel(gate_id)[1]
        except:
            logger.exception('third_pay_error')
            result = {'message': '参数错误'}
            return self.render_to_response(result)

        if channel == 'yeepay':
            result = YeeProxyPay().proxy_pay(user, amount, gate_id, request_ip,
                                             device_type)
        elif channel == 'baopay':
            result = BaoProxyPay().proxy_pay(user, amount, gate_id, request_ip,
                                             device_type)
        else:
            result = HuifuPay().pre_pay(request)

        print 'pay_jump_para' + str(result)
        return self.render_to_response(result)
Exemple #5
0
 def post(self, request):
     token = request.DATA.get("token", "")
     device = utils.split_ua(request)
     user = request.user
     try:
         app_version = device['app_version']
     except KeyError:
         app_version = ''
     result = backends.exchange_redpack(token, device['device_type'], user,
                                        app_version)
     return Response(result)
Exemple #6
0
    def get_context_data(self, id, **kwargs):
        context = super(P2PDetailView, self).get_context_data(**kwargs)

        cache_backend = redis_backend()
        p2p = cache_backend.get_cache_p2p_detail(id)
        if not p2p:
            raise Http404(u'您查找的产品不存在')

        form = PurchaseForm(initial={'product': p2p.get('id')})
        user = self.request.user
        current_equity = 0

        if user.is_authenticated():
            equity_record = P2PEquity.objects.filter(user=user, product=p2p.get('id')).first()
            if equity_record is not None:
                current_equity = equity_record.equity

            xunlei_vip = Binding.objects.filter(user=user).filter(btype='xunlei').first()
            context.update({
                'xunlei_vip': xunlei_vip,
                'is_invested': user.wanglibaouserprofile.is_invested
            })

        orderable_amount = min(p2p.get('limit_amount_per_user') - current_equity, p2p.get('remain'))
        # site_data = SiteData.objects.all()[0]
        p2p_invest_records = P2PRecord.objects.filter(product=p2p.get('id')).filter(catalog=u'申购')[0:30]
        p2p_invest_records_total = P2PRecord.objects.filter(product=p2p.get('id')).filter(catalog=u'申购').count()

        device = utils.split_ua(self.request)
        if p2p.get('status') == u'正在招标':
            red_packets = backends.list_redpack(user, 'available', device['device_type'], p2p.get('id'))
        else:
            red_packets = None

        context.update({
            'p2p': p2p,
            'p2p_invest_records': p2p_invest_records,
            'p2p_invest_records_total': p2p_invest_records_total,
            'form': form,
            'end_time': p2p.get('end_time'),
            'total_earning': p2p.get('total_earning'),
            'current_equity': current_equity,
            'orderable_amount': orderable_amount,
            # 'site_data': site_data,
            'announcements': AnnouncementP2P,
            'total_fee_earning': p2p.get('total_fee_earning'),
            'day_tops': [],
            'week_tops': [],
            'all_tops': [],
            'is_valid': False,
            'red_packets': len(red_packets['packages']['available']) if red_packets else 0,
        })

        return context
Exemple #7
0
 def post(self, request):
     status = request.DATA.get("status", "")
     rtype = request.DATA.get("rtype", "")
     product_id = request.DATA.get("product_id", "")
     device = utils.split_ua(request)
     user = request.user
     try:
         app_version = device['app_version']
     except KeyError:
         app_version = ''
     result = backends.list_redpack(user, status, device['device_type'],
                                    product_id, rtype, app_version)
     return Response(result)
Exemple #8
0
    def post(self, request):

        trade_id = request.POST.get('tradeId')
        user_id = request.POST.get('userId')
        product_id = request.POST.get('productId')
        token = request.POST.get('token', None)
        amount = request.POST.get('amount', 0)
        amount_source = request.POST.get('sourceAmount', 0)

        # 给用户的返现金额
        payback_source = request.POST.get('payBackAmount', 0)

        # 红包金额为-1  用于统计已花本金, 还款忽略, 只改状态.
        red_packet = -1
        # 类型, -1 表示未使用红包
        red_packet_type = -1

        try:
            user = User.objects.filter(pk=user_id).first()
            product, status = MonthProduct.objects.get_or_create(
                user=user,
                product_id=product_id,
                trade_id=trade_id,
                token=token,
                amount=amount,
                amount_source=amount_source,
                red_packet=red_packet,
                red_packet_type=red_packet_type,
            )
            device = utils.split_ua(self.request)

            buy_mall_product.apply_async(
                kwargs={
                    'token': token,
                    'amount_source': amount_source,
                    'payback_source': payback_source,
                    'user': user_id,
                    'device_type': device['device_type']
                })

            return HttpResponse(renderers.JSONRenderer().render(
                {'status': '1'}, 'application/json'))

        except Exception, e:
            logger.debug('buy mall product failed with {}!\n'.format(
                e.message))
            return HttpResponse(renderers.JSONRenderer().render(
                {
                    'status': '0',
                    'msg': 'args error! ' + e.message
                }, 'application/json'))
Exemple #9
0
    def post(self, request):

        trade_id = request.POST.get('tradeId')
        user_id = request.POST.get('userId')
        product_id = request.POST.get('productId')
        token = request.POST.get('token')
        amount = request.POST.get('amount')
        amount_source = request.POST.get('sourceAmount')
        red_packet = request.POST.get('redPacketAmount')
        red_packet_type = request.POST.get('isRedPacket')
        period = request.POST.get('period', 1)
        # 使用的红包id
        red_packet_id = request.POST.get('RedPacketId', 0)

        try:
            user = User.objects.get(pk=user_id)
            product, status = MonthProduct.objects.get_or_create(
                user=user,
                product_id=product_id,
                trade_id=trade_id,
                token=token,
                amount=amount,
                amount_source=amount_source,
                red_packet=red_packet,
                cancel_status=False,
                trade_status='NEW',
                red_packet_type=red_packet_type,
            )
            device = utils.split_ua(self.request)

            buy_month_product.apply_async(kwargs={
                'token': token,
                'red_packet_id': red_packet_id,
                'amount_source': amount_source,
                'user': user_id,
                'device': device,
                'period': period
            },
                                          queue='celery_ylb')

            return HttpResponse(renderers.JSONRenderer().render(
                {'status': '1'}, 'application/json'))

        except Exception, e:
            logger.debug('buy month product failed with {}!\n'.format(
                e.message))
            return HttpResponse(renderers.JSONRenderer().render(
                {
                    'status': '0',
                    'msg': 'args error! ' + e.message
                }, 'application/json'))
Exemple #10
0
    def post(self, request):
        size = request.DATA.get('size', '').strip()

        device = split_ua(request)
        device_type = device['device_type']

        if not device_type or not size:
            return Response({'ret_code': 20001, 'message': u'信息输入不完整'})

        if device_type != 'ios' or int(size) not in (x for x in range(1, 9)):
            return Response({'ret_code': 20002, 'message': u'参数不合法'})

        if int(size) in (x for x in range(5, 9)):
            size = str(int(size) - 4)
            device_type = 'act_score_iso'

        size = self.SIZE_MAP[size]
        # activate_query = AppActivate.objects.filter(Q(is_used=True), Q(device=self.DEVICE_MAP[device_type]))
        # activate = activate_query.filter(Q(is_long_used=False) & Q(start_at__lte=timezone.now()) & Q(end_at__gte=timezone.now())).order_by('-priority').first()
        # if not activate:
        #     activate = activate_query.filter(Q(is_long_used=True)).order_by('-priority').first()

        activate = AppActivate.objects.filter(
            Q(is_used=True), Q(device=self.DEVICE_MAP[device_type]),
            Q(is_long_used=True) |
            (Q(is_long_used=False) & Q(start_at__lte=timezone.now())
             & Q(end_at__gte=timezone.now()))).first()

        if activate:
            if size == 'img_one':
                img_url = activate.img_one
            elif size == 'img_two':
                img_url = activate.img_two
            elif size == 'img_three':
                img_url = activate.img_three
            elif size == 'img_four':
                img_url = activate.img_four
            else:
                img_url = ''

            if img_url:
                img_url = '{host}/media/{url}'.format(
                    host=settings.CALLBACK_HOST, url=img_url)
                return Response({
                    'ret_code': 0,
                    'message': 'ok',
                    'image': img_url,
                })

        return Response({'ret_code': 20003, 'message': 'fail'})
Exemple #11
0
def _is_version_satisfied(request):
    # return {"device_type":device_type, "app_version":arr[0],
    #     "channel_id":arr[2], "model":arr[1],
    #     "os_version":arr[3], "network
    # ":arr[4]}
    device = split_ua(request)
    print(11111111111111111111)
    print('trade request device %s' % device)
    if device['device_type'] == 'ios' and _above_version(
            device['app_version'], '2.6.0'):
        # 2.6.0版本起,支持交易密码
        return True
    if device['device_type'] == 'android' and _above_version(
            device['app_version'], '2.6.0'):
        #2.6.0版本起,支持交易密码
        return True
    # no trade_pwd for pc first pay
    if device['device_type'] == 'pc' and PayInfo.objects.filter(
            user=request.user, status=PayInfo.SUCCESS).exists():
        return True
    return False
Exemple #12
0
    def post(self, request):
        result = third_pay.withdraw(request)

        # 短信通知添加用户名
        user = request.user
        try:
            device = split_ua(request)
        except:
            device = {'device_type': 'pc'}
        name = user.wanglibaouserprofile.name or u'用户'
        if not result['ret_code']:
            withdraw_submit_ok.apply_async(
                kwargs={
                    "user_id": user.id,
                    "user_name": name,
                    "phone": request.user.wanglibaouserprofile.phone,
                    "amount": result['amount'],
                    "bank_name": result['bank_name'],
                    "order_id": result['order_id'],
                    "device": device
                })
        return Response(result)
Exemple #13
0
 def get(self, request):
     device = utils.split_ua(request)
     result = []
     device_t = "mobile"
     # if device['device_type'] == "ios":
     #     dic = Misc.objects.filter(key="ios_hide_banner_version").first()
     #     try:
     #         dataver = dic.value.split(",")
     #         appver = device['app_version']
     #         if appver in dataver:
     #             return Response({"ret_code": 1, "results": result})
     #     except Exception, e:
     #         pass
     # elif device['device_type'] == "pc":
     #     device_t = "PC_2"
     # device_t = "mobile"
     # bans = Banner.objects.filter(device=device_t)
     now = timezone.now()
     bans = Banner.objects.filter(device=device_t, type='banner', is_used=True)\
         .filter(Q(is_long_used=True) | Q(start_at__lt=now, end_at__gt=now)).order_by('-priority')[:3]
     for x in bans:
         obj = {
             "id": x.id,
             "image": str(x.image),
             "link": x.link,
             "name": x.name,
             "priority": x.priority,
             "type": x.type
         }
         if device_t == "mobile":
             if not x.alt:
                 result.append(obj)
             elif 'channel_id' in device and x.alt == device['channel_id']:
                 result.append(obj)
         else:
             result.append(obj)
     return Response({"ret_code": 0, "results": result})
Exemple #14
0
def bind_pay_dynnum(request):
    """ 根据银行设置的支付渠道进行支付渠道的支付
        1、确认支付功能
    """
    logger.error(request.DATA)
    user = request.user
    order_id = request.DATA.get("order_id", "").strip()
    token = request.DATA.get("token", "").strip()
    vcode = request.DATA.get("vcode", "").strip()
    input_phone = request.DATA.get("phone", "").strip()
    set_the_one_card = request.DATA.get('set_the_one_card', '').strip()
    device = split_ua(request)
    ip = util.get_client_ip(request)
    mode = request.DATA.get('mode', '').strip()

    if not order_id.isdigit():
        return {"ret_code": 20125, "message": "订单号错误"}
    if not order_id or not token:
        return {"ret_code": 20120, "message": "请重新获取验证码"}

    pay_info = PayInfo.objects.filter(order_id=order_id).first()
    if not pay_info or pay_info.status == PayInfo.SUCCESS:
        return {"ret_code": 20121, "message": "订单不存在或已支付成功"}

    card_no = pay_info.card_no

    if len(card_no) == 10:
        card = Card.objects.filter(user=user,
                                   no__startswith=card_no[:6],
                                   no__endswith=card_no[-4:]).first()
    else:
        card = Card.objects.filter(no=card_no, user=user).first()

    if not card:
        # res = {"ret_code": 20002, "message": "银行卡未绑定"}
        channel = pay_info.channel
    else:
        channel = card.bank.channel

    if channel == 'huifu':
        res = {'ret_code': 20003, 'message': '汇付天下请选择快捷支付渠道'}

    elif channel == 'yeepay':
        res = YeeShortPay().dynnum_bind_pay(request)

    elif channel == 'kuaipay':
        res = KuaiShortPay().dynnum_bind_pay(user,
                                             vcode,
                                             order_id,
                                             token,
                                             input_phone,
                                             device,
                                             ip,
                                             request,
                                             mode=mode)
    elif channel == 'baopay':
        res = BaoPayInterface(user, ip,
                              device).dynnum_bind_pay(order_id, vcode, mode,
                                                      request)
    else:
        res = {"ret_code": 20004, "message": "请对银行绑定支付渠道"}

    if not card:
        # 宝付这个时候卡才生产,在调用dynnum_bind_pay之前是没卡的
        card = Card.objects.get(no=pay_info.card_no)
    if res.get('ret_code') == 0:
        if set_the_one_card:
            TheOneCard(request.user).set(card.id)
    # # Modify by hb on 2015-12-24 : 如果ret_code返回非0, 还需进一步判断card是否有绑定记录, 因为有可能出现充值失败但绑卡成功的情况
    # try:
    #     bind_flag = 0
    #     if (card.bank.channel == 'kuaipay' and res.get('ret_code') == 0) or (
    #                     card.bank.channel == 'yeepay' and res.get('ret_code') == 22000):
    #         bind_flag = 1;
    #     else:
    #         card = Card.objects.filter(user=user, id=card.id).first()
    #         if card and (card.is_bind_huifu or card.is_bind_kuai or card.is_bind_yee):
    #             logger.error('=20151224= deposit failed but binding success: [%s] [%s]' % (card.user, card.no))
    #             bind_flag = 1;
    #     if bind_flag == 1:
    #         CoopRegister(request).process_for_binding_card(user)
    # except Exception, ex:
    #     logger.exception('=20151224= bind_card_callback_failed: [%s] [%s] [%s]' % (user, card_no, ex))
    process_for_bind_card(user, card, res, request)

    return res
Exemple #15
0
    def pre_pay(self, request):
        """ 获取验证码支付还是直接支付
            长卡号获取验证码
            短卡号直接支付
        """
        if not request.user.wanglibaouserprofile.id_is_valid:
            return {"ret_code": 20111, "message": "请先进行实名认证"}

        amount = request.DATA.get("amount", "").strip()
        card_no = request.DATA.get("card_no", "").strip()
        input_phone = request.DATA.get("phone", "").strip()
        gate_id = request.DATA.get("gate_id", "").strip()
        device_type = split_ua(request)['device_type']

        if not amount or not card_no:
            return {"ret_code": 20112, 'message': '信息输入不完整'}
        if len(card_no) > 10 and (not input_phone or not gate_id):
            return {"ret_code": 20113, 'message': '卡号格式不正确'}

        try:
            float(amount)
        except:
            return {"ret_code": 20114, 'message': '金额格式错误'}

        amount = util.fmt_two_amount(amount)
        # if amount < 10 or len(str(amount)) > 20:
        #     return {"ret_code": 20115, 'message': '充值须大于等于10元'}

        if len(str(amount)) > 20:
            return {"ret_code": 20115, 'message': '充值金额太大'}

        if amount < 0.009:
            # 涉及到小数精度,不能用0.01
            return {"ret_code": 20115, 'message': '充值金额太小(至少0.01元)'}

        user = request.user
        profile = user.wanglibaouserprofile
        card, bank = None, None
        if gate_id:
            bank = Bank.objects.filter(gate_id=gate_id).first()
            if not bank or not bank.yee_bind_code.strip():
                return {"ret_code": 201116, "message": "不支持该银行"}

        if len(card_no) == 10:
            card = Card.objects.filter(user=user, no__startswith=card_no[:6], no__endswith=card_no[-4:],
                                       is_bind_yee=True).first()
        else:
            #card = Card.objects.filter(no=card_no, user=user).first()
            card = Card.objects.filter(no=card_no, user=user, bank=bank).first()
            pay_record = PayInfo.objects.filter(card_no=card_no, user=user, bank=bank)
            if pay_record.filter(error_message__icontains='不匹配'):
                return {"ret_code":200118, "message":"银行卡与银行不匹配"}

        if not card:
            card = self.add_card_unbind(user, card_no, bank, request)

        if not card and not bank:
            return {'ret_code': 200117, 'message': '卡号不存在或银行不存在'}

        #if bank and card and bank != card.bank:
            #return {"ret_code": 200118, "message": "银行卡与银行不匹配"}

        # 商户生成的唯一绑卡请求号,最长50位
        request_id = '{phone}{time}'.format(phone=profile.phone, time=timezone.now().strftime("%Y%m%d%H%M%S"))
        if len(card_no) != 10:
            # 未绑定银行卡,需要先绑定银行卡获取验证码,然后在确认支付
            try:
                # 请求绑定银行卡
                res = self._bind_card_request(request, input_phone, card_no, request_id)
                if res['ret_code'] != 0:
                    # 600326已绑定,600302绑卡数超限
                    if res['ret_code'] in ['600326', '600302']:
                        self.sync_bind_card(user)
                        return {'ret_code': '20119', 'message': '银行卡已绑定,请返回使用快捷充值'}
                    else:
                        # logger.error(res)
                        return res
            except Exception, e:
                logger.error(e.message)
                return {"ret_code": "20120", "message": '绑定银行卡失败'}
Exemple #16
0
    def post(self, request):
        user = request.user
        days = request.POST.get('days', '').strip()
        # days = request.GET.get('days', '').strip()
        if not days or not days.isdigit():
            return Response({'ret_code': -1, 'message': u'参数错误'})
        days = int(days)

        today = datetime.date.today()
        # yesterday = (datetime.datetime.now() - datetime.timedelta(days=1)).date()
        sign_record = UserDailyActionRecord.objects.filter(
            user=user, create_date=today, action_type=u'sign_in').first()
        if not sign_record or not sign_record.status:
            return Response({'ret_code': -1, 'message': u'不符合领取条件'})
        activities = SeriesActionActivity.objects.filter(
            action_type=u'sign_in',
            is_stopped=False,
            start_at__lte=timezone.now(),
            end_at__gte=timezone.now()).all()
        current_activity = None

        for activity in activities:
            if activity.days == days:
                current_activity = activity
        if not current_activity:
            return Response({'ret_code': -1, 'message': u'不符合领取条件'})

        length = len(activities)
        maxDayNote = activities[length - 1].days
        if sign_record.continue_days < maxDayNote:
            recycle_continue_days = sign_record.continue_days
        elif sign_record.continue_days % maxDayNote == 0:
            recycle_continue_days = maxDayNote
        else:
            recycle_continue_days = sign_record.continue_days % maxDayNote
        # recycle_continue_days = sign_record.continue_days % (maxDayNote + 1)
        if recycle_continue_days != days:
            return Response({'ret_code': -1, 'message': u'不符合领取条件'})

        reward_record, create = ActivityRewardRecord.objects.get_or_create(
            activity_code=current_activity.code, create_date=today, user=user)
        if reward_record.status:
            return Response({'ret_code': -1, 'message': u'奖励已经领取过了'})
        device = split_ua(self.request)
        user_agent = request.META['HTTP_USER_AGENT']
        is_weixin = False
        if "MicroMessenger" in user_agent:
            is_weixin = True
        device_type = device['device_type']
        events = []
        records = []
        experience_events = []
        rewards = []
        redpack_txts = []
        redpack_record_ids = ""
        experience_record_ids = ""
        with transaction.atomic():
            reward_record = ActivityRewardRecord.objects.select_for_update(
            ).filter(activity_code=current_activity.code,
                     create_date=today,
                     user=user).first()
            if reward_record.status:
                return Response({'ret_code': -1, 'message': u'奖励已经领取过了'})
            rules = SeriesActionActivityRule.objects.filter(
                activity=current_activity, is_used=True)
            for rule in rules:
                sub_redpack_record_ids, sub_experience_record_ids = self.giveReward(
                    user, rule, events, experience_events, records,
                    redpack_txts, device_type)
                if isinstance(sub_redpack_record_ids, Response):
                    return sub_redpack_record_ids
                if isinstance(sub_experience_record_ids, Response):
                    return sub_experience_record_ids

                redpack_record_ids += sub_redpack_record_ids
                experience_record_ids += sub_experience_record_ids
                if rule.gift_type == "reward":
                    reward = None
                    reward_list = rule.reward.split(",")
                    for reward_type in reward_list:
                        now = timezone.now()
                        reward = Reward.objects.filter(
                            type=reward_type, is_used=False,
                            end_time__gte=now).first()
                        if reward:
                            break
                    if reward:
                        reward.is_used = True
                        reward.save()
                        # 记录奖品发放流水
                        description = '=>'.join([rule.rule_name, reward.type])
                        has_reward_record = _keep_reward_record(
                            user, reward, description)
                        reward_content = reward.content
                        end_date = timezone.localtime(
                            reward.end_time).strftime("%Y年%m月%d日")
                        name = reward.type
                        context = Context({
                            # 'mobile': safe_phone_str(user.wanglibaouserprofile.phone),
                            'reward': reward_content,
                            'end_date': end_date,
                            'name': name,
                        })
                        if has_reward_record:
                            rewards.append(reward)
                            redpack_txts.append(name)
                            if rule.msg_template:
                                msg = Template(rule.msg_template)
                                content = msg.render(context)
                                _send_message_template(user, rule.rule_name,
                                                       content)
                    else:
                        sub_redpack_record_ids, sub_experience_record_ids = self.giveReward(
                            user,
                            rule,
                            events,
                            experience_events,
                            records,
                            redpack_txts,
                            device_type,
                            is_addition=True)
                        if isinstance(sub_redpack_record_ids, Response):
                            return sub_redpack_record_ids
                        if isinstance(sub_experience_record_ids, Response):
                            return sub_experience_record_ids
                        redpack_record_ids += sub_redpack_record_ids
                        experience_record_ids += sub_experience_record_ids

            reward_record.redpack_record_ids = redpack_record_ids
            reward_record.experience_record_ids = experience_record_ids
            reward_record.activity_code_time = timezone.now()
            reward_record.status = True
            reward_record.activity_desc = u'用户领取连续%s天签到奖励' % days
            reward_record.save()
        try:
            w_user = WeixinUser.objects.filter(user=user).first()
            for idx, event in enumerate(events):
                record = records[idx]
                start_time, end_time = get_start_end_time(
                    event.auto_extension, event.auto_extension_days,
                    record.created_at, event.available_at,
                    event.unavailable_at)
                _send_message_for_hby(request.user, event, end_time)
                if is_weixin and w_user:
                    sentCustomerMsg.apply_async(
                        kwargs={
                            "txt":
                            "恭喜您获得连续%s天签到奖励\n签到奖励:%s\n有效期至:%s\n快去我的账户-理财券页面查看吧!"
                            % (days, getattr(event, "desc_text", "优惠券"),
                               end_time.strftime('%Y年%m月%d日')),  #\n兑换码:%s
                            "openid":
                            w_user.openid,
                        },
                        queue='celery02')
            if is_weixin and w_user:
                for reward in rewards:
                    sentCustomerMsg.apply_async(
                        kwargs={
                            "txt":
                            "恭喜您获得连续%s天签到奖励\n签到奖励:%s\n有效期至:%s\n兑换码:%s\n天天签到不要停,快去兑换吧!"
                            % (days, reward.type,
                               timezone.localtime(
                                   reward.end_time).strftime("%Y年%m月%d日"),
                               reward.content),  #\n兑换码:%s
                            "openid":
                            w_user.openid,
                        },
                        queue='celery02')
            if is_weixin and w_user:
                for experience_event in experience_events:
                    sentCustomerMsg.apply_async(kwargs={
                        "txt":
                        "恭喜您获得连续%s天签到奖励\n签到奖励:%s\n快去我的账户-体验金页面查看吧!" %
                        (days, getattr(experience_event, "desc_text", "体验金")),
                        "openid":
                        w_user.openid,
                    },
                                                queue='celery02')

        except Exception, e:
            logger.debug(traceback.format_exc())
Exemple #17
0
def bind_pay_deposit(request):
    """ 根据银行设置的支付渠道进行支付渠道的支付
        1、获取验证码
        2、快捷支付功能
    """
    logger.error(request.DATA)

    card_no = request.DATA.get("card_no", "").strip()
    gate_id = request.DATA.get("gate_id", "").strip()
    input_phone = request.DATA.get("phone", "").strip()

    device_type = split_ua(request)['device_type']
    ip = util.get_client_ip(request)

    mode = request.DATA.get('mode', '').strip()

    user = request.user
    if user.wanglibaouserprofile.utype == '3':
        return {"ret_code": 30059, "message": u"企业用户无法请求该接口"}

    if not user.wanglibaouserprofile.id_is_valid:
        return {"ret_code": 20111, "message": "请先进行实名认证"}

    if not card_no and not gate_id:
        return {"ret_code": 20001, 'message': '信息输入不完整'}

    if len(card_no) > 10 and (not input_phone or not gate_id):
        return {"ret_code": 20112, 'message': '信息输入不完整'}
    user_bind_cards = Card.objects.filter(
        user=user).filter(Q(is_bind_kuai=True) | Q(is_bind_yee=True))
    if len(card_no) > 10 and user_bind_cards.filter(no=card_no).count() == 0 and \
            user_bind_cards.filter(~Q(no=card_no)).count() > 0:
        # 只允许绑一张
        return {"ret_code": 20113, 'message': '为确保账户安全,资金同卡进出,不能再绑卡'}

    if gate_id:
        bank = Bank.objects.filter(gate_id=gate_id).first()

    else:
        if len(card_no) == 10:
            card = Card.objects.filter(user=user,
                                       no__startswith=card_no[:6],
                                       no__endswith=card_no[-4:]).first()
        else:
            card = Card.objects.filter(no=card_no, user=user).first()
        if not card:
            return {"ret_code": 20001, 'message': '信息输入不完整'}

        bank = card.bank

    if not bank:
        return {"ret_code": 20002, "message": "银行ID不正确"}

    #验证银行卡和银行匹配
    if len(card_no) != 10 and bank.cards_info:
        cardinfo = check_bank_carkinfo(card_no, bank)
        #返回ret_code为20075的话表示银行卡和银行不匹配
        if cardinfo['ret_code'] == 20075:
            return cardinfo

    amount = request.DATA.get('amount', '').strip()
    try:
        amount = float(amount)
        amount = util.fmt_two_amount(amount)
        if amount < 0:
            raise ValueError()
    except:
        return {"ret_code": 20114, 'message': '金额格式错误'}

    if bank.channel == 'huifu':
        result = HuifuShortPay().pre_pay(request)

        return result

    elif bank.channel == 'yeepay':
        result = YeeShortPay().pre_pay(request)

        return result
    elif bank.channel == 'baopay':
        res = BaoPayInterface(user, ip,
                              device_type).pre_pay(card_no, amount,
                                                   input_phone, gate_id,
                                                   request)
        return res
    elif bank.channel == 'kuaipay':
        stop_no_sms_channel = Misc.objects.filter(
            key='kuai_qpay_stop_no_sms_channel').first()
        if stop_no_sms_channel and stop_no_sms_channel.value == '1' and \
                len(card_no) == 10 and not request.DATA.get('mode'):
            # mode != vcode_for_qpay
            # Modify by hb on 2016-04-28
            #return {'ret_code': 201183,
            return {'ret_code': 201181, 'message': u'该银行支付升级,请更新App版本'}
        result = KuaiShortPay().pre_pay(user,
                                        amount,
                                        card_no,
                                        input_phone,
                                        gate_id,
                                        device_type,
                                        ip,
                                        request,
                                        mode=mode)

        return result

    else:
        return {"ret_code": 20004, "message": "请选择支付渠道"}
Exemple #18
0
            if params['status'] == 1:
                pay_info.fee = self.FEE
                keeper = MarginKeeper(pay_info.user, pay_info.order.pk)
                margin_record = keeper.deposit(amount)
                pay_info.margin_record = margin_record
                pay_info.status = PayInfo.SUCCESS
                logger.error("orderId:%s yeepay response status:%s" % (orderId, params['status']))
                rs = {"ret_code":0, "message":"success", "amount":amount, "uid":pay_info.user.id}
            else:
                pay_info.status = PayInfo.FAIL
                logger.error("orderId:%s yeepay response status: %s" % (orderId, params['status']))
                rs = {"ret_code":20087, "message":PayResult.DEPOSIT_FAIL}

        pay_info.save()
        if rs['ret_code'] == 0:
            device = split_ua(request)
            try:
                # fix@chenweibi, add order_id
                tools.deposit_ok.apply_async(kwargs={"user_id": pay_info.user.id, "amount": pay_info.amount,
                                                     "device": device, "order_id": orderId})
            except:
                pass
        OrderHelper.update_order(pay_info.order, pay_info.user, pay_info=model_to_dict(pay_info), status=pay_info.status)
        return rs

    def pre_pay(self, request):
        self.app_pay(request)


class YeeShortPay:
    """ 易宝快捷支付 """
Exemple #19
0
    def post(self, request):
        user = request.user
        now = timezone.now()
        start_dt = local_to_utc(datetime(2016, 6, 7), 'min')
        user_joined = user.date_joined  # 用户注册时间
        device = split_ua(request)
        device_type = decide_device(device['device_type'])
        purchase_code = 'experience_purchase'

        experience_product = ExperienceProduct.objects.filter(
            isvalid=True).first()
        if not experience_product:
            return Response({'ret_code': 30001, 'message': u'体验标有误,请重试'})

        total_amount = 0
        total_amount_tmp = 0

        # 查询用户符合条件的理财金记录
        with transaction.atomic(savepoint=True):
            # 锁表,主要用来锁定体验金投资时的动作
            purchase_lock_record = ExperiencePurchaseLockRecord.objects.select_for_update().\
                filter(user=user, purchase_code=purchase_code).first()

            if not purchase_lock_record:
                # 没有记录时创建一条
                try:
                    purchase_lock_record = ExperiencePurchaseLockRecord.objects.create(
                        user=user,
                        purchase_code=purchase_code,
                        purchase_times=0)
                except Exception:
                    logger.exception(
                        "Error: experience purchase err, user: %s, phone: %s" %
                        (user.id, user.wanglibaouserprofile.phone))
                    return Response({
                        'ret_code': 30003,
                        'message': u'体验金投资失败,请重试'
                    })

            experience_record = ExperienceEventRecord.objects.filter(user=user, apply=False) \
                .filter(event__invalid=False, event__available_at__lt=now, event__unavailable_at__gt=now)\
                .select_related('event')

            records_ids = ''
            if experience_record:
                catalog = u'购买体验标'

                for i in experience_record:
                    total_amount_tmp += i.event.amount

                buy_p2p = P2PRecord.objects.filter(user_id=user.id).exists()
                buy_count = MarginRecord.objects.filter(
                    user_id=user.id, catalog=catalog).count()
                if not buy_p2p:
                    if user_joined > start_dt:
                        # 如果查询到已经购买过至少 1 次体验标,则不再检测账户余额
                        if buy_count == 0:
                            if total_amount_tmp >= 28888 and user.margin.margin < 1:
                                return Response({
                                    'ret_code': 30009,
                                    'message': u'账户余额不足,请先充值'
                                })

                for record in experience_record:
                    event = record.event
                    total_amount += event.amount
                    records_ids += str(record.id) + ','

                    record.apply = True
                    record.apply_amount = event.amount
                    record.apply_at = timezone.now()
                    record.apply_platform = device_type
                    record.save()

                terms = get_amortization_plan(u'日计息一次性还本付息').generate(
                    total_amount,
                    experience_product.expected_earning_rate / 100.0,
                    timezone.now(), experience_product.period)

                for index, term in enumerate(terms['terms']):
                    amortization = ExperienceAmortization()
                    amortization.product = experience_product
                    amortization.user = user
                    amortization.principal = term[1]  # 本金
                    amortization.interest = term[2]  # 利息
                    amortization.term = index + 1  # 期数
                    amortization.description = u'第%d期' % (index + 1)
                    amortization.term_date = term[6] - timedelta(days=1)

                    amortization.save()

                # 从账户中扣除 1 元 (没有购买过体验标的情况)
                if not buy_p2p:
                    if user_joined > start_dt:
                        if total_amount >= 28888 and buy_count == 0:
                            amount = 1.00
                            order_id = OrderHelper.place_order(
                                user, order_type=catalog, status=u'新建').id
                            margin_keeper = MarginKeeper(user=user,
                                                         order_id=order_id)
                            margin_keeper.reduce_margin_common(
                                amount, catalog=catalog, description=catalog)

                # 更新当前的一组流水id
                purchase_lock_record.purchase_times += 1
                purchase_lock_record.description = records_ids
                purchase_lock_record.save()

                term_date = amortization.term_date
                interest = amortization.interest

                return Response({
                    'ret_code': 0,
                    'data': {
                        'amount': total_amount,
                        'term_date': term_date.strftime("%Y-%m-%d"),
                        'interest': interest
                    }
                })

            else:
                return Response({
                    'ret_code': 30002,
                    'message': u'没有体验金记录,无法购买体验标'
                })
Exemple #20
0
    def post(self, request, *args, **kwargs):
        #result, message = verify_captcha(request.POST)
        #if not result:
        #    return self.render_to_response({
        #        'result': message
        #    })

        user = request.user
        if not user.wanglibaouserprofile.id_is_valid:
            return self.render_to_response({'result': u'请先进行实名认证'})
        if user.wanglibaouserprofile.frozen:
            return self.render_to_response(
                {'result': u'账户已冻结!请联系网利宝客服:4008-588-066'})
        phone = user.wanglibaouserprofile.phone
        code = request.POST.get('validate_code', '')
        status, message = validate_validation_code(phone, code)
        if status != 200:
            return self.render_to_response({
                # Modify by hb on 2015-12-02
                #'result': u'短信验证码输入错误'
                'result': message
            })

        result = PayResult.WITHDRAW_SUCCESS

        try:
            card_id = request.POST.get('card_id', '')
            card = Card.objects.get(pk=card_id, user=user)
            card_no = card.no

            # 检测银行卡是否在黑名单中
            black_list = BlackListCard.objects.filter(card_no=card_no).first()
            if black_list and black_list.user != user:
                raise AbnormalCardException

            # 检查白名单
            white_list = WhiteListCard.objects.filter(user=user,
                                                      card_no=card_no).first()
            if not white_list:
                # 增加银行卡号检测功能,检测多张卡
                card_count = Card.objects.filter(no=card_no).count()
                if card_count > 1:
                    raise ManyCardException

                # 检测银行卡在以前的提现记录中是否为同一个用户
                payinfo_record = PayInfo.objects.filter(
                    card_no=card_no).order_by('-create_time').first()
                if payinfo_record:
                    if payinfo_record.user != user:
                        raise AbnormalCardException

            amount_str = request.POST.get('amount', '')
            amount = decimal.Decimal(amount_str). \
                quantize(TWO_PLACES, context=decimal.Context(traps=[decimal.Inexact]))
            margin = user.margin.margin  # 账户余额
            uninvested = user.margin.uninvested  # 充值未投资金额

            # 获取费率配置
            fee_misc = WithdrawFee()
            fee_config = fee_misc.get_withdraw_fee_config()

            # 计算提现费用 手续费 + 资金管理费
            # 提现最大最小金额判断
            if amount > fee_config.get('max_amount') or amount <= 0:
                raise decimal.DecimalException
            if amount < fee_config.get('min_amount'):
                if amount != margin:
                    raise decimal.DecimalException
            # 获取计算后的费率
            fee, management_fee, management_amount = fee_misc.get_withdraw_fee(
                user, amount, margin, uninvested)

            actual_amount = amount - fee - management_fee  # 实际到账金额
            if actual_amount <= 0:
                raise decimal.DecimalException

            # 检测个别银行的单笔提现限额,如民生银行
            bank_limit = util.handle_withdraw_limit(card.bank.withdraw_limit)
            bank_max_amount = bank_limit.get('bank_max_amount', 0)
            if bank_max_amount:
                if amount > bank_max_amount:
                    raise decimal.DecimalException

            pay_info = PayInfo()
            pay_info.amount = actual_amount
            pay_info.fee = fee
            pay_info.management_fee = management_fee
            pay_info.management_amount = management_amount
            pay_info.total_amount = amount
            pay_info.type = PayInfo.WITHDRAW
            pay_info.user = user
            pay_info.card_no = card.no
            pay_info.account_name = user.wanglibaouserprofile.name
            pay_info.bank = card.bank
            pay_info.request_ip = get_client_ip(request)
            pay_info.status = PayInfo.ACCEPTED

            order = OrderHelper.place_order(user,
                                            Order.WITHDRAW_ORDER,
                                            pay_info.status,
                                            pay_info=model_to_dict(pay_info))

            pay_info.order = order
            keeper = MarginKeeper(user, pay_info.order.pk)
            margin_record = keeper.withdraw_pre_freeze(
                amount, uninvested=management_amount)
            pay_info.margin_record = margin_record

            pay_info.save()
            try:
                device = split_ua(request)
            except:
                device = {'device_type': 'pc'}

            name = user.wanglibaouserprofile.name or u'用户'
            withdraw_submit_ok.apply_async(
                kwargs={
                    "user_id": user.id,
                    "user_name": name,
                    "phone": user.wanglibaouserprofile.phone,
                    "amount": amount,
                    "bank_name": card.bank.name,
                    "order_id": order.id,
                    "device": device
                })
        except decimal.DecimalException:
            result = u'提款金额在0~{}之间'.format(fee_config.get('max_amount'))
        except Card.DoesNotExist:
            result = u'请选择有效的银行卡'
        except ManyCardException:
            result = u'银行卡号存在重复,请尝试其他银行卡号码,如非本人操作请联系客服'
        except AbnormalCardException:
            result = u'银行卡号与身份信息存在异常, 如非本人操作请联系客服'
        except MarginLack as e:
            result = u'余额不足'
            pay_info.error_message = str(e)
            pay_info.status = PayInfo.FAIL
            pay_info.save()

        # return self.render_to_response({
        #     'result': result
        # })
        return HttpResponseRedirect(
            reverse('withdraw-complete-result', kwargs={'result': result}))
Exemple #21
0
    def handle_pay_result(cls, request):
        # TODO Add a log

        flag = False

        order_id = request.POST.get('OrdId', '')
        try:
            pay_info = PayInfo.objects.select_for_update().get(pk=order_id)
        except PayInfo.DoesNotExist:
            logger.warning('Order not found, order id: ' + order_id + ', response: ' + request.body)
            return PayResult.EXCEPTION

        if pay_info.status == PayInfo.SUCCESS:
            return PayResult.DEPOSIT_SUCCESS

        amount = request.POST.get('OrdAmt', '')
        code = request.POST.get('RespCode', '')
        message = request.POST.get('ErrMsg', '')
        pay_info.error_code = code
        pay_info.error_message = message
        pay_info.response = request.body
        pay_info.response_ip = get_client_ip(request)

        result = u''
        try:
            pay = HuifuPay()
            if pay.verify_sign(request.POST.dict(), HuifuPay.PAY_FIELDS):
                if pay_info.amount != decimal.Decimal(amount):
                    pay_info.status = PayInfo.FAIL
                    pay_info.error_message += u' 金额不匹配'
                    logger.error('Amount mismatch, order id: %s request amount: %f response amount: %s',
                                 order_id, float(pay_info.amount), amount)
                    result = PayResult.EXCEPTION
                else:
                    if code == '000000':
                        keeper = MarginKeeper(pay_info.user, pay_info.order.pk)
                        margin_record = keeper.deposit(amount)
                        pay_info.margin_record = margin_record
                        pay_info.status = PayInfo.SUCCESS
                        result = PayResult.DEPOSIT_SUCCESS
                        phone = pay_info.user.wanglibaouserprofile.phone

                        flag = True
                    else:
                        pay_info.status = PayInfo.FAIL
                        result = PayResult.DEPOSIT_FAIL
            else:
                pay_info.error_message = 'Invalid signature. Order id: ' + order_id
                logger.error(pay_info.error_message)
                pay_info.status = PayInfo.EXCEPTION
                result = PayResult.EXCEPTION
        except (socket.error, SignException) as e:
            pay_info.error_message = str(e)
            pay_info.status = PayInfo.EXCEPTION
            logger.fatal('sign error! order id: ' + order_id + ' ' + str(e))
            result = PayResult.EXCEPTION

        pay_info.save()

        if flag:
            device = split_ua(request)
            try:
                # fix@chenweibi, add order_id
                tools.deposit_ok.apply_async(kwargs={"user_id": pay_info.user.id, "amount": pay_info.amount,
                                                     "device": device, "order_id": pay_info.order_id})
                CoopRegister(request).process_for_recharge(pay_info.user, pay_info.order_id)
            except:
                pass

        OrderHelper.update_order(pay_info.order, pay_info.user, pay_info=model_to_dict(pay_info), status=pay_info.status)
        return result
Exemple #22
0
    def post(self, request):
        size = request.DATA.get('size', '').strip()

        device = split_ua(request)
        device_type = device['device_type']

        if not device_type or not size:
            return Response({'ret_code': 20001, 'message': u'信息输入不完整'})

        if device_type not in ('ios', 'android') or int(size) not in (
                x for x in range(1, 9)):
            return Response({'ret_code': 20002, 'message': u'参数不合法'})

        if int(size) in (x for x in range(5, 9)):
            size = str(int(size) - 4)
            if device_type == 'ios': device_type = 'act_iso'
            if device_type == 'android': device_type = 'act_android'

        size = self.SIZE_MAP[size]
        activate_query = AppActivate.objects.filter(
            Q(is_used=True), Q(device=self.DEVICE_MAP[device_type]))
        activate = activate_query.filter(
            Q(is_long_used=False) & Q(start_at__lte=timezone.now())
            & Q(end_at__gte=timezone.now())).order_by('-priority').first()
        if not activate:
            activate = activate_query.filter(
                Q(is_long_used=True)).order_by('-priority').first()

        # activate = AppActivate.objects.filter(Q(is_used=True), Q(device=self.DEVICE_MAP[device_type]), Q(is_long_used=True) | (Q(is_long_used=False) & Q(start_at__lte=timezone.now()) & Q(end_at__gte=timezone.now()))).first()
        if activate:
            if size == 'img_one':
                img_url = activate.img_one
            elif size == 'img_two':
                img_url = activate.img_two
            elif size == 'img_three':
                img_url = activate.img_three
            elif size == 'img_four':
                img_url = activate.img_four
            else:
                img_url = ''
            jump_state = activate.jump_state
            link_dest = activate.link_dest
            if img_url:
                if self.DEVICE_MAP[device_type] in ("act_iso", 'act_android'):
                    if request.user.is_authenticated():
                        invest_flag = P2PRecord.objects.filter(
                            user=request.user, catalog='申购').exists()
                        if activate.user_invest_limit == '-1' or (
                                activate.user_invest_limit == '0' and
                                not invest_flag) or (activate.user_invest_limit
                                                     == '1' and invest_flag):
                            img_url = '{host}/media/{url}'.format(
                                host=settings.CALLBACK_HOST, url=img_url)
                            return Response({
                                'ret_code':
                                0,
                                'message':
                                'ok',
                                'image':
                                img_url,
                                'jump_state':
                                jump_state,
                                'link_dest':
                                link_dest,
                                'link_dest_url':
                                activate.link_dest_h5_url,
                            })
                else:
                    img_url = '{host}/media/{url}'.format(
                        host=settings.CALLBACK_HOST, url=img_url)
                    return Response({
                        'ret_code': 0,
                        'message': 'ok',
                        'image': img_url,
                        'jump_state': jump_state,
                        'link_dest': link_dest,
                        'link_dest_url': activate.link_dest_h5_url,
                    })

        return Response({'ret_code': 20003, 'message': 'fail'})
Exemple #23
0
    def pre_pay(self, request, bank=None):
        """ 汇付天下直接进行邦卡支付,不能够获取验证码 """
        if not request.user.wanglibaouserprofile.id_is_valid:
            return {"ret_code": 20111, "message": "请先进行实名认证"}

        amount = request.DATA.get("amount", "").strip()
        card_no = request.DATA.get("card_no", "").strip()
        input_phone = request.DATA.get("phone", "").strip()
        gate_id = request.DATA.get("gate_id", "").strip()

        if not amount or not card_no or not gate_id:
            return {"ret_code": 20112, 'message': '信息输入不完整'}
        if len(card_no) > 10 and not input_phone:
            return {"ret_code": 20112, 'message': '信息输入不完整'}
        if card_no and len(card_no) == 10:
            return {'ret_code': 20013, 'message': '卡号格式不正确'}

        try:
            float(amount)
        except:
            return {"ret_code": 20114, 'message': '金额格式错误'}

        amount = fmt_two_amount(amount)

        user = request.user
        profile = user.wanglibaouserprofile

        bank = Bank.objects.filter(gate_id=gate_id).first()
        if not bank or not bank.huifu_bind_code.strip():
            return {"ret_code": 201151, "message": "不支持该银行"}

        if len(card_no) == 10:
            card = Card.objects.filter(user=user, no__startswith=card_no[:6], no__endswith=card_no[-4:]).first()
            card_no = card.no
        else:
            card = Card.objects.filter(no=card_no, user=user).first()

        if not card:
            card = self.bind_card_wlbk(user, card_no, bank, request)

        if not card:
            return {"ret_code": -1, "message": '银行卡不存在'}

        if bank and card and bank != card.bank:
            return {"ret_code": 201153, "message": "银行卡与银行不匹配"}
        if card and not card.is_bind_huifu:
            res = self.open_bind_card(user, bank, card)
            if res['ret_code'] != 0:
                return res

            card.is_bind_huifu = True
            card.save()

        try:
            pay_info = PayInfo()
            pay_info.amount = amount
            pay_info.total_amount = amount
            pay_info.type = PayInfo.DEPOSIT
            pay_info.status = PayInfo.INITIAL
            pay_info.user = user
            pay_info.channel = "huifu_bind"

            pay_info.request_ip = get_client_ip(request)
            order = OrderHelper.place_order(user, Order.PAY_ORDER, pay_info.status, pay_info=model_to_dict(pay_info))
            pay_info.order = order

            if card:
                pay_info.bank = card.bank
                pay_info.card_no = card.no
            else:
                pay_info.bank = bank
                pay_info.card_no = card_no

            pay_info.status = PayInfo.PROCESSING
            pay_info.account_name = profile.name
            pay_info.save()
            OrderHelper.update_order(order, user, pay_info=model_to_dict(pay_info), status=pay_info.status)

            # 充值
            req, res = self._card_pay_huifu(user=user, amount=pay_info.amount, card_no=card_no)

            pay_info.error_code = res['RespCode']
            pay_info.error_message = res['ErrMsg']
            pay_info.request = req
            pay_info.response = res
            pay_info.response_ip = get_client_ip(request)

            if res['RespCode'] != u'000000':
                pay_info.save()
                return {"ret_code": -3, "message": res['ErrMsg']}
            else:
                pay_info.fee = self.FEE
                keeper = MarginKeeper(pay_info.user, pay_info.order.pk)
                margin_record = keeper.deposit(amount)
                pay_info.margin_record = margin_record
                pay_info.status = PayInfo.SUCCESS
                pay_info.save()
                rs = {"ret_code": 0, "message": "success", "amount": amount, "margin": margin_record.margin_current}

            if rs['ret_code'] == 0:
                device = split_ua(request)
                try:
                    # fix@chenweibi, add order_id
                    tools.deposit_ok.apply_async(kwargs={"user_id": pay_info.user.id, "amount": pay_info.amount,
                                                         "device": device, "order_id": order.id})
                except:
                    pass

                # 充值成功后,更新本次银行使用的时间
                Card.objects.filter(user=pay_info.user, no=pay_info.card_no).update(last_update=timezone.now())

            OrderHelper.update_order(pay_info.order, pay_info.user, pay_info=model_to_dict(pay_info), status=pay_info.status)
            return rs
        except Exception, e:
            message = PayResult.RETRY
            pay_info.status = PayInfo.FAIL
            pay_info.error_message = str(e)
            pay_info.save()
            OrderHelper.update_order(order, request.user, pay_info=model_to_dict(pay_info), status=pay_info.status)
            return {"ret_code": "20119", "message": message}
Exemple #24
0
    def post(self, request):
        amount = request.DATA.get("amount", "")
        bank_id = request.DATA.get("bank_id", "")
        card_id = request.DATA.get("card_id", "")
        device = rest_utils.split_ua(request)
        device_type = rest_utils.decide_device(device['device_type'])
        try:
            app_version = device['app_version']
        except KeyError:
            app_version = ''

        if not amount:
            return Response({"ret_code": 30131, "message": u"请输入金额"})

        if device_type == 'pc':
            if not card_id:
                return Response({"ret_code": 30141, "message": u"银行卡选择错误"})
        else:
            if not bank_id:
                if device_type == 'ios' or device_type == 'android':
                    if app_version and app_version < "2.6.3":
                        pass
                    else:
                        return Response({
                            "ret_code": 30137,
                            "message": u"银行卡选择错误"
                        })

        try:
            float(amount)
        except:
            return Response({"ret_code": 30132, 'message': u'金额格式错误'})
        if amount <= 0:
            return Response({"ret_code": 30131, "message": u"请输入金额"})

        amount = util.fmt_two_amount(amount)
        # 计算提现费用 手续费 + 资金管理费
        user = request.user
        margin = user.margin.margin  # 账户余额
        uninvested = user.margin.uninvested  # 充值未投资金额

        if amount > margin:
            return Response({"ret_code": 30139, "message": u"提现金额超出账户可用余额"})

        # 获取费率配置
        fee_misc = WithdrawFee()
        fee_config = fee_misc.get_withdraw_fee_config()

        # 检测提现最大最小金额
        max_amount = fee_config.get('max_amount')
        min_amount = fee_config.get('min_amount')
        if amount > max_amount:
            return Response({"ret_code": 30133, 'message': u'提现金额超出最大提现限额'})
        if amount < min_amount:
            if margin > min_amount:
                return Response({
                    "ret_code": 30134,
                    'message': u'提现金额必须大于{}元'.format(min_amount)
                })
            else:
                if amount != margin:
                    return Response({
                        "ret_code":
                        30138,
                        'message':
                        u'账户余额小于{}元时须一次性提完'.format(min_amount)
                    })

        # 检测银行的单笔最大提现限额,如民生银行
        withdraw_limit = ''
        if bank_id and card_id:
            bank = Bank.objects.filter(code=bank_id.upper()).first()
            try:
                card = Card.objects.get(pk=card_id)
            except Card.DoesNotExist:
                card = None
            if bank.id != card.bank.id:
                return Response({"ret_code": 30140, 'message': u'银行选择错误'})
            else:
                if card:
                    withdraw_limit = card.bank.withdraw_limit
                elif bank and bank.withdraw_limit:
                    withdraw_limit = bank.withdraw_limit
        elif card_id and not bank_id:
            try:
                card = Card.objects.get(pk=card_id)
                withdraw_limit = card.bank.withdraw_limit
            except Card.DoesNotExist:
                pass
        elif bank_id and not card_id:
            bank = Bank.objects.filter(code=bank_id.upper()).first()
            if bank and bank.withdraw_limit:
                withdraw_limit = bank.withdraw_limit

        if withdraw_limit:
            bank_limit = util.handle_withdraw_limit(withdraw_limit)
            bank_max_amount = bank_limit.get('bank_max_amount', 0)
            if bank_max_amount:
                if amount > bank_max_amount:
                    return Response({
                        "ret_code": 30135,
                        'message': u'提现金额超出银行最大提现限额'
                    })

        # 获取计算后的费率
        fee, management_fee, management_amount = fee_misc.get_withdraw_fee(
            user, amount, margin, uninvested)

        actual_amount = amount - fee - management_fee  # 实际到账金额
        if actual_amount <= 0:
            return Response({"ret_code": 30136, "message": u'余额不足,提现失败'})

        if device_type == 'ios' or device_type == 'android':
            if app_version and app_version < "2.6.3":
                fee = fee + management_fee

        return Response({
            "ret_code": 0,
            "actual_amount": actual_amount,
            "fee": fee,  # 手续费
            "management_fee": management_fee,  # 管理费
            "management_amount": management_amount,  # 计算管理费的金额
        })