Laravel Cashier (Stripe) - Checkout - invoice.paid 和 invoice.payment_failed 事件网络钩子

问题描述

在使用 Checkout Subscriptions 时,Stripe 文档指出要监控的最少事件类型是:

  • checkout.session.completed - 当您收到 checkout.session.completed 事件时,您可以配置订阅
  • invoice.paid - 在付款成功时发送每个计费间隔。
  • invoice.payment_Failed - 如果您客户的付款方式有问题,则在每个计费间隔发送。

当您收到 checkout.session.completed 事件时,您可以配置订阅。当您收到invoice.paid 事件时,继续每月进行配置(如果按月计费)。如果您收到 invoice.payment_Failed 事件,请通知您的客户并将他们发送到客户门户以更新他们的付款方式。

https://stripe.com/docs/billing/subscriptions/checkout#provision-and-monitor

然而,我仍然对 invoice.paidinvoice.payment_Failed 事件以及 Laravel Cashier 感到困惑:

我需要为这两个事件制作处理程序吗? 我问这个是因为收银员已经处理了 customer.subscription.updatedcustomer.subscription.deleted 事件,如果我理解得很好(如果我错了,请纠正我):

  • 如果下个月付款(订阅续订)成功,那么我将收到 customer.subscription.updated 并且订阅将继续为 'active'$user->subscribed('default') 将为 {{1} }(在true表中subscriptions将保留stripe_status)。
  • 但是,如果下个月付款失败(例如,由于资金不足) - 那么 active 事件将被触发/发送,并且 Cashier 将更改订阅状态(到 customer.subscription.updated 或 {{ 1}}?)和 canceled 将是 incomplete,对吗?

如果是这样,那么我认为没有理由为 $user->subscribed('default')false 事件制作处理程序。我会知道付款(订阅续订)是否成功,因为 invoice.paid 事件将被触发/发送,收银员将更新 invoice.payment_Failed 表中的customer.subscription.updated

或者我错了,它不会那样工作?如果我不太明白,那么我猜 stripe_status 事件根本不会被触发/发送,或者它会但它不会包含付款(续订)成功与否的信息(如果失败,那么在 subscriptions 事件的处理程序方法中,我必须将 customer.subscription.updated(在 invoice.payment_Failed 表中)更新为 stripe_statussubscriptions

解决方法

发票付款失败后订阅是否被删除取决于您的订阅设置:https://dashboard.stripe.com/settings/billing/automatic

因此,可以获得 invoice.payment_failed 事件而不取消订阅。

由于这些事件非常不同,因此最安全的做法是听取所有这些事件并进行相应处理。 customer.subscription.updatedinvoice.paid 也非常不同,前者会在对订阅进行任何更新时触发(例如,如果您更新元数据),而后者只会在发票付款成功时触发。

这最终取决于您,但为了确保您不会错过任何重要事件,您应该考虑收听上述所有事件。