Stripe Webhooks - 我可以发送 200 以外的响应代码吗?

Posted

技术标签:

【中文标题】Stripe Webhooks - 我可以发送 200 以外的响应代码吗?【英文标题】:Stripe Webhooks - Can I send response codes other than 200? 【发布时间】:2022-01-10 11:33:52 【问题描述】:

我一直在检查 Stripe 文档,它建议我们尽快回复 200 代码“必须在我们在数据库中处理它之前”。

链接:https://stripe.com/docs/webhooks#acknowledge-events-immediately。

我有一些疑问:

    是否严格要求始终发送 Stripe 响应代码 200?

    在哪些情况下需要向 Stripe 发送另一个响应代码?像这些:https://stripe.com/docs/api/errors

    如果在将 200 代码发送到 Stripe 后,系统由于某种原因无法处理我的数据库中的事件、更新发票、订阅等...我可以用 402 响应来响应 Stripe,这样它将向我转发相同的事件,这是一个好习惯吗?

    如何让 Stripe 再次发送相同的事件?

    向 Stripe 发送 200 响应码后,Stripe 可以重试发送相同的事件吗?

【问题讨论】:

【参考方案1】:
    是的,好吧,至少有一个 2xx 的成功代码 当情况需要返回不同的状态代码(服务器错误、未找到端点等)时。正如文档所述,这应该只是谨慎的:“如果 Stripe 没有快速收到事件的 2xx 响应状态代码,我们会将事件标记为失败并停止尝试将其发送到您的端点。几天后,我们会通过电子邮件向您发送关于配置错误的端点,如果您还没有解决它,很快就会自动禁用它。” 在这种情况下,由您来处理问题**(见下文) 据我所知,你不能 没有

您的问题,尤其是最后 3 个问题,都围绕着 Stripe 通知您事件发生后您的失败问题。

**(更多以下部分)

从 Stripe 的角度来看,事件已经发生,并且是成功的。 webhook 是一个通知你的系统发生了什么,并且很可能有一个短暂的等待响应的超时时间(这就是他们要求快速 200 响应的原因)。 Stripe 不会像他们一次那样多次重新通知您同一事件,从 Stripe 的角度来看,多次将是多余的。

鉴于此,您应该对自己的应用程序的结构有所不同。

    Stripe 向您的 webhook 发送通知 您存储/保存/保留该通知并响应 Stripe 200 响应,我们收到了通知 - 谢谢! 此时,Stripe 已脱离循环。他们已经完成了处理付款(或其他)的工作并通知了您。 使用保存的通知,您可以继续做您需要做的事情。如果您需要执行的操作失败,您可以将步骤 2 中您自己存储的条目标记为失败,需要重试,但是您想处理它。无论哪种方式,Stripe 在所有这一切中的角色都是在第 2 步完成的,他们没有理由再参与其中。

【讨论】:

如果在我的数据库中保存通知时发生错误,我可以响应什么错误代码来再次向我发送相同的事件?响应 http_response_code (402);会好吗? 文档中说 Stripe 已经为 3xx、4xx 和 5xx 调用内置了重试,但它非常依赖细节。最好的假设是您将收到一次通知。有很多方法可以处理错误以尝试保存通知,您想要多深取决于您的风险级别。我认为从 Stripe 中保存一个已知实体应该是一个相对稳定的操作,但同样,这取决于您(消费者)来决定您的容错级别。

以上是关于Stripe Webhooks - 我可以发送 200 以外的响应代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Stripe checkout Webhooks 会将 customer_email 发送为 null?

在本地主机开发期间,Dj-Stripe webhooks

有没有办法从 Stripe API webhooks 获得响应?

Stripe Webhooks:Invoice.paid 与 Checkout.Session.Completed

Stripe 验证 web-hook 签名 HMAC sha254 HAPI.js

Stripe Webhook - 设计模式