Exemple #1
0
def unbind_bankcard(user_id, bankcard_id):
    try:
        bankcard.unbind_bankcard(user_id, bankcard_id)
        response.success()
    except Exception as e:
        logger.exception(e)
        response.fail()
Exemple #2
0
def preprepaid():
    data = request.values
    channel = request.channel
    order_id = data.get('order_id')
    to_user_id = data['to_user_id']
    to_domain_name = data.get('to_domain_name')
    amount = data['amount']
    client_callback_url = data['callback_url']
    client_notify_url = data['notify_url']

    if not to_domain_name:
        to_user_map = channel.get_user_map(to_user_id)
        to_domain_name = channel.user_domain.name
    else:
        # 指定不同的to用户域
        to_domain = get_user_domain_by_name(to_domain_name)
        if to_domain is None:
            return response.fail(
                msg="domain [{0}] not exists.".format(to_domain_name))
        to_user_map = to_domain.get_user_map(to_user_id)
    if to_user_map is None:
        return response.fail(
            msg="to with domain [{0}] user [{1}] not exists.".format(
                to_domain_name, to_user_id))

    try:
        prepaid_record = create_prepaid(channel, order_id,
                                        to_user_map.account_user_id, amount,
                                        client_callback_url, client_notify_url)
        return prepaid_record.tx
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #3
0
def prepay():
    data = request.values
    channel = request.channel
    payer_user_id = data['payer_user_id']
    payee_user_id = data['payee_user_id']
    payee_domain_name = data.get('payee_domain_name')
    order_id = data['order_id']
    product_name = data['product_name']
    product_category = data['product_category']
    product_desc = data['product_desc']
    amount = data['amount']
    client_callback_url = data['callback_url']
    client_notify_url = data['notify_url']
    payment_type = data['payment_type']

    # check
    if payment_type not in [PaymentType.DIRECT, PaymentType.GUARANTEE]:
        return response.fail(
            msg="payment_type [{0}] not supported.".format(payment_type))

    payer_user_map = channel.get_add_user_map(payer_user_id)
    if not payee_domain_name:
        # 默认payee用户域和payer是一致的
        payee_user_map = channel.get_add_user_map(payee_user_id)
    else:
        # 指定不同的payee用户域
        payee_domain = get_user_domain_by_name(payee_domain_name)
        if payee_domain is None:
            return response.fail(
                msg="domain [{0}] not exists.".format(payee_domain_name))
        payee_user_map = payee_domain.get_user_map(payee_user_id)
        if payee_user_map is None:
            return response.fail(
                msg="payee with domain [{0}] user [{1}] not exists.".format(
                    payee_domain_name, payee_user_id))

    try:
        payment_record = pay.find_or_create_payment(
            channel, payment_type, payer_user_map.account_user_id,
            payee_user_map.account_user_id, order_id, product_name,
            product_category, product_desc, amount, client_callback_url,
            client_notify_url)
        return payment_record.tx
    except AlreadyPaidError as e:
        logger.exception(e)
        return response.fail(msg=e.message)
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #4
0
def prepay_channel_order(order_channel, order_id):
    """超级支付接口"""
    channel = get_channel_by_name(order_channel)
    if channel is None:
        return response.refused('bad channel: [{0}]'.format(order_channel))

    try:
        payment_record = pay.find_payment(channel, order_id)
        return payment_record.tx
    except AlreadyPaidError as e:
        logger.exception(e)
        return response.fail(msg=e.message)
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #5
0
def prepare_params(tx, payment_scene, vas_name, extra_params=None):
    from api_x.zyt.user_mapping.auth import vas_payment_is_enabled
    from api_x.zyt.evas.payment import params

    # TODO: log to db.
    logger.info("[PAYMENT PARAMS] {0}, {1}, {2}, {3}, {4}".format(
        payment_scene, vas_name, tx.type, tx.sn, extra_params))

    if tx.state != PaymentTxState.CREATED:
        return response.processed()

    payment_entity = gen_payment_entity(tx)
    if payment_entity is None:
        return response.bad_request()

    # 目前暂时用来控制zyt余额支付仅限于lvye_pay_site.
    if not vas_payment_is_enabled(payment_entity, vas_name):
        return response.refused(msg='[{0}] is not allowed for [{1}]'.format(
            vas_name, tx.channel_name))

    try:
        payment_type, prepared_params = params.prepare(
            payment_scene, vas_name, payment_entity, extra_params=extra_params)
        return response.success(params=prepared_params,
                                vas_name=vas_name,
                                payment_type=payment_type)
    except Exception as e:
        logger.exception(e)
        return response.fail(msg=e.message)
