Я пробовал трех разных людей из службы поддержки Stripe, чтобы получить четкий ответ на этот вопрос. Кажется, никто не знает, как решить эту проблему. Я хочу подписать клиента на постоянную подписку с помощью Stripe. При выборе плана отображается форма кредитной карты. Клиенты вводят информацию о кредитной карте и нажимают Оплатить, и подписка создана.
Я сделал это с помощью Stripe.js и токенов, добавив немного JavaScript в мой клиент:
function pay() {
stripe.createToken(card).then(function (result) {
if (result.error) {
// Do something
} else {
var token = result.token.id;
$.post("/api/subscriptions/create?token=" + token, ...);
}
});
}
На сервере я поставил токен клиенту (примеры на C #, но может быть любым):
customerService.Update(customerId, new CustomerUpdateOptions
{
SourceToken = token,
});
и создайте подписку:
var items = new List<SubscriptionItemOption> {
new SubscriptionItemOption {
PlanId = newPlanId,
},
};
var subscriptionCreateOptions = new SubscriptionCreateOptions
{
CustomerId = customerId,
Items = items,
};
Subscription subscription = stripe.Subscriptions.Create(subscriptionCreateOptions);
Пока все работает как положено. Stripe автоматически создает счет для первого платежа и создает автоматический платеж. Он также генерирует счет на следующий месяц, который выглядит хорошо.
Я должен быть счастлив сейчас, но я не счастлив. При тестировании приведенного выше кода он не работает для карт, требующих 3D-безопасности и аналогичных расширенных проверок подлинности. В этом случае я получаю сообщение об ошибке от Stripe при создании подписки, в котором говорится, что карта недействительна (я полагаю, поскольку мы никогда не выполняли 3D-аутентификацию).
Из того, что я могу понять из документации Stripe, для отображения диалогового окна 3D-аутентификации потребуется использовать Checkout или Intents API. Я не хочу использовать Checkout, но Intents API выглядит как правильный выбор.
Используя намерения, мне нужно сначала спросить намерение:
var createOptions = new PaymentIntentCreateOptions {
Amount = 4900,
Currency = "usd",
PaymentMethodTypes = new List<string> { "card" }
};
paymentIntents.Create(createOptions);
Это выдает секрет клиента, который я отправляю обратно своему клиенту. Вместо того, чтобы звонить createToken
. На клиенте я вызываю функцию handleCardPayment
, которая показывает 3D-режим защиты в случае, если это необходимо:
stripe.handleCardPayment(
clientSecret, cardElement
).then(function(result) {
if (result.error) {
// Display error.message in your UI.
} else {
$.post("/api/subscriptions/create?...");
}
});
Проблема заключается в том, что handleCardPayment
взимает плату с клиента. Я не хочу этого, потому что хочу автоматически выставлять счет клиенту каждый месяц.
Кто-нибудь знает, возможно ли показать 3D-безопасность (и тому подобное) без использования намерений или хотя бы без создания платы? Я читал похожие вопросы, где люди рекомендуют создать плату, а затем создать подписку с пробной версией 1 месяц. Это не имеет эффекта, которого я хочу, так как это создаст оплату в первый месяц и счет-фактуру в следующие месяцы.
По сути, я просто хочу простейшее решение, которое по-прежнему показывает диалоговое окно 3D-безопасности.