Stripe webhook,当支付的产品不是订阅而是一次性付款时,我如何才能收到 PRICE 项目?

Posted

技术标签:

【中文标题】Stripe webhook,当支付的产品不是订阅而是一次性付款时,我如何才能收到 PRICE 项目?【英文标题】:Stripe webhooks, how can I receive the PRICE item when the product paid for is not a subscription but a one-time payment? 【发布时间】:2021-04-23 04:40:17 【问题描述】:

我在 Stripe 有 1 个产品,有 2 个价格

第一个价格是定期订阅 第二个价格是一次性付款

我使用redirectToCheckout处理这两个,第一个使用mode: subscription,第二个使用mode: payment,两者都在lineItems中指示各自的价格代码

然后,当 Stripe 完成付款后,我会将 webhook 发送到我的 php 后端

对于第一个项目,我得到事件类型 customer.subscription.created,并且在该 webhook 中发送的信息包括价格代码

我需要此价格代码以确保用户已为该特定price 商品付款

问题在于第二个项目,我已经能够识别出 4 个在付款后通过 webhooks 发送的事件:

customer.created charge.succeeded payment_intent.succeeded checkout.session.completed

而且它们都不包含price 用户支付的产品信息

也许我可以在 fetch 操作中向 stripe 询问该信息,但是...不可能没有任何包含此基本 (?) 信息的 webhook

还是我理解错了?

编辑:

可能答案是this one,因此默认情况下 webhook (checkout.session.completed) 不包含此信息,并且确实必须在第二步中检索它

【问题讨论】:

对于定期订阅,您可能希望收听invoice.paid 事件,其中将包括invoice.lines.data[].price 下的价格ID - 此信息应该在事件中随时可用。对于一次性付款,您需要监听 customer.session.completed 事件并检索展开 line_items 的会话。这是一个示例:stripe.com/docs/expand#includable-properties。价格将低于line_items.data.price。我还推荐跟踪活动订阅者的文档:stripe.com/docs/billing/subscriptions/webhooks#tracking 谢谢,确实第一个链接解释得很好,也许你想把它格式化为一个 aswer(或者我可以做到)。也就是说,您在订阅 webhook 中默认获得的内容与一次性付款 webhook 中的默认值不一致,也许在未来的 api 更新条带决定将价格作为默认信息添加到任何地方 【参考方案1】:

正如@ttmarek 所说,答案在这里https://stripe.com/docs/expand#includable-properties 表明如果使用single payment,则必须检索此信息

如果使用subscription,则默认包含此信息,无需启动另一个请求

避免这种额外请求的替代方法是使用 amountcharged(大多数 webhook 附带),前提是您可以从该金额中确定您的价格

【讨论】:

以上是关于Stripe webhook,当支付的产品不是订阅而是一次性付款时,我如何才能收到 PRICE 项目?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 symfony 5 中实现条带 webhook?

Stripe Webhook - 设计模式

多次触发 Stripe invoice.payment_succeeded webhook

将 Stripe 结帐会话与订阅 webhook 关联

使用 Stripe Firebase 扩展 Webhook 运行订阅付款未触发