Exemple #6
0
def draw_cheque(user_id):
    data = request.values
    channel = request.channel
    order_id = data.get('order_id')
    amount = data['amount']
    valid_seconds = data.get('valid_seconds', 30)
    cheque_type = data.get('cheque_type', ChequeType.INSTANT)
    info = data.get('info', '')
    client_notify_url = data.get('notify_url', '')

    user_map = channel.get_user_map(user_id)
    if user_map is None:
        return response.bad_request(
            msg='user not exists: [{0}]'.format(user_id))
    from_id = user_map.account_user_id

    try:
        cheque_record = cheque.draw_cheque(channel, from_id, amount, order_id,
                                           valid_seconds, cheque_type, info,
                                           client_notify_url)
        return response.success(sn=cheque_record.sn,
                                cash_token=cheque_record.cash_token,
                                amount=cheque_record.amount)
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #7
0
def withdraw(user_id):
    data = request.values
    channel = request.channel
    order_id = data.get('order_id')
    bankcard_id = data['bankcard_id']
    amount = data['amount']
    client_notify_url = data.get('notify_url', '')

    user_map = channel.get_user_map(user_id)
    if user_map is None:
        return response.bad_request(
            msg='user not exists: [{0}]'.format(user_id))
    from_user_id = user_map.account_user_id

    try:
        amount_value = Decimal(amount)
    except Exception as e:
        logger.error('bad amount value: [{0}]: {1}'.format(amount, e.message))
        return response.bad_request(
            msg='amount value error: [{0}]'.format(amount))

    fee = calc_user_withdraw_fee(from_user_id, amount_value)

    try:
        bankcard = dba.query_bankcard_by_id(bankcard_id)
        if bankcard is None:
            return response.fail(
                msg='bankcard not found: [{0}]'.format(bankcard_id))
        if bankcard.user_id != from_user_id:
            return response.fail(
                msg='bankcard [{0}] is not bound to user [{1}]'.format(
                    bankcard_id, from_user_id))

        withdraw_record = apply_to_withdraw(channel, order_id, from_user_id,
                                            bankcard, amount_value, fee,
                                            client_notify_url, data)
        log_user_withdraw(from_user_id, withdraw_record.sn, bankcard_id,
                          withdraw_record.amount,
                          withdraw_record.actual_amount, withdraw_record.fee)
        return response.success(sn=withdraw_record.sn,
                                actual_amount=withdraw_record.actual_amount,
                                fee=withdraw_record.fee)
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #8
0
        def wrapper(*args, **kwargs):
            try:
                params = {}
                params.update(request.values.items())
                params.update(request.view_args)

                logger.info("[{0}] {1}: {2}".format(entry_path, request.url, params))
                # check perm
                channel_name = params.get('channel_name')
                if channel_name is None:
                    return response.fail(msg='channel_name is needed.')

                channel = get_channel_by_name(channel_name)
                if channel is None:
                    msg = 'channel not exits: [{0}]'.format(channel_name)
                    return response.fail(msg=msg)

                try:
                    _verify_channel_perm(channel, entry_path)
                except EntryAuthError as e:
                    return response.refused(msg=e.message)

                # verify sign
                sign_type = params['sign_type']
                # 这里的主要作用是验签, 只需要channel_pub_key或md5_key
                try:
                    signer = Signer('key', 'sign', channel.md5_key, None, channel.public_key)
                    if not signer.verify(params, sign_type):
                        logger.warn('sign verify error: [{0}]'.format(params))
                        msg = 'sign error.'
                        return response.refused(msg=msg)
                except Exception as e:
                    logger.exception(e)
                    msg = 'sign error.'
                    return response.refused(msg=msg)
            except Exception as e:
                logger.exception(e)
                return response.bad_request(msg=e.message)

            logger.info("[{0}] verify done.".format(entry_path))
            request.__dict__['channel'] = channel
            request.__dict__['params'] = params
            return f(*args, **kwargs)
