有没有一种方法可以避免在付款成功之前更新订阅对象



假设一位客户去我的网店购买了对其现有订阅的升级。他们插入自己的信用卡详细信息并提交购买。付款失败。

有两种情况下,这是一个我还没有找到合适解决方案的问题。

场景1

某些订阅更新不在同一更新功能中收费(例如,月到月计划(,这意味着您必须首先更新订阅,生成发票,然后手动支付。订阅更新和支付不再是原子的。这意味着,即使付款失败,订阅现在也包含他们尚未付款的所需计划的详细信息。

我目前的解决方案是记录开始订阅的详细信息,并在付款失败时在最后恢复它们。这在直觉上是错误的,但它可以使订阅与用户实际支付的费用保持同步。

我有兴趣让Stripe成为我订阅的"真相来源",所以让未支付的更改以不完整的状态徘徊会让这变得困难。

场景2

当引入SCA时,上述策略就失效了,因为现在我不知道支付何时失败,直到通知另一台服务器上的webhook,而且它不再有原始的订阅详细信息。然后,订阅和发票将保持"过期"状态。我不想处于那种状态,因为购买是在网站购物车上进行的,所以它要么成功,要么失败。

因此,我陷入了一种情况,即我的订阅不完整,付款不完整,在下一次尝试更新订阅时(例如,用户输入了一张有效的信用卡(,我的服务器拒绝购买,因为它认为新计划与当前计划相同。

因此,我的主要问题是,有没有办法将对Subscription对象的更新推迟到付款完成?

或者有更好的方法来完全处理订阅更新吗?


我越是深入研究,这似乎就越没有希望。想象一下,你有一个订阅的客户:

Plan: Pro
Interval: Yearly
Quantity: 5
Due: June 20th
Status: active

他们试图购买数量为10的升级版。该产品非常昂贵,因此我们希望在供应前立即向他们收取费用,而不是等到7个月后的下一个计费日。付款未通过SCA身份验证。现在客户有了这个订阅:

Plan: Pro
Interval: Yearly
Quantity: 10
Due: Nov 13 (now + 1 year)
Status: past_due

我们现在该怎么办?你不能恢复订阅,客户有更高的计划而不付款,而且他们在2020年11月之前不会被提示支付累积费用(我认为到期日就是这样(。

在更改我缺少的订阅之前,必须有一种方式来支付计划费用。

Stripe支持建议我创建一个新的订阅,以在成功付款后对旧订阅进行收费并取消订阅。这是可行的,但并非没有一些困难。

由于我还需要按比例分配,我不得不手动执行一些发票步骤。我的解决方案最终是:

  • 我将现有订阅馈送到Invoice::upcoming中,目的是获取按比例分配将导致的货币价值变化。我将计划的数量设置为0,这模拟了取消(至少在金钱方面(。

  • 使用结果来帮助创建InvoiceItem。从即将到来的发票中获取amountcurrencydescription,因此行项目看起来与通常生成的内置项目相同。

  • 使用所需的升级计划创建新订阅。上面的发票项目自动包含在用户最终通过此操作付款的发票上。

  • 如果付款失败,只需忽略新的订阅,或者在需要时进行清理。

  • 如果付款成功,请取消旧订阅。这一步骤需要在两个地方完成,一个是启动事务的服务器代码,另一个是通常在订阅付费后提供订阅的webhook。SCA现在可以在不同的地方成功支付。

这解决了我为了支付升级费用而污染Subscription对象的问题。它处理SCA工作流的成功和失败,如果在任何阶段付款失败,原始Subscription都不会受到影响。

我在上半场以这篇精彩的文章为榜样。

最新更新