gocardless PHP hmac签名不匹配

gocardless PHP hmac签名不匹配,php,sandbox,signature,hmac,gocardless,Php,Sandbox,Signature,Hmac,Gocardless,我正在使用gocardless钩子,我一直在用沙盒环境验证hmac签名 所以我在sandbox中生成了webhook测试,它在发送时向我提供了请求主体和头 据我所知,我必须获得请求主体并生成一个带有密钥的散列,并将其与webhook签名头散列进行比较(听起来并不复杂) 所以我使用postman在本地环境中复制它,附加相同的标题和相同的正文,但签名从不匹配 以下是我尝试过的: $signature = hash_hmac('sha256',$request->getContent(), '

我正在使用gocardless钩子,我一直在用沙盒环境验证hmac签名

所以我在sandbox中生成了webhook测试,它在发送时向我提供了请求主体和头

据我所知,我必须获得请求主体并生成一个带有密钥的散列,并将其与webhook签名头散列进行比较(听起来并不复杂)

所以我使用postman在本地环境中复制它,附加相同的标题和相同的正文,但签名从不匹配

以下是我尝试过的:

 $signature = hash_hmac('sha256',$request->getContent(), 'secret');
注意,我使用的是laravel框架,所以我的第一个想法是,框架可能在内部操纵请求,所以我尝试了以下方法:

 $request_data = file_get_contents('php://input');
 $signature = hash_hmac('sha256',$request_data, 'secret');
但仍然不匹配,我注意到有很多新的线条,也许这可以修改结果,所以我清理了它

 $request_data = str_replace(array('.', ' ', "\n", "\t", "\r"), '', $request_data);
但仍然不匹配,而且我尝试用utf8转换身体数据,让hmac返回原始数据并用base64编码。。。但是没有成功

那么这里有什么问题?也许签名在沙盒环境中不起作用?有人处理过吗


谢谢,这是事先准备好的

最后我发现了这个问题,在goocardless的沙盒面板中,他们显示了请求未声明的,因此长度不同,只需缩小它,您就可以进行测试了!现在签名匹配

我们已经更新了开发人员文档,您可以在

你想做点什么

<?php
// We recommend storing your webhook endpoint secret in an environment variable
// for security, but you could include it as a string directly in your code
$token = getenv("GC_WEBHOOK_SECRET");

$raw_payload = file_get_contents('php://input');

$headers = getallheaders();
$provided_signature = $headers["Webhook-Signature"];

$calculated_signature = hash_hmac("sha256", $raw_payload, $token);

if ($provided_signature == $calculated_signature) {
  // Process the events

  header("HTTP/1.1 200 OK");
} else {
  header("HTTP/1.1 498 Invalid Token");
}

你能澄清一下你所说的未统一是什么意思吗?也许有一个例子会有用。我将goocardless webhook sent对象复制粘贴到postman,并将其发送到我的端点以模拟接收webhook,在GC面板测试中,webhook响应显示为ident(出于更好的阅读目的),签名不匹配,因为长度不同,他们发送缩小的请求意味着没有空格!明白了,谢谢。我以为你是说也有断线之类的事。但是知道这里不应该有空白是很有帮助的。欢迎!我知道这听起来很傻。。。但我花了几个小时才意识到出了什么问题!