Exemplo n.º 1
0
    def post(self, request):
        result = third_pay.add_bank_card(request)

        if result.get('ret_code') == 0:
            try:
                CoopRegister(request).process_for_binding_card(request.user)
            except:
                logger.exception('bind_card_callback_failed for %s' %
                                 str(request.user))

        return Response(result)
Exemplo n.º 2
0
 def test_all_processors_for_session(self):
     #for yiruite
     self.request.GET = {'promo_token': 'yiruite', 'tid': '123456'}
     self.request.session = {}
     coop_reg = CoopRegister(self.request)
     coop_reg.all_processors_for_session()
     assert self.request.session == {
         'channel_code': 'yiruite',
         'channel_user': '******'
     }
     #for default
     self.request.GET = {'promo_token': 'pptv'}
     self.request.session = {}
     coop_reg = CoopRegister(self.request)
     coop_reg.all_processors_for_session()
     assert self.request.session == {'channel_code': 'pptv'}
Exemplo n.º 3
0
    def test_get_user_channel_processor(self):
        self.request.GET = {'promo_token': 'yiruite', 'tid': '123456'}
        self.request.session = {}
        coop_reg = CoopRegister(self.request)
        coop_reg.all_processors_for_session()

        #prepare user data
        prepare_user()
        #prepare channel data
        Channels(code='yiruite', name='yiruite').save()

        coop_reg.all_processors_for_user_register(get_user(), None)
        assert coop_reg.get_user_channel_processor(
            get_user()).c_code == 'yiruite'

        clear_db(Channels, User, IntroducedBy)
Exemplo n.º 4
0
    def test_all_processors_for_register_for_default(self):
        self.request.GET = {'promo_token': 'pptv'}
        self.request.session = {}
        coop_reg = CoopRegister(self.request)
        coop_reg.all_processors_for_session()

        #prepare user data
        prepare_user()
        #prepare channel data
        Channels(code='pptv', name='pptv').save()

        coop_reg.all_processors_for_user_register(get_user(), None)

        introduced_by = IntroducedBy.objects.filter(user=get_user()).get()

        clear_db(Channels, User, IntroducedBy)
Exemplo n.º 5
0
def process_for_bind_card(user, card, req_res, request):
    # Modify by hb on 2015-12-24 : 如果ret_code返回非0, 还需进一步判断card是否有绑定记录, 因为有可能出现充值失败但绑卡成功的情况
    try:
        bind_flag = 0
        if (card.bank.channel == 'kuaipay' and req_res.get('ret_code')
                == 0) or (card.bank.channel == 'yeepay'
                          and req_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))
Exemplo n.º 6
0
    def test_all_processors_for_register_for_yiruite(self):
        self.request.GET = {'promo_token': 'yiruite', 'tid': '123456'}
        self.request.session = {}
        coop_reg = CoopRegister(self.request)
        coop_reg.all_processors_for_session()

        #prepare user data
        prepare_user()
        #prepare channel data
        Channels(code='yiruite', name='yiruite').save()

        coop_reg.all_processors_for_user_register(get_user(), None)

        today = date.today()
        start_day = (today - timedelta(days=1)).strftime('%Y%m%d')
        end_day = (today + timedelta(days=1)).strftime('%Y%m%d')
        md5_sign = md5()
        md5_sign.update(start_day + end_day + settings.WLB_FOR_YIRUITE_KEY)
        sign = md5_sign.hexdigest()
        print start_day, end_day, sign
        assert CoopQuery().get_all_user_info_for_coop(
            'yiruite', 0, start_day, end_day, sign)[0]['tid'] == '123456'

        clear_db(Channels, User, IntroducedBy)
