订阅续订时是否引发了customer.subscription.updated事件?

Dai*_*Dai 8 webhooks stripe-payments

我很困惑为什么Stripe的文档表明customer.subscription.updated当我认为事件不应该被触发时:

  • Stripe subscription对象具有属性current_period_start,current_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_succeeded,invoice.createdcharge.succeeded.
  • 但是,订阅生命周期(https://stripe.com/docs/subscriptions/lifecycle)的文档完全没有提及该customer.subscription.updated事件.

看起来很奇怪,这样一个适当的事件在它应该的时候不会被提出.文档也没有说明何时更新current_period_endcurrent_period_start值,这限制了它们的实用性.

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

Sim*_*urd 14

我已经确认customer.subscription.updated 在结算周期结束时调用.

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

我同意该事件的Stripe文档customer.subscription.updated可以更清晰,可以通过说....来涵盖这个用例.

订阅更改时发生.示例包括结算周期何时结束以及新的结算周期开始,何时从一个计划切换到另一个计划,或将状态从试用切换为活动.

(仅供参考:我会完全忽略cheatsheet网站.他们只是稍纵即逝的参考customer.subscription.updated- 在第8步中,他们描述(很差)"没有试用计划创建客户"的用例,这不会创建一个customer.subscription.updated事件,因为此事件仅在订阅更新时发生,而不是在创建时发生.他们在何处参考customer.subscription.updated是在步骤12"发票费用尝试失败"的上下文中)

为了保护Stripes关于订阅生命周期的文档,它确实说"下面的图像显示了发生的最重要事件的生命周期",并且我认为customer.subscription.updated这不是创建发票和付款的重要事件.

有关Stripe如何处理句点结束的一些详细信息:

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

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

  • 围绕发票创建后一个小时,都同时产生三个事件:invoice.payment_succeeded,charge.succeededinvoice.updated.

如何处理结算周期的转存与发票的付款状态完全取决于您,并且在很大程度上取决于您的应用类型.这就是Stripe API的美丽(它是一件美丽的东西).

在我的情况下,我将结算周期的滚动分别视为发票的付款状态.我的应用程序关注结算周期何时结束并根据此更新使用情况,但任何支付失败都会生成警报并在线下处理.

总之,您可以使用customer.subscription.updated在计费周期发生了变化就知道了.


Dom*_*dre 4

customer.subscription.updatedcurrent_period_start当和改变时触发current_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 事件包含发票对象。 (6认同)
  • 同意@SimonCurd 的观点。这让我一开始也很困惑。我决定仅在 customer.subscription.updated 被触发时修改订阅 - 没有其他地方。 (3认同)