结合使用Stripe Intents API和计费(定期订阅)

Tho*_*dal 6 stripe-payments

我已经尝试了三种不同的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, ...);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

在服务器上,我将令牌放在客户身上(C#中的示例,但可以是任何东西):

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, ...);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

并创建一个订阅:

customerService.Update(customerId, new CustomerUpdateOptions
{
    SourceToken = token,
});
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都按预期进行。Stripe自动为第一笔付款创建发票并创建自动费用。它还会为下个月生成一张看起来不错的发票。

我现在应该很高兴,但我不高兴。测试上述代码时,不适用于需要3D安全和类似扩展身份验证检查的卡。在那种情况下,创建订阅时我会从Stripe收到错误消息,说该卡无效(我想是因为我们从未完成3D安全身份验证)。

据我从Stripe文档中了解到的那样,显示3D安全身份验证对话框将要求我使用Checkout或Intents API。我不想使用Checkout,但是Intents API看起来像是正确的选择。

使用意图,我需要先提出意图:

var items = new List<SubscriptionItemOption> {
    new SubscriptionItemOption {
        PlanId = newPlanId,
    },
};
var subscriptionCreateOptions = new SubscriptionCreateOptions
{
    CustomerId = customerId,
    Items = items,
};
Subscription subscription = stripe.Subscriptions.Create(subscriptionCreateOptions);
Run Code Online (Sandbox Code Playgroud)

这产生了一个客户机密,我将其发送回我的客户。而不是打电话createToken。在客户端上,我调用handleCardPayment函数,该函数在需要时显示3D安全模态:

stripe.handleCardPayment(
    clientSecret, cardElement
  ).then(function(result) {
    if (result.error) {
      // Display error.message in your UI.
    } else {
      $.post("/api/subscriptions/create?...");
    }
  });
Run Code Online (Sandbox Code Playgroud)

这里的问题是handleCardPayment要向客户收费。我不想要那样,因为我想每月自动为客户开票。

有谁知道是否有可能在不使用意图的情况下或者至少在不产生费用的情况下显示3D安全(和类似内容)?我读过类似的问题,人们建议创建费用,然后通过1个月的试用期创建订阅。这并没有我想要的效果,因为这将在第一个月产生费用,并在接下来的几个月产生费用发票。

基本上,我只希望最简单的解决方案仍然显示3D安全对话框。

小智 7

Stripe目前正在致力于将PaymentIntents与Subscriptions集成在一起,并计划在2019年4月支持该流程。一旦可用,您肯定会想要使用PaymentIntents。由于在不久的将来,您可能只想等到它可用。

如果您需要同时进行此操作,本指南将引导您完成设置带有初始3DS检查的订阅。这是您正在谈论的试用期的推荐方法。

更新

根据Stripe的说法,支付意图的完整规范的日期已移至2019年7月1日:

带有付款意图API的离场付款

第三点说:

您将需要进行增量更改,以申请免税并降低客户要求的身份验证挑战的速度-这将在2019年7月1日完成。

https://stripe.com/docs/strong-customer-authentication/migration#step-2