第一次如何一次支付多个订阅。条纹

How to pay for multiple subscriptions at once for the first time. Stripe

如何第一次支付多个订阅。

一个客户可以选择多个订阅,有的是包月的,有的是半年的。

当客户选择订阅后,他将它们添加到购物车。

我在服务器端执行此操作以创建客户 (stripe.com/docs/billing/subscriptions/elements#create-customer)

$customer = $stripe->customers->create([
'email' => $this->getUser()->getEmail(),
]);

然后我创建订阅 (https://stripe.com/docs/billing/subscriptions/multiple)

$sub1 = $stripe->subscriptions->create([
  'customer' => 'cus_4fdAW5ftNQow1b',
  'items' => [['price' => 'price_CZB2krKbBDOkTe']],
  'payment_behavior' => 'default_incomplete',
  'expand' => ['latest_invoice.payment_intent'],
]);

$sub2 = $stripe->subscriptions->create([
  'customer' => 'cus_4fdAW5ftNQow1b',
  'items' => [['price' => 'price_CZB1AX3KOacNJb']],
  'payment_behavior' => 'default_incomplete',
  'expand' => ['latest_invoice.payment_intent'],
]);

但是,在文档中引用:

"On the backend, create the subscription with status incomplete using payment_behavior=default_incomplete and returns the client_secret from the payment intent to the frontend to complete payment."

我遇到的问题是每个订阅都有一个 client_secret。那么,如何以一种信用卡形式支付(第一次,开始订阅)。

在前端我有这个:

    
let stripePublicKey = "{{ stripePublicKey }}"
            
let stripe = Stripe(stripePublicKey);
let elements = stripe.elements();

//let clientSecret = {{clientSecret}} // the secret client is requested in the function stripe.confirmCardPayment below

//Create an instance of an Element and mount it to the Element container
let card = elements.create('card');
card.mount('#card-element');

            
function displayError(event) {
    //changeLoadingStatePrices(false);
    let displayError = document.getElementById('card-element-errors');
    if (event.error) {
            displayError.textContent = event.error.message;
    } else {
            displayError.textContent = '';
            }
    }

    card.addEventListener('change', function (event) {
        displayError(event);
    });


    const btn = document.querySelector('#submit-payment-btn');
    btn.addEventListener('click', async (e) => {
        e.preventDefault();
        const nameInput = document.getElementById('name');

        // Create payment method and confirm payment intent.
        stripe.confirmCardPayment(clientSecret, {
            payment_method: {
                card: cardElement,
                billing_details: {
                    name: nameInput.value,
                    },
                }
        }).then((result) => {
            
            if(result.error) {
                alert(result.error.message);
            } else {
                // Successful subscription payment

                }
        });
    });

    

这可能吗?如果不是,我应该考虑什么方法?

谢谢!

更新

如果我做一个循环来支付,是不是错了?

const btn = document.querySelector('#submit-payment-btn');
btn.addEventListener('click', async (e) => {
            e.preventDefault();
            for(const [key, value] of Object.entries(clientSecrets)) {
                // Create payment method and confirm payment intent.
                await stripe.confirmCardPayment(value.secret, {
                    payment_method: {
                        card: card,
                        billing_details: {
                            name: '{{app.user.fullName}}'
                        },
                    }
                }).then((result) => {
                    if (result.error) {
                        alert(result.error.message);
                    } else {
                        // Successful subscription payment
                        console.log('Successful subscription payment');
                    }
                });
                
            }
});

它会引起问题吗?

您不能按照您尝试的方式执行此操作,因为您注意到这些是单独的付款意向(每个都有自己的 client_secret)。

当您遵循 default_incomplete 集成路径时,当您从第一个订阅中确认付款意向时,付款方式将附加到客户并准备好供将来使用。成功后,您可以使用该附加的付款方式创建第二个订阅,方法是显式提供 default_payment_method (API ref), or by setting the customer invoice_settings[default_payment_method] first (API ref)。您可能仍会遇到身份验证请求,具体取决于您客户的银行,因此请务必检查并处理这些情况。

$sub1 = $stripe->subscriptions->create([
'customer' => 'cus_4fdAW5ftNQow1b',
'items' => [
      ['price' => 'price_CZB2krKbBDOkTe'],
      ['price' => 'price_CZB1AX3KOacNJb']
],
'payment_behavior' => 'default_incomplete',
'expand' => ['latest_invoice.payment_intent'],
]);