Exemple #9
0
def cancel_cheque(user_id):
    data = request.values
    channel = request.channel
    sn = data['sn']

    user_map = channel.get_user_map(user_id)
    if user_map is None:
        return response.bad_request(
            msg='user not exists: [{0}]'.format(user_id))

    try:
        cheque.cancel_cheque(channel, user_map.account_user_id, sn)
        return response.success()
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #10
0
def transfer(user_id):
    data = request.values
    channel = request.channel
    to_user_domain_name = data['to_user_domain_name']
    to_user_id = data['to_user_id']
    order_id = data.get('order_id')
    amount = data['amount']
    info = data['info']

    try:
        tx = transfer_biz.apply_to_transfer(channel, order_id,
                                            channel.user_domain.name, user_id,
                                            to_user_domain_name, to_user_id,
                                            amount, info)
        return response.success(sn=tx.sn)
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #11
0
def apply_to_refund():
    data = request.params
    channel = request.channel
    order_id = data['order_id']
    amount = data['amount']
    client_notify_url = data['notify_url']

    logger.info('receive refund: {0}'.format({k: v for k, v in data.items()}))
    try:
        refund_record = refund.apply_to_refund(channel,
                                               order_id,
                                               amount,
                                               client_notify_url,
                                               data=data)
        return response.success(sn=refund_record.sn)
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #12
0
def cash_cheque(user_id):
    data = request.values
    channel = request.channel
    cash_token = data['cash_token']

    user_map = channel.get_user_map(user_id)
    if user_map is None:
        return response.bad_request(
            msg='user not exists: [{0}]'.format(user_id))
    to_id = user_map.account_user_id

    try:
        cheque_record = cheque.cash_cheque(channel, to_id, cash_token)
        return response.success(sn=cheque_record.sn,
                                amount=cheque_record.amount)
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)
Exemple #13
0
def query_info(tx, payment_scene, extra_params=None):
    from api_x.zyt.evas.payment import infos

    # TODO: log to db.
    logger.info("[PAYMENT INFO] {0}, {1}, {2}, {3}".format(
        payment_scene, tx.type, tx.sn, extra_params))
    payment_entity = gen_payment_entity(tx)
    if payment_entity is None:
        return response.bad_request()

    try:
        data, evases, vas_infos = infos.prepare(payment_scene,
                                                payment_entity,
                                                extra_params=extra_params)
        return response.success(info=data,
                                activated_evas=evases,
                                vas_infos=vas_infos)
    except Exception as e:
        logger.exception(e)
        return response.fail(msg=e.message)
Exemple #14
0
def list_cheque(user_id):
    data = request.values
    channel = request.channel

    user_map = channel.get_user_map(user_id)
    if user_map is None:
        return response.bad_request(
            msg='user not exists: [{0}]'.format(user_id))

    try:
        cheque_records = cheque.list_cheque(channel, user_map.account_user_id)
        return response.success(cheques=[{
            'sn': cr.sn,
            'info': cr.info,
            'type': cr.type,
            'amount': cr.amount,
            'cash_token': cr.cash_token,
            'expired_at': cr.expired_at,
            'created_on': cr.created_on
        } for cr in cheque_records])
    except Exception as e:
        logger.exception(e)
        return response.fail(code=1, msg=e.message)