使用 customer.subscription.update 而不是 invoice.paid 和 invoice.payment_failed 事件 webhook 来处理 Stripe 订阅

Posted

技术标签:

【中文标题】使用 customer.subscription.update 而不是 invoice.paid 和 invoice.payment_failed 事件 webhook 来处理 Stripe 订阅【英文标题】:Using customer.subscription.update instead of invoice.paid and invoice.payment_failed event webhooks to handle Stripe Subscriptions 【发布时间】:2021-08-22 16:08:15 【问题描述】:

我正在尝试使用 Stripe 构建一个包含三个或四个不同计划的简单订阅网站。

在用户注册的应用程序中,会分配一个 Stripe 客户 ID。然后,在订阅计划时,我正在监听这些 webhook 事件:

customer.subscription.updated || customer.subscription.created

每次订阅发生变化时都会触发它们。然后我检查status 属性,它会告诉我用户是activeincompletetrialingcanceledpast_due 还是unpaid,并在我的数据库表中为用户采取相应的行动。

这对我来说很有意义,但 Stripe 使用了发票事件 webhook (https://stripe.com/docs/billing/subscriptions/checkout#provision-and-monitor):

checkout.session.completed invoice.paid invoice.payment_failed

我应该收听这些事件吗?我不确定,因为例如,发票事件不会跟踪客户在计费周期中间更改计划的时间,所以无论如何我都必须添加customer.subscription.updated webhook。

【问题讨论】:

【参考方案1】:

这完全取决于您和您的集成需求(有很多不同的 webhook 事件,其中许多可用于相同目的)。通常,用户更关心知道何时实际支付续订发票,这就是该指南推荐这些事件作为最低限度的原因。如果您订阅了每月向客户发送货物的订阅,那么在发货前收听发票付款成功的确认会更有意义。

话虽如此,您绝对可以依赖customer.subscription.updated 事件,但如果您关心知道何时付款成功或想要收到重试通知,您还需要监听invoice.paid/payment_failed 事件。 以您的订阅续费和支付成功的情况为例:

    首先,您将收到 customer.subscription.updated 事件,表明计费周期已更改并且已创建草稿发票(这也会发送 invoice.created 事件)。 一小时后,发票最终确定并自动付款 您的 webhook 端点收到一个 invoice.paid webhook 事件,但没有收到另一个 customer.subscription.updated 事件,因为状态处于活动状态且未更改。

【讨论】:

对于某些 SaaS 应用程序,如果订阅保持 active 并且发票电子邮件由 Stripe 处理,则不会发生任何变化,只依赖 customer.subscription.updated 事件是可以的。

以上是关于使用 customer.subscription.update 而不是 invoice.paid 和 invoice.payment_failed 事件 webhook 来处理 Stripe 订阅的主要内容,如果未能解决你的问题,请参考以下文章

测试 Stripe 的 trial_will_end webhook

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)