Exemplo n.º 7
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
Exemplo n.º 8
0
    def pre_pay(self, request):
        """
        返回跳转信息{'message': message,'form': form}供跳转js使用,message包含报错信息
            form包含跳转信息
        :param request:
        :return:
        """
        if not request.user.wanglibaouserprofile.id_is_valid:
            return self.render_to_response({
                'message': u'请先进行实名认证'
            })
        form = dict()
        message = ''
        try:
            amount_str = request.POST.get('amount', '')
            amount = decimal.Decimal(amount_str). \
                quantize(TWO_PLACES, context=decimal.Context(traps=[decimal.Inexact]))
            amount_str = str(amount)
            if amount <= 0:
                # todo handler the raise
                raise decimal.DecimalException()

            gate_id = request.POST.get('gate_id', '')
            bank = Bank.objects.get(gate_id=gate_id)

            # Store this as the default bank
            request.user.wanglibaouserprofile.deposit_default_bank_name = bank.name
            request.user.wanglibaouserprofile.save()

            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 = request.user
            pay_info.bank = bank
            pay_info.channel = "huifu"
            pay_info.request_ip = get_client_ip(request)

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

            post = {
                'OrdId': pay_info.pk,
                'GateId': gate_id,
                'OrdAmt': amount_str
            }

            form = self.pay(post)
            pay_info.request = str(form)
            pay_info.status = PayInfo.PROCESSING
            pay_info.save()
            OrderHelper.update_order(order, request.user, pay_info=model_to_dict(pay_info), status=pay_info.status)

            # 处理第三方渠道的用户充值回调
            CoopRegister(request).process_for_recharge(request.user, order.id)
        except decimal.DecimalException:
            message = u'金额格式错误'
        except Bank.DoesNotExist:
            message = u'请选择有效的银行'
        except (socket.error, SignException) as 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)
            logger.fatal('sign error! order id: ' + str(pay_info.pk) + ' ' + str(e))

        result = {
            'message': message,
            'form': form
        }

        return result
Exemplo n.º 9
0
class P2PTrader(object):
    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"

    def purchase(self, amount, redpack=0, platform=u''):
        description = u'购买P2P产品 %s %s 份' % (self.product.short_name, amount)
        is_full = False
        product_balance_after = 0
        if self.user.wanglibaouserprofile.frozen:
            raise P2PException(u'用户账户已冻结,请联系客服')
        with transaction.atomic():
            if redpack:
                # 为防止用户同时打开两个浏览器同时使用加息券和红包,须先检测
                coupons = RedPackRecord.objects.filter(user=self.user, product_id=self.product.id) \
                    .filter(redpack__event__rtype='interest_coupon')
                if coupons:
                    raise P2PException(u'已经选择过加息券,不能重复或叠加使用')
                else:
                    this_redpack = RedPackRecord.objects.filter(
                        pk=redpack).first()
                    this_rtype = this_redpack.redpack.event.rtype
                    coupons = RedPackRecord.objects.filter(user=self.user, product_id=self.product.id) \
                        .exclude(redpack__event__rtype='interest_coupon')
                    if coupons and this_rtype == 'interest_coupon':
                        raise P2PException(u'红包和加息券不能同时叠加使用')

                redpack_order_id = OrderHelper.place_order(
                    self.user,
                    order_type=u'优惠券消费',
                    redpack=redpack,
                    product_id=self.product.id,
                    status=u'新建').id
                result = redpack_backends.consume(redpack, amount, self.user,
                                                  self.order_id,
                                                  self.device_type,
                                                  self.product.id)
                if result['ret_code'] != 0:
                    raise Exception, result['message']
                if result['rtype'] != 'interest_coupon':
                    red_record = self.margin_keeper.redpack_deposit(
                        result['deduct'],
                        u"购买P2P抵扣%s元" % result['deduct'],
                        order_id=redpack_order_id,
                        savepoint=False)
                OrderHelper.update_order(
                    Order.objects.get(pk=redpack_order_id),
                    user=self.user,
                    status=u'成功',
                    amount=amount,
                    deduct=result['deduct'],
                    redpack=redpack)

            product_record = self.product_keeper.reserve(amount,
                                                         self.user,
                                                         savepoint=False,
                                                         platform=platform)
            margin_record = self.margin_keeper.freeze(amount,
                                                      description=description,
                                                      savepoint=False)
            equity = self.equity_keeper.reserve(amount,
                                                description=description,
                                                savepoint=False)

            OrderHelper.update_order(Order.objects.get(pk=self.order_id),
                                     user=self.user,
                                     status=u'份额确认',
                                     amount=amount)

            product_balance_after = product_record.product_balance_after
            if product_balance_after <= 0:
                is_full = True

        # fix@chenweibin, add order_id
        # Modify by hb on 2015-11-25 : add "try-except"
        try:
            logger.debug("=20151125= decide_first.apply_async : [%s], [%s], [%s], [%s], [%s], [%s]" % \
                         (self.user.id, amount, self.device['device_type'], self.order_id, self.product.id, is_full) )
            tools.decide_first.apply_async(
                kwargs={
                    "user_id": self.user.id,
                    "amount": amount,
                    "device": self.device,
                    "order_id": self.order_id,
                    "product_id": self.product.id,
                    "is_full": is_full,
                    "product_balance_after": product_balance_after
                })
        except Exception, reason:
            logger.debug(
                "=20151125= decide_first.apply_async Except:{0}".format(
                    reason))
            pass

        try:
            logger.debug(
                "=20151125= CoopRegister.process_for_purchase : [%s], [%s]" %
                (self.user.id, self.order_id))
            CoopRegister(self.request).process_for_purchase(
                self.user, self.order_id)
        except Exception, reason:
            logger.debug(
                "=20151125= CoopRegister.process_for_purchase Except:{0}".
                format(reason))
            pass
