当订阅续订时,是否会触发customer.subscription.updated事件?

30

我对Stripe的文档建议customer.subscription.updated事件不会被触发感到困惑,因为我认为它应该被触发:

  • Stripe的subscription对象具有属性current_period_startcurrent_period_end,每当客户成功支付订阅的发票时,这些属性将被更新(https://stripe.com/docs/api#subscriptions)。
  • customer.subscription.updated事件的文档说明...

    每当订阅更改时触发。例如,从一个计划切换到另一个计划,或从试用状态切换为活动状态。

    ...这意味着如果current_period_startcurrent_period_end值发生变化,事件将被触发,但是它没有明确说明在这种情况下是否触发。

    然而,这个第三方网页指出,在成功续订时不会触发它(https://www.masteringmodernpayments.com/stripe-webhook-event-cheatsheet#8)。

  • 但是触发此事件是有道理的...

  • 如果应用程序只需要监视单个事件类型(即customer.subscription.updated),那么它将极大地简化程序代码,而无需同时监视invoice.payment_succeededinvoice.createdcharge.succeeded
  • 然而,订阅生命周期的文档(https://stripe.com/docs/subscriptions/lifecycle)根本没有提到customer.subscription.updated事件。

看起来很奇怪,应该触发这样一个适当的事件,但它没有被触发。文档也没有确切说明何时更新current_period_endcurrent_period_start值,这限制了它们的实用性。

因此,在我的应用程序中,收到invoice.payment_succeeded事件后,我的编程代码如何确定客户的订阅周期何时结束?

2个回答

36

我已验证,当计费周期结束时,customer.subscription.updated 被调用了

为了做到这一点,我截取了所有发生在该周期末尾的 Webhooks(FYI:我使用了一个 AWS Lambda 函数,该函数接收来自 AWS API Gateway 的事件,然后将事件放入 SQS 队列中 :))

我同意Stripe 文档中关于 customer.subscription.updated 事件的描述可能不够清晰,并且可能通过以下方式涵盖此用例....

当订阅更改时发生。例如,当计费周期结束并开始新的计费周期、从一个计划切换到另一个计划或从试用状态切换到活动状态时。

(FYI:我完全忽略了 cheatsheet 网站。它们仅在第 8 步中短暂提到了 customer.subscription.updated,描述了“创建一个没有试用期计划的客户”的用例(不会创建customer.subscription.updated 事件,因为此事件仅在订阅更新时发生,而不是在创建时发生)。 它们提到 customer.subscription.updated 的地方是在第 12 步的上下文中,“发票收费尝试失败”)

为了捍卫 Stripe 关于订阅生命周期的文档,它确实说“以下图像显示发生的最重要事件的生命周期”,我认为在创建发票和进行付款的上下文中,customer.subscription.updated 不是一个 重要 的事件。

Stripe 如何处理周期结束的一些细节:

  • 在我的测试中,Stripe 在当前订阅的 current_period_end 属性中的时间戳之后约 2 分钟引发了 customer.subscription.updated 事件。此事件有两个关联数据对象。第一个是具有新值的订阅。第二个是 previousAttributes 对象,其中包含两个先前的 current_period_start 和 current_period_end 值。

  • 同时生成了两个事件:customer.subscription.updated 和 invoice.created(这是刚刚过去的周期的发票)。

  • 大约在发票创建后一小时内,同时生成了三个事件:invoice.payment_succeeded、charge.succeeded 和 invoice.updated。

如何处理计费周期滚动与发票支付状态取决于您的应用程序类型。这就是 Stripe API 的美妙之处(它确实很美)。

在我的情况下,我将计费周期滚动和发票支付状态分别处理。我的应用程序关心计费周期何时滚动,并根据此更新使用情况,但任何付款失败都会生成警报并进行离线处理。

总之,您可以使用 customer.subscription.updated 了解计费周期何时更改。


3

4
我想恭敬地挑战一下这个说法:“当发生invoice.payment_succeeded事件时,您必须在自己的系统中更新信息(例如:订阅期)”,我认为如何处理这些事件很大程度上取决于您想要实现的应用程序行为。我的偏好是在Stripe告诉我订阅已更新时(customer.subscription.updated事件包含订阅对象),在我的系统中更新订阅。invoice.payment_succeeded事件包含发票对象。 - Simon Curd
1
同意@SimonCurd的观点。一开始我也感到困惑。我已经决定只在收到customer.subscription.updated时修改订阅 - 不会在其他地方进行修改。 - nickdnk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接