【问题标题】:Is there a way to avoid updating the subscription object until the payment has succeeded?有没有办法避免在支付成功之前更新订阅对象?
【发布时间】:2020-03-07 18:13:02
【问题描述】:

假设客户访问我的在线商店并购买了对其现有订阅的升级。他们插入他们的信用卡详细信息并提交购买。支付失败。

在两种情况下,我还没有找到合适的解决方案。

场景 1

一些订阅更新是not charged within the same update function(例如,按月到按月计划),这意味着您必须先更新订阅,生成发票,然后手动付款。订阅更新和支付不再是原子的。这意味着即使付款失败,订阅现在也包含他们尚未支付的所需计划的详细信息。

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

我有兴趣让 Stripe 成为我订阅的“真实来源”,因此让未付费的更改在不完整的状态下徘徊会变得很困难。

场景 2

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

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

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

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


我研究得越多,这似乎就越绝望。假设您有一个订阅此订阅的客户:

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-payments


    【解决方案1】:

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

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

    • 我将现有订阅提供给Invoice::upcoming,以获取按比例分配将导致的货币价值变化。我将计划的数量设置为 0,以模拟取消(至少在金钱方面)。

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

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

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

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

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

    上半场我按照this excellent write-up的例子进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2013-07-01
      • 2011-01-11
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多