【问题标题】:Stripe manage subscription - invoice.paid and checkout.session.completedStripe 管理订阅 - invoice.paid 和 checkout.session.completed
【发布时间】:2021-08-25 19:44:26
【问题描述】:

我见过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.completed 和invoice.paid 都被解雇了。我了解以下情况可以完成会话

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

Stripe 文档说this:

要监控的最少事件类型:

EVENT NAME DESCRIPTION
checkout.session.completed Sent when a customer clicks the Pay or Subscribe button in Checkout, informing you of a new purchase.
invoice.paid Sent each billing interval when a payment succeeds.
invoice.payment_failed Sent each billing interval if there is an issue with your customer’s payment method.

在代码部分:

对于checkout.session.completed:

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

对于invoice.paid:

# 在继续付款时继续提供订阅。

然后我认为肯定有一种方法可以确定checkout.session.completed 和invoice.paid 会相互关联,但问题是checkout.session.completed 不包含任何Invoice id 和@987654349 @ 不包含创建它的 CheckoutSession 的 ID。

如何只为用户提供 1 个月的订阅,而不是 2 个月? Stripe 甚至会跟踪订阅的结束情况吗?

因为在tracking section here,它说:

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

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

【问题讨论】:

    标签: stripe-payments


    【解决方案1】:

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

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

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

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

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

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

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

    然后我认为肯定有一种方法可以确定checkout.session.completed 和invoice.paid 会相互关联,但问题是checkout.session.completed 不包含任何Invoice id 和@987654334 @ 不包含创建它的 CheckoutSession 的 id。

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


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

    【讨论】:

    • 这听起来我只需要customer.subscripton.updated,因为它处理续订、试用-> 活动、取消。一个对客户更友好的解决方案可能包括invoice.payment_failed 用于提前通知他们,但总体而言customer.subscription.updated 会基于此处理所有案例。但是后来我不明白为什么文档说“要监视的最小事件类型”或其含义。我可以在 webhook 中为 checkout.session.completed、invoice.paid 和 invoice.payment_failed 返回 400 状态代码吗?
    • invoice.paid 和 invoice.payment_failed 建议您在原始问题中链接到的文档中而不是 customer.subscription.updated ,因为前者的事件更具体且更易于处理。 customer.subscription.updated 触发的频率更高,原因也更多,因此您需要编写更多代码来检查更改的内容并确定要采取的操作(如果有)。
    猜你喜欢
    • 2021-08-22
    • 2021-02-24
    • 2022-12-13
    • 1970-01-01
    • 2016-10-18
    • 2017-07-03
    • 2017-12-27
    • 2017-03-04
    • 2017-08-20
    相关资源
    最近更新 更多