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

时间:2017-05-27 04:07:49

标签: php stripe-payments stripe-connect dokan stripe.js

我尝试创建多个令牌客户端以发送到服务器,以便在条带连接上进行多次目标收费。

我无法使用客户对象,因为对于目标费用,客户必须是平台上的关联帐户,因此访客结帐无法正常工作。

所以我需要调用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以创建额外的隐藏输入字段以供发送。

我是否完全以错误的方式解决这个问题?我觉得根据我在本文开头的理由,我有理由要求以这种方式创建多个令牌。

1 个答案:

答案 0 :(得分:1)

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

如果您确实使用目的地费用,那么您只需要一个令牌。然后,您可以在acct_XXX参数中传递其帐户ID destination[account],为每个已关联的帐户设置费用。

在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将资金与多个已连接的帐户分开。假设您的平台和关联帐户位于支持此类帐户的国家/地区,这可能是您的最佳解决方案。