Stripe Connect — создайте несколько токенов для нескольких целевых сборов

Я пытаюсь создать несколько клиентских токенов для отправки на сервер, чтобы произвести несколько целевых сборов в Stripe Connect.

Я не могу использовать объект «Клиент», потому что для целевого сбора клиент должен быть подключенной учетной записью на платформе, поэтому гостевые проверки не будут работать.

Поэтому мне нужно вызвать Stripe.createToken «x» раз и сохранить токены в «x» количестве скрытых входов, используя функцию stripeResponseHandler, которые затем отправляются на сервер для обработки сборов.

Вот как мне удалось это сделать для 2 токенов очень-очень вручную:

Stripe.createToken( {
    number:     card,
    cvc:        cvc,
    exp_month:  month,
    exp_year:   year,
    name:       name,
    address_line1: address_line1,
    address_line2: address_line2,
    address_state: address_state,
    address_city: address_city,
    address_zip: address_zip,
    address_country: address_country
}, stripeResponseHandler1 );

Stripe.createToken( {
    number:     card,
    cvc:        cvc,
    exp_month:  month,
    exp_year:   year,
    name:       name,
    address_line1: address_line1,
    address_line2: address_line2,
    address_state: address_state,
    address_city: address_city,
    address_zip: address_zip,
    address_country: address_country
}, stripeResponseHandler2 );

function stripeResponseHandler1( status, response ) {
    var $form = jQuery("form.checkout, form#order_review");

    if ( response.error ) {
        jQuery('.woocommerce_error, .woocommerce-error, .woocommerce-message, .woocommerce_message, .stripe_token').remove();
        jQuery('#dokan-stripe-connect-card-number').closest('p').before( '<ul class="woocommerce_error woocommerce-error"><li>' + response.error.message + '</li></ul>' );

        $form.unblock();

    } else {
        var token = response['id'];
        wc_stripe_connect_params.token_done = true;

        jQuery( '.stripe_token').remove();

        $form.append("<input type='hidden' class='stripe_token' name='stripe_token1' value='" + token + "'/>");
    }
}

function stripeResponseHandler2( status, response ) {
    var $form = jQuery("form.checkout, form#order_review");

    if ( response.error ) {
        jQuery('.woocommerce_error, .woocommerce-error, .woocommerce-message, .woocommerce_message, .stripe_token').remove();
        jQuery('#dokan-stripe-connect-card-number').closest('p').before( '<ul class="woocommerce_error woocommerce-error"><li>' + response.error.message + '</li></ul>' );

        $form.unblock();

    } else {
        var token = response['id'];
        wc_stripe_connect_params.token_done = true;

        $form.append("<input type='hidden' class='stripe_token2' name='stripe_token2' value='" + token + "'/>");

        $form.submit();
    }
}

Очевидно, что это не то, как что-либо должно быть закодировано, поэтому я думаю, что мне нужно сделать что-то вроде:

var vendor_count = jQuery(".vendor_count").first().data("count");
for(i = 1; i <= vendor_count; i++ ) {
    Stripe.createToken( {
        number:     card,
        cvc:        cvc,
        exp_month:  month,
        exp_year:   year,
        name:       name,
        address_line1: address_line1,
        address_line2: address_line2,
        address_state: address_state,
        address_city: address_city,
        address_zip: address_zip,
        address_country: address_country
    }, stripeResponseHandler );
}

Но я не могу понять, как передать индекс vendor_count в stripeResponseHandler, чтобы создать дополнительные скрытые поля ввода для отправки.

Я полностью иду об этом неправильно? Я чувствую, что, основываясь на моих причинах в начале этого поста, у меня есть причина требовать создания нескольких токенов таким образом.


person limco    schedule 27.05.2017    source источник
comment
Разве вы не можете просто использовать цикл for для создания нескольких токенов? Вы не должны этого делать, если это не разрешено в Stripe, кстати.   -  person Edward    schedule 27.05.2017
comment
да, я связался с ними, поэтому, если есть проблемы с тем, что я делаю, я должен получить ответ.   -  person limco    schedule 27.05.2017


Ответы (1)


При использовании целевого платежа клиент должен существовать на платформеи не на подключенном аккаунте. Причина в том, что в качестве платформы вы создаете плату в своей учетной записи и указываете Stripe автоматически переводить часть средств на подключенную учетную запись. Поскольку заряд создается на платформе, именно там должен жить клиент.

Если вы действительно используете целевые сборы, вам нужен только один токен. Затем вы можете создать плату для каждой подключенной учетной записи, передав идентификатор учетной записи acct_XXX в параметре destination[account].

В PHP код выглядит так:

$charge = \Stripe\Charge::create(array(
  'amount' => 1000,
  'currency' => 'usd',
  'customer' => "cus_AAAAA",
  'destination' => array(
    "account" => "acct_1234,
    "amount" => 900
  )
));

С другой стороны, если вы создаете прямые платежи, то они будут жить непосредственно на подключенный аккаунт. В этом случае вы не можете взимать плату с клиента, созданного на платформе, но вам все равно не нужно создавать несколько токенов на стороне клиента.

Вместо этого идея состоит в том, чтобы использовать общие клиенты. Это означает, что вы сохраняете данные карты в платформе на клиенте один раз. И затем, каждый раз, когда вы хотите списать средства с этой карты в подключенной учетной записи, вы используете эту функцию для создания нового токена на стороне сервера для этого клиента и одной из его сохраненных карт. Вы получаете новый токен карты и затем используете этот токен для создания платежа на подключенной учетной записи.

В PHP код выглядит так:

// Create a new token for the saved card
$token = \Stripe\Token::create(
  array(
    "customer" => "cus_AAAAA",
    "card" => "card_BBBBB"
  ),
  array("stripe_account" => "acct_AAAAAA")
);

// Charge that new token on the connected account
$charge = \Stripe\Charge::create(
  array(
    "amount" => 1000,
    "currency" => "USD",
    "source" => $token->id,
  ),
  array("stripe_account" => "acct_AAAAAA")
);

Stripe также только что запустила возможность разделять средства между несколькими получателями. Это позволяет вам создать один платеж на платформе, а затем разделить средства с несколькими подключенными учетными записями, используя transfer_group. Это, вероятно, лучшее решение для вас, если ваша платформа и ваши подключенные учетные записи находятся в странах, где это поддерживается.

person koopajah    schedule 27.05.2017
comment
Чувак, ты абсолютно прав. Я пытался передать клиента при создании токена, когда я должен был сделать это при создании платежа, как в вашем первом примере. Сначала я смотрел на общих клиентов, но, к сожалению, мы не подходим из-за географии. Большое спасибо, что нашли время, чтобы изучить это и объяснить все это. - person limco; 27.05.2017
comment
Общие клиенты @limco доступны для любой учетной записи Stripe. Нет никаких ограничений на использование этого в любом месте. Если вы не можете разделить средства, лучше всего вам подойдут общие клиенты. - person koopajah; 27.05.2017
comment
эй, моя ошибка. Я имел в виду «Создание отдельных платежей и переводов», предварительная версия которого доступна только в США. Сегодня я еще посмотрю на Shared Customers. Еще раз спасибо, чувак... - person limco; 28.05.2017