0

我正在尝试在客户端创建多个令牌以发送到服务器以在 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 以创建额外的隐藏输入字段以进行发送。

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

4

1 回答 1

1

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

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

在 PHP 中,代码如下所示:

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

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

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

于 2017-05-27T12:15:52.480 回答