【问题标题】:How to determine whether Stripe webhook 'invoice.payment_failed' has been called from Stripe action or user action?如何确定是否已从 Stripe 操作或用户操作调用了 Stripe webhook 'invoice.payment_failed'?
【发布时间】:2019-10-25 13:51:07
【问题描述】:

我有一个用于 invoice.payment_failed 的 Stripe 事件的 webhook。每当客户为发票付款失败时,都会触发此 Webhook。

例如,如果用户资金不足,则可以每月多次调用 webhook。

如果用户在当月的付款尝试失败,我的应用程序允许用户登录到他们的帐户并启动手动尝试支付发票。它是通过以下调用启动的:

stripe.invoices.pay(invoiceId);

文档:https://stripe.com/docs/api/invoices/pay

上述方法也调用了invoice.payment_failed webhook。据我所知,无法判断 webhook 是由 Stripe 内部操作(例如支付重试)还是手动 API 操作(例如我上面的调用)启动的。

我比较了两种调用之间的事件对象,它们是相同的。还有其他方法可以确定触发 webhook 的原因吗?

【问题讨论】:

  • 我很好奇这里的用例是什么。想知道当您收到 webhook 时是否有一个内部计数器可以跟踪,如果用户采取了行动,您就重置该计数器...
  • @w1zeman1p - 几乎!如果从 Stripe 内部操作调用,我的应用程序会记录 invoice.payment_failed webhook。如果 webhook 是由用户启动的,我不希望更改计数。
  • @Fizzix 你有没有为这个问题找到可行的解决方案?我遇到了完全相同的问题。我想从 invoice.payment_failed webhook 向用户发送一封电子邮件,但如果用户在卡拒绝时手动支付发票,我不想这样做。

标签: javascript node.js stripe-payments webhooks


【解决方案1】:

在调用stripe.invoices.pay(invoiceId) 之前,您可以在metadata 字段中添加一些内容以便稍后识别发票:https://stripe.com/docs/api/invoices/update#update_invoice-metadata

【讨论】:

  • 不理想,因为它需要在 API 调用之前调用更新发票的元数据,然后在 webhook 中识别元数据后再次删除元数据。
【解决方案2】:

解决此问题的一种简单方法是代理由 Stripe 内部操作发起的 webhook 请求。您可以使用免费的 webhook 路由工具,例如 Pipedream(或同等工具)并将字段附加到请求中。

首先,创建一个端点来代理 webhook

二、处理事件:

{
      "id": "in_1DGXg2BSZsoltGfCP90zepqA",
      "object": "invoice",
      "account_country": "US",
      "account_name": null,
      "amount_due": 999,
.... 

三、添加标识符Stripe内部动作:

$event.body.identifier = 'internal_action'

然后将数据路由到应用程序中的端点。

这是一个使用此流程的示例管道 -- https://urlzs.com/nGd1a

【讨论】:

    【解决方案3】:

    在遇到同样的问题后,我想出了如何区分 invoice.payment_failed webhook 事件与手动和自动尝试的区别。

    查看发票对象上的尝试计数字段,它只会在自动重试时增加,而不是在手动 API 调用时增加,例如:stripe.invoices.pay(invoiceId)

    https://stripe.com/docs/api/invoices/object#invoice_object-attempt_count

    这在我的 webhook 端点中的工作方式是查找包含属性 user.subscription.attemptCount 的 userRecord,并将其与 webhook 有效负载中的尝试计数进行比较。

    该属性的文档如下:

    从这个角度来看,为此发票进行的付款尝试次数 付款重试计划。任何付款尝试都算作第一次 尝试,随后只有自动重试会增加尝试 数数。换句话说,第一次尝试后的人工付款尝试 不影响重试计划。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-04
      • 2020-06-21
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      相关资源
      最近更新 更多