【问题标题】:Stripe Webhooks. Dealing with multiple webhook events条纹 Webhook。处理多个 webhook 事件
【发布时间】:2021-06-05 01:31:12
【问题描述】:

我遇到了 Stripe Webhooks 的问题,尤其是 payment_intent.processing 事件。 在我必须维护的旧应用程序中,我们使用 3 种付款方式。其中之一是 SOFORT 付款。这种付款方式的主要区别在于您应该等待银行响应几天,然后从 Stripe Webhook 获得 Payment Succeeded 响应。但是我们的应用程序要求我们在客户付款的那一刻填写客户余额。 SOFORT 值得信赖,我们从未遇到过交易在处理过程中被取消的情况。

但是 2 天前,当 stripe 创建两个 payment_intent.processing 事件时,我遇到了一个新问题,间隔为 1 秒,并且客户在其余额中获得了 2 次积分。 这是一段代码来解释我的意思:

$paymentIntent = $event->data->object;
$order = Db_Orders::getOrderPaymentIntentId($paymentIntent->id);
switch ($event->type) {
case 'payment_intent.processing':
    if ($order['wlo_payment_type'] == PAYMENT_METHOD_SOFORT && $order['wlo_status'] == W_LEADS_ORDER_STATUS_STARTED) Utils::activateOrderOffers($order['id']);
    $orderObj = new Db_LeadOrder();
    $orderObj->id = $order['id'];
    $orderObj->wlo_status = W_LEADS_ORDER_STATUS_PENDING;
    $orderObj->save();
    break;
case 'payment_intent.succeeded':
    if ($order['wlo_payment_type'] != PAYMENT_METHOD_SOFORT && $order['wlo_status'] != W_LEADS_ORDER_STATUS_SUCCESS) Utils::activateOrderOffers($order['id']);
    $orderObj = new Db_LeadOrder();
    $orderObj->id = $order['id'];
    $orderObj->wlo_response_date = Utils::formatDateDb(time());
    $orderObj->wlo_status = W_LEADS_ORDER_STATUS_SUCCESS;
    $orderObj->save();
    break;
  default:
    echo 'Received unknown event type ' . $event->type;

activateOrderOffers 函数中,我使用客户余额进行所有操作。正如您在 payment_intent.processing 事件中看到的那样,我仅针对具有 STARTED(所有订单的初始)状态的 SOFORT 付款方式执行它。

据我了解,就我而言,我正在监听两个并行处理事件。我是对的,有什么想法可以解决这个问题吗?我知道,在付款尚未成功时操纵余额可能是一种不好的做法,但这是客户的主要要求。 向大家致以最诚挚的问候。

【问题讨论】:

    标签: php stripe-payments


    【解决方案1】:

    Stripe webhook 可能会重新发送事件。根据最佳实践,您可以考虑记录已收到的事件。

    https://stripe.com/docs/webhooks/best-practices#duplicate-events

    Webhook 端点偶尔可能会多次收到相同的事件。我们建议您通过使事件处理具有幂等性来防止重复的事件接收。一种方法是记录您已处理的事件,然后不处理已记录的事件。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 很好,@NicoHaase!更新了我的答案。
    • 谢谢。这正是我正在寻找的。尽管 Stripe 支持人员确认自己接收到多个处理事件,这很奇怪。
    • 没问题。值得查看仪表板中的 Webhooks 部分,以了解事件发送了多少次。
    【解决方案2】:

    虽然不太可能,但可能会发送同一事件的多个副本,因此您需要make your webhook handling code idempotent 才能正确处理。

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 2015-02-04
      • 2020-05-16
      • 2016-03-07
      • 2016-09-12
      • 1970-01-01
      • 2012-03-26
      • 2015-10-07
      • 2013-12-02
      相关资源
      最近更新 更多