我正在尝试将 Stripe 付款意向付款方式实施到我的应用程序中。到目前为止,付款已完成,但网络钩子给我提供了以下异常错误:
Stripe\Exception\SignatureVerificationException
No signatures found matching the expected signature for payload
这是我的代码设置:
public function handleWebhook(Request $request)
{
$sPayload = json_decode($request->getContent());
$sSignature = $request->header('Stripe-Signature');
$sWebhookSecret = env('STRIPE_WEBHOOK_SECRET');
$oPaymentIntentResponse = Webhook::constructEvent(
json_encode($sPayload), $sSignature, $sWebhookSecret
);
$this->processPaymentIntentFeedback($oPaymentIntentResponse);
return response()->json(['success' => true]);
}

这一切都使用实时网络钩子。 webhook 的图像  我从这本 wehbook 中获取了 stripe webhook 密钥。 我从同一个应用程序中获得的条带密钥和秘密。 所以钥匙应该都按顺序排列。已找到网络钩子并且付款已完成,唯一的问题是签名未经过验证。
Stripe\Exception\SignatureVerificationException
No signatures found matching the expected signature for payload
我的代码中的有效负载、签名和 Webhook 签名已正确交付,但它们似乎不匹配。可能出了什么问题?
Stripe 的
constructEvent
函数非常敏感,对原始 Event 内容中的空格的任何更改都会导致计算出的签名值发生变化,并导致签名未找到错误。我相信您解码然后重新编码请求的有效负载的方式。
我建议尝试将原始请求有效负载传递到
constructEvent
,而不是尝试使用已处理的值。
交换这个:
$oPaymentIntentResponse = Webhook::constructEvent(
json_encode($sPayload), $sSignature, $sWebhookSecret
);
对于:
$oPaymentIntentResponse = Webhook::constructEvent(
$request->getContent(), $sSignature, $sWebhookSecret
);
这更接近 Stripe 在其示例 Webhook 端点代码中推荐的内容: https://docs.stripe.com/webhooks/quickstart?lang=php