【发布时间】:2020-08-07 18:56:48
【问题描述】:
问题是如果我多次触发同一个事件,我会得到不同的结果。
我打开了三个终端:
- 聆听使用:
listen --forward-to localhost:8888/my-endpoint.php
- 触发使用
stripe trigger + event
(例如,条带触发 payment_intent.succeeded)
- 记录来自本地主机的错误
疑难解答
我也可以通过运行 Stripe 结帐来触发。结帐有效,但终端中的结果与描述的相似。
-
我还在 xdebug 监听时运行了触发器,并且可以看到代码以预期的确切方式逐步执行(即为正文分配简单的文本响应并调用 200/400 代码)。
重要提示
下面的截图显示了日志(左)、监听(右上)和事件触发(右下)。
(第 1 次和第 4 次尝试有效。第 2 次和第 3 次无效。它们不包括日志或:
2020-04-24 16:17:16 --> payment_intent.succeeded [evt_1GbMikFOnngxtrI1EfZyfaNo]
2020-04-24 16:17:16 <-- [200] POST http://localhost:8888/scripts/stripe/webhook-endpoint.php [evt_1GbMikFOnngxtrI1EfZyfaNo]
请注意,您可以在右上角看到不同事件的时间码。
而且日志只会在第一次触发时更新一次。
另一个有趣的事情是,有时响应会出现在 Stripe 仪表板中,有时却不会。
有什么想法吗?
Webhooks 代码(签名和 api 密钥在上面设置,但在这里隐藏)
$payload = @file_get_contents('php://input'); //get json POST data stripe sends
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = null;
try {
$event = \Stripe\Webhook::constructEvent(
$payload, $sig_header, $endpoint_secret, //get data
);
} catch(\UnexpectedValueException $e) {
// Invalid payload
printf("Invalid payload");
http_response_code(400);
exit();
} catch(\Stripe\Exception\SignatureVerificationException $e) {
// Invalid signature
printf("Invalid signature.");
http_response_code(400);
exit();
}
// Handle the event(s)
switch ($event->type) {
case 'checkout.session.completed':
$session = $event->data->object;
printf("Checkout Session Completed");
http_response_code(200);
break;
case 'payment_intent.succeeded':
$paymentIntent = $event->data->object;
$intent = $event->data->object;
printf("Payment Intent Succeeded: %s", $intent->id);
http_response_code(200);
error_log( json_encode( $intent, JSON_PRETTY_PRINT ) );
break;
case 'payment_intent.payment_failed':
$paymentMethod = $event->data->object;
$intent = $event->data->object;
$error_message = $intent->last_payment_error ? $intent->last_payment_error->message : "";
printf("Failed: %s, %s", $intent->id, $error_message);
http_response_code(200);
break;
case 'payment_intent.processing':
printf("Payment Intent Processing: %s", $intent->id);
http_response_code(200);
break;
case 'payment_intent.canceled':
printf("Payment Intent canceled: %s", $intent->id);
http_response_code(200);
break;
default:
http_response_code(400);
exit();
}
http_response_code(200);
return false;
【问题讨论】:
标签: php webhooks stripe-payments