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

时间:2019-11-12 04:02:23

标签: stripe-payments

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

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

场景1

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

我当前的解决方案是记录开始的订阅详细信息,如果付款失败,则在最后将其还原。从直觉上来说,这是错误的,但是它可以使订阅与用户实际支付的费用保持同步。

我有兴趣让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月,系统都不会提示他们支付累积的费用(我认为这是到期日的工作方式)。

必须有一种方法可以在更改我缺少的订阅之前为计划付款。

1 个答案:

答案 0 :(得分:0)

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

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

  • 我将现有的订阅提供给Invoice::upcoming,目的是抓住按比例分配会引起的货币价值变化。我将计划的数量设置为0,以模拟取消(至少是明智的选择)。

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

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

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

  • 如果付款成功,请取消旧的订阅。此步骤需要在两个地方完成:启动事务的服务器代码和通常在订阅支付后便会提供订阅的Webhook。现在,有了SCA,付款成功就可以在不同的地方发生。

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

在上半年,我遵循了this excellent write-up中的示例。