【问题标题】:Is the customer.subscription.updated event raised when a subscription is renewed?续订时是否会引发 customer.subscription.updated 事件?
【发布时间】:2017-02-19 17:50:36
【问题描述】:

我很困惑为什么 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.created和@987654334 @。
  • 但是订阅生命周期的文档 (https://stripe.com/docs/subscriptions/lifecycle) 完全没有提到 customer.subscription.updated 事件。

这样一个适当的事件却没有在应该发生的时候引发,这似乎很奇怪。文档也确实没有说明 current_period_endcurrent_period_start 值何时更新,这限制了它们的实用性。

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

【问题讨论】:

    标签: stripe-payments webhooks


    【解决方案1】:

    我已经验证customer.subscription.updated 在计费周期结束时被调用

    为此,我拦截了期间结束时发生的所有 webhook(仅供参考:我使用了一个 AWS Lambda 函数,该函数从 AWS API 网关接收事件,然后将事件放在 SQS 队列中:))

    我同意customer.subscription.updated 事件的the Stripe documentation 可以更清晰,并且可以通过说...来涵盖此用例。

    订阅更改时发生。例子包括 当计费期结束并开始新的计费期时,当 从一个计划切换到另一个计划,或将状态从试用切换到 活跃。

    (仅供参考:我会完全忽略备忘单网站。他们只对customer.subscription.updated 进行了短暂的引用 - 在第 8 步中,他们(糟糕地)描述了“使用未试用计划创建客户”的用例,这将'不创建 customer.subscription.updated 事件,因为此事件仅在订阅更新时发生,而不是在创建订阅时发生。他们引用 customer.subscription.updated 的位置是在第 12 步“发票收费尝试失败”的上下文中)

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

    关于 Stripe 如何处理句点结束的一些细节:

    • 在我的测试中,Stripe 在订阅的 current_period_end 属性中的时间戳后大约 2 分钟引发了customer.subscription.updated 事件。该事件有两个与之关联的数据对象。第一个是带有新值的订阅。第二个是 previousAttributes 对象,具有前两个 current_period_startcurrent_period_end 值。

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

    • 发票创建后大约一个小时,同时生成了三个事件:invoice.payment_succeededcharge.succeededinvoice.updated

    您如何处理计费周期的滚动与发票的付款状态实际上取决于您,并且很大程度上取决于您的应用程序类型。这就是 Stripe API 的美妙之处(它是一件美妙的事情)。

    就我而言,我将计费周期的翻转与发票的付款状态分开处理。我的应用程序关心计费周期何时翻转并基于此更新使用情况,但任何付款失败都会生成警报并离线处理。

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

    【讨论】:

      【解决方案2】:

      customer.subscription.updatedcurrent_period_startcurrent_period_end 发生变化时触发。这些代表计费周期

      invoice.payment_succeeded 发生时,您必须更新您身边的信息(例如:订阅期): https://stripe.com/docs/subscriptions/guide#step-3-sync-with-your-site

      这里还有更多信息:https://support.stripe.com/questions/what-events-can-i-see-when-a-subscription-is-renewed

      【讨论】:

      • 我会恭敬地挑战“当 invoice.payment_succeeded 发生时,您必须更新您身边的信息(例如:订阅期)”的声明 - 恕我直言,决定如何处理这些事件在很大程度上取决于关于您尝试实现的应用程序行为。当 Stripe 告诉我订阅已更新(customer.subscription.updated 事件包含订阅对象)时,我的偏好是更新我这边的订阅。 invoice.payment_succeeded 事件包含发票对象。
      • 同意@SimonCurd。这让我一开始也很困惑。我决定只在 customer.subscription.updated 被触发时修改订阅——别无他处。
      猜你喜欢
      • 2011-07-20
      • 1970-01-01
      • 2017-11-26
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多