问题是,如果我多次触发同一个事件,我得到的结果是不同的。
我有 三端 开。
listen --forward-to localhost:8888/my-endpoint.php
stripe trigger + event
(例如:stripe trigger payment_intent.successed)
疑难解答
我也可以通过运行Stripe结账来触发。结账工作,但终端的结果与描述的类似。
我还在xdebug监听的时候运行了触发器,可以看到代码按照预期的方式运行(即为主体分配简单的文本响应并调用200400代码)。
重要说明
下面的截图显示了日志(左)、监听(右上)和事件触发(右下)。
第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;
我希望我的理解是正确的,如果我在这里偏离了主题,我道歉。
我认为这里的问题是,使用 stripe trigger payment_intent.succeeded
最终创建3个事件。
payment_intent.created
charge.succeeded
payment_intent.succeeded
似乎case语句没有针对前两个事件类型的条款 所以它们默认为400s。
根据你想做的事情,你可以扩展case语句来处理这些事件。另外,也许这与你的发现有关,但事件没有一个保证的排序,这是正常的行为,也是你在构建系统时必须记住的[0]。希望这对你有帮助
[0] https:/stripe.comdocswebhooksbest-practices#event-ordering。