我正在使用 gocardless hooks ,并且我坚持使用沙盒环境验证 hmac 签名。
所以我在沙盒中生成了 webhook 测试,它给了我发送的请求正文和标头。
据我了解,我必须获取请求正文并使用密钥生成散列,并将其与 webhook 签名标头散列进行比较(听起来并不复杂)。
所以我使用邮递员在我的本地环境中复制它,附加相同的标题和相同的正文,但签名从不匹配。
这是我尝试过的:
$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 ......但没有成功。
那么这里有什么问题呢?也许签名在沙盒环境中不起作用?有人处理过吗?
提前致谢!