使用 customer.subscription.update 而不是 invoice.paid 和 invoice.payment_failed 事件网络钩子来处理条纹订阅

问题描述

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

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

<html> <body> <h1>The map and area elements</h1> <p>Click on the area of the image,there will be several areas. When click,the color will change depending on the area that was clicked.</p> <img src="theimage.jpg" alt="image" usemap="#theimage" width="400" height="379"> <map name="theimage"> <area shape="rect" coords="34,44,270,350" alt="thearea" href=""> </map> </body> </html>

每次订阅发生变化时都会触发它们。然后我检查 customer.subscription.updated || customer.subscription.created 属性,它会告诉我用户statusactiveincompletetrialingcanceled 还是 { {1}} 并在我的数据库表中为用户采取相应措施。

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

  • checkout.session.completed
  • 发票.已付
  • invoice.payment_Failed

我应该听这些事件吗?我不确定,因为例如,当客户在结算周期中途更改计划时,发票事件不会跟踪,因此无论如何我都必须添加 past_due 网络钩子。

解决方法

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

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

  1. 首先,您会收到 customer.subscription.updated 事件,表示帐单周期已更改且帐单草稿已创建(这也会发送 invoice.created 事件)。
  2. 一个小时后,发票会自动完成并支付
  3. 您的 webhook 端点收到一个 invoice.paid webhook 事件,但没有另一个 customer.subscription.updated 事件,因为状态是活动的并且没有改变。