Exemplo n.º 10
0
 def process_request(self, request):
     token = request.GET.get(settings.PROMO_TOKEN_QUERY_STRING, None)
     if token:
         request.session[settings.PROMO_TOKEN_QUERY_STRING] = token
     CoopRegister(request).all_processors_for_session()
Exemplo n.º 11
0
                "ylb_period": int(period)
            },
                                           queue='celery_ylb')

        except Exception, e:
            logger.debug(
                'tools.decide_first.apply_async failed with = {} !!!'.format(
                    e.message))

        # 模拟一个request
        request = urllib2.Request("")
        try:
            logger.info(
                u"=遍历渠道= CoopRegister.process_for_purchase : {}, {}".format(
                    user, product.id))
            CoopRegister(request).process_for_purchase_yuelibao(
                user, product.id)
        except Exception, e:
            logger.debug(
                u"=遍历渠道= CoopRegister.process_for_purchase Except:{}".format(
                    e))

        # ruike qudao
        try:
            kargs = {
                'amount': amount_source,
                'order_id': product.id,
                'user': user,
                'request': request,
                'product': None,
            }
            ruike_obj = RuiKeDistributer(request, kargs)
Exemplo n.º 12
0
    def create(self, request):
        card = Card()
        card.user = request.user
        no = request.DATA.get('no', '')
        if no:
            card.no = no
        else:
            return Response(
                {
                    "message": u"银行账号不能为空",
                    'error_number': ErrorNumber.card_number_error
                },
                status=status.HTTP_400_BAD_REQUEST)

        is_default = request.DATA.get('is_default', False)

        if is_default == 'true':
            card.is_default = True
        elif is_default == 'false':
            card.is_default = False
        else:
            return Response(
                {
                    "message": u"设置是否默认银行卡错误",
                    'error_number': ErrorNumber.card_isdefault_error
                },
                status=status.HTTP_400_BAD_REQUEST)

        if not re.match('^[\d]{0,25}$', card.no):
            return Response(
                {
                    "message": u"银行账号超过长度",
                    'error_number': ErrorNumber.form_error
                },
                status=status.HTTP_400_BAD_REQUEST)

        bank_id = request.DATA.get('bank', '')

        exist_cards = Card.objects.filter(no=card.no)
        exist_cards1 = Card.objects.filter(user=card.user,
                                           no__startswith=card.no[:6],
                                           no__endswith=card.no[-4:]).first()
        if exist_cards or exist_cards1:
            return Response(
                {
                    "message": u"您输入的银行卡号已绑定,请尝试其他银行卡号码,如非本人操作请联系客服",
                    'error_number': ErrorNumber.duplicate
                },
                status=status.HTTP_400_BAD_REQUEST)

        try:
            card.bank = Bank.objects.get(pk=bank_id)
        except:
            return Response(
                {
                    "message": u"没有找到该银行",
                    'error_number': ErrorNumber.not_find
                },
                status=status.HTTP_400_BAD_REQUEST)

        # passport user
        if not request.user.wanglibaouserprofile.id_number[0].isdigit():
            card.is_bind_yee = True
            card.is_bind_kuai = True

        card.save()

        try:
            # 处理第PC三方用户绑卡回调
            CoopRegister(request).process_for_binding_card(request.user)
        except Exception, e:
            logger.error(e)
