Stripe Connect - 为多个目的地费用创建多个令牌

Stripe Connect - Create multiple tokens for multiple Destination Charges

我正在尝试在客户端创建多个令牌以发送到服务器以在 Stripe Connect 上进行多个目的地收费。

我不能使用 Customer 对象,因为对于 Destination Charges,Customer 必须是平台上的关联帐户,因此访客结账将不起作用。

所以我需要调用 Stripe.createToken 'x' 次,并使用 stripeResponseHandler 函数将令牌保存在 'x' 个隐藏输入中,然后将其提交给服务器端进行处理收费。

这就是我为 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 以创建用于发送的额外隐藏输入字段。

我是不是完全走错了路?我觉得基于我开头的原因post,我有理由要求以这种方式创建多个令牌。

当您使用 destination 费用时,客户必须存在于 平台上 而不是连接的帐户上。原因是,作为一个平台,您在您的账户中创建费用并告诉 Stripe 自动将部分资金转移到连接的账户。由于费用是在平台上创建的,所以那是客户必须居住的地方。

如果你真的要使用目的地收费,那么你只需要一个令牌。然后,您可以通过在 destination[account] 参数中传递帐户 ID acct_XXX 来为每个关联帐户创建费用。

在 PHP 中,代码如下所示:

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

另一方面,如果您正在创建 direct charges,那么它将直接存在于连接的帐户中。在这种情况下,您无法向在平台中创建的客户收费,但您仍然不需要在客户端创建多个令牌。

我们的想法是使用 Shared customers。这意味着您将卡详细信息保存在客户的平台中一次。然后,每次您想在连接的帐户上对该卡收费时,您都可以使用此功能为该客户及其保存的一张卡在服务器端创建一个新令牌。您获得一个新的卡令牌,然后使用该令牌在连接的帐户上创建费用。

在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 还刚刚推出了在多个收件人之间 split funds 的功能。这允许您在平台上创建一笔费用,然后使用 transfer_group 将资金分配给多个关联账户。假设您的平台和关联帐户位于支持此功能的国家/地区,这可能是您的最佳解决方案。