Stripe 管理订阅 - invoice.paid 和 checkout.session.completed

时间:2021-06-08 19:23:32

标签: stripe-payments

我见过this similar question,但它没有回答所提出的问题。

我无法理解如何管理重复订阅。

我做了一个测试,成功Stripe Checkout测试付款后触发了以下事件:

  • charge.succeeded
  • checkout.session.completed
  • payment_method.attached
  • invoice.created
  • customer.subscription.created
  • invoice.updated
  • customer.subscription.updated
  • invoice.finalized
  • invoice.paid

我的问题是 checkout.session.completedinvoice.paid 都被解雇了。我了解在以下情况下可以完成会话

  • 失败
  • 取消
  • 开始试用
  • 成功启动

Stripe 文档说 this

<块引用>

要监控的最少事件类型:

<头>
EVENT NAME DESCRIPTION
checkout.session.completed 当客户点击 Checkout 中的“支付”或“订阅”按钮时发送,通知您有新购买。
invoice.paid 在付款成功时发送每个计费间隔。
invoice.payment_failed 如果您客户的付款方式有问题,则发送每个计费间隔。

在代码部分:

<块引用>

对于checkout.session.completed

# 您应该提供订阅并将客户 ID 保存到您的数据库中。

对于invoice.paid

#随着付款的继续进行,继续提供订阅。

所以我认为肯定有一种方法可以识别 checkout.session.completedinvoice.paid 是否彼此相关,但问题是 checkout.session.completed 不包含任何 {{ 1}} id 并且 Invoice 不包含创建它的 invoice.paid 的 id。

如何让用户只订阅 1 个月,而不是 2 个月? CheckoutSession 甚至会跟踪订阅的结束时间吗?

因为在 tracking section here 中,它说:

<块引用>
  1. ...
  2. 您的网站收到一个 invoice.paid 事件。
  3. 您的网络钩子端点会找到刚刚为其付款的客户。
  4. 您的网络钩子端点将您数据库中客户的 current_period_end 时间戳更新为未来的适当日期(加上一两天的余地)。

因此,此页面完全忽略 Stripe 端点并仅依赖于 checkout.session.completed,据推测它可能只在会话完成后几个小时到达。 (我找不到这个链接。)

1 个答案:

答案 0 :(得分:0)

<块引用>

我的问题是 checkout.session.completedinvoice.paid 都被解雇了。我了解在以下情况下可以完成会话

  • 失败
  • 取消
  • 开始试用
  • 成功启动

这是不正确的。 checkout.session.completed 仅在结帐会话成功完成时触发。 The documentation in the API reference for checkout.session.completed 事件说:

<块引用>

在结帐会话成功完成时发生。

我注意到您在有关此事件的文档中提到了这句话:

<块引用>

当客户点击 Checkout 中的“支付”或“订阅”按钮时发送,通知您有新购买。

那里的关键词是“通知您有新购买”;此事件不会因未付款(即未进行购买)而触发。但是,它会在通过试用成功创建订阅后被触发。

<块引用>

所以我认为肯定有一种方法可以识别 checkout.session.completedinvoice.paid 是否彼此相关,但问题是 checkout.session.completed 不包含任何 {{ 1}} id 并且 Invoice 不包含创建它的 invoice.paid 的 id。

结帐会话将在 its subscription property 中指定关联的订阅。从那里您可以查看 Subscription's latest_invoice property 以获取最新的发票 ID。


要确定您是否应该提供您的客户订阅的任何商品或服务,您可能需要使用 the customer.subscription.updated event。这将为您提供有关 the status of the Subscription 更改的更新,您可以根据该 CheckoutSession 进行配置。例如,如果 statusstatustrialing,则授予他们访问权限,但如果是其他任何内容,则不授予他们访问权限。