我有一个问题与Stripe Webhooks,特别是与payment_intent。处理事件。在我要维护的旧应用中我们使用了3种支付方式。其中之一是SOFORT付款。这种付款方式的主要区别在于,您应该等待银行的响应几天,然后从Stripe Webhook获得付款成功响应。但是我们的应用程序要求我们在客户付款时立即填写客户余额。SOFORT是值得信赖的,我们从未遇到过交易在处理过程中被取消的情况。
但是2天前我面临一个新的问题,当stripe创建了两个payment_intent。以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中看到的。处理事件我只对状态为STARTED(所有订单的初始)的SOFORT付款方式执行它。
据我所知,在我的例子中,我正在监听两个并行处理事件。我说的对吗?有什么办法可以解决这个问题吗?我知道,在付款尚未成功的情况下操纵余额可能是一种不好的做法,但这是客户的主要要求。向大家致以最诚挚的问候。
Stripe webhook可能会重发事件。根据最佳实践,您可以考虑记录已经收到的事件。
https://stripe.com/docs/webhooks/best-practices重复事件
Webhook端点可能偶尔会多次收到相同的事件。我们建议您通过使您的事件处理幂等来防止重复的事件收据。这样做的一种方法是记录您已经处理的事件,然后不处理已经记录的事件。
虽然不太可能,但可能会发送相同事件的多个副本,因此您需要使您的webhook处理代码幂等,以便正确处理。