Stripe payments 有没有办法避免在付款成功之前更新订阅对象?

Stripe payments 有没有办法避免在付款成功之前更新订阅对象?,stripe-payments,Stripe Payments,假设一位客户到我的网上商店购买了对其现有订阅的升级。他们插入信用卡详细信息并提交购买。付款失败 有两种情况下,这是一个我没有找到适当解决方案的问题 情景1 某些订阅更新是(例如,从每月到每月的计划),这意味着您必须首先更新订阅,生成发票,然后手动支付。订阅更新和支付不再是原子的。这意味着即使支付失败,订阅现在也包含了他们尚未支付的所需计划的详细信息 我目前的解决方案是记录开始订阅的详细信息,并在付款失败时在最后恢复它们。从直觉上看,这是错误的,但它可以使订阅与用户实际支付的费用保持同步 我有兴趣

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

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

情景1

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

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

我有兴趣将Stripe作为我订阅的“真实来源”,因此将未支付的更改保留在不完整的状态下会使这变得很困难

场景2

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

因此,我陷入了订阅不完整、付款不完整的场景,在下一次尝试更新订阅时(例如,用户输入工作信用卡),我的服务器拒绝购买,因为它认为新计划与当前计划相同

所以我的主要问题是,有没有办法推迟订阅对象的更新,直到付款完成

还是有更好的方法完全处理订阅更新


我看得越多,这似乎就越没有希望。假设您有一位客户使用此订阅:

Plan: Pro
Interval: Yearly
Quantity: 5
Due: June 20th
Status: active
Plan: Pro
Interval: Yearly
Quantity: 10
Due: Nov 13 (now + 1 year)
Status: past_due
他们试图购买升级到10个数量的产品。该产品非常昂贵,因此我们希望在供应之前立即向他们收费,而不是等到下一个计费日,也就是7个月后。付款未通过SCA身份验证。现在,客户有了此订阅:

Plan: Pro
Interval: Yearly
Quantity: 5
Due: June 20th
Status: active
Plan: Pro
Interval: Yearly
Quantity: 10
Due: Nov 13 (now + 1 year)
Status: past_due
我们现在该怎么办?您无法恢复订阅,客户有一个更高的计划而不付款,并且在2020年11月之前不会提示他们支付累积费用(我认为到期日就是这样工作的)


在更改我丢失的订阅之前,必须有一种支付计划费用的方法。

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

因为我还需要按比例分配,所以我必须手动执行一些发票步骤。我的解决方案是:

  • 我将现有订阅馈送到一个
    发票::即将推出的
    ,以获取按比例分配将导致的货币价值变化。我将计划的数量设置为0,这模拟了取消(至少在金钱方面)

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

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

  • 如果支付失败,只需忽略新订阅,或者在需要时清理它

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

这解决了我为了支付升级费用而污染订阅对象的问题。它处理成功和失败的SCA工作流,如果在任何阶段付款失败,原始的
订阅
将保持不变


我在上半年遵循了中的示例。

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

因为我还需要按比例分配,所以我必须手动执行一些发票步骤。我的解决方案是:

  • 我将现有订阅馈送到一个
    发票::即将推出的
    ,以获取按比例分配将导致的货币价值变化。我将计划的数量设置为0,这模拟了取消(至少在金钱方面)

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

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

  • 如果支付失败,只需忽略新订阅,或者在需要时清理它

  • 如果付款成功,请取消旧订阅。这一步需要在两个地方完成:启动事务的服务器代码和启动事务的webhook