Exemplo n.º 13
0
                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_type = pay_info.device
            try:
                # fix@chenweibi, add order_id
                tools.deposit_ok.apply_async(kwargs={"user_id": pay_info.user.id, "amount": pay_info.amount,
                                                     "device": device_type, "order_id": orderId})
                CoopRegister(request).process_for_recharge(pay_info.user, pay_info.order_id)
            except:
                pass

            # 充值成功后,更新本次银行使用的时间
            if len(pay_info.card_no) == 10:
                Card.objects.filter(user=pay_info.user, no__startswith=pay_info.card_no[:6], no__endswith=pay_info.card_no[-4:]).update(last_update=timezone.now())
            else:
                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

    def query_trx_result(self, order_id):
        res = self._query_trx_result(order_id)
Exemplo n.º 14
0
    def order_after_pay_succcess(self,
                                 amount,
                                 order_id,
                                 res_ip=None,
                                 res_content=None,
                                 request=None,
                                 need_bind_card=False):
        """
        处理订单和用户的账户
        :param amount:
        :param order_id:
        :param user_id:
        :param ip:
        :param res_content:
        :return:
        """
        # 参数校验
        pay_info = PayInfo.objects.select_for_update().filter(
            order_id=order_id).first()
        if not pay_info:
            # return {"ret_code":20131, "message":"order not exist", "amount": amount}
            raise ThirdPayError(20131, 'order not exist')
        if pay_info.status == PayInfo.SUCCESS:
            return {
                "ret_code": 0,
                "message": PayResult.DEPOSIT_SUCCESS,
                "amount": amount
            }
        if fmt_two_amount(pay_info.amount) != fmt_two_amount(amount):
            raise ThirdPayError(20132, PayResult.EXCEPTION)
        if pay_info.user_id != pay_info.user_id:
            raise ThirdPayError(20133, PayResult.EXCEPTION)

        # 更新pay_info和margin信息
        pay_info.error_message = ""
        if res_content:
            pay_info.response = res_content
        if res_ip:
            pay_info.response_ip = res_ip
        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()

        # 更新order信息
        # if len(pay_info.card_no) == 10:
        #     Card.objects.filter(user=pay_info.user, no__startswith=pay_info.card_no[:6], no__endswith=pay_info.card_no[-4:]).update(last_update=timezone.now(), is_bind_kuai=True)
        # else:
        #     Card.objects.filter(user=pay_info.user, no=pay_info.card_no).update(last_update=timezone.now(), is_bind_kuai=True)
        OrderHelper.update_order(pay_info.order,
                                 pay_info.user,
                                 pay_info=model_to_dict(pay_info),
                                 status=pay_info.status)
        # 绑卡
        if need_bind_card:
            self.add_card(pay_info.card_no, pay_info.bank, pay_info.user,
                          pay_info.channel)

        try:
            user = pay_info.user
            CoopRegister(request).process_for_recharge(user, order_id)
            # tools.deposit_ok(request.user.id, amount, pay_info.device, order_id)
            tools.deposit_ok.apply_async(
                kwargs={
                    "user_id": user.id,
                    "amount": amount,
                    "device": pay_info.device,
                    "order_id": order_id
                })
        except:
            logger.exception('recharge_call_back faile for ' + str(user) +
                             str(order_id))

        logger.critical("orderId:%s success" % order_id)
        rs = {
            "ret_code": 0,
            "message": "success",
            "amount": amount,
            "margin": margin_record.margin_current,
            "order_id": order_id
        }
        return rs