第一次如何一次支付多个订阅。条纹
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'],
]);
如何第一次支付多个订阅。
一个客户可以选择多个订阅,有的是包月的,有的是半年的。
当客户选择订阅后,他将它们添加到购物车。
我在服务器端执行此操作以创建客户 (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'],
]);