песочница — подпись hmac PHP без gocardless не совпадает

Я работаю с безголовыми хуками, и я застрял в проверке подписи 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 возвращающим raw и кодировать его в base64 … но безуспешно.

Так что тут не так? Может быть, подписи не работают в среде песочницы? Кто-нибудь имел дело с этим?

Заранее спасибо!

1

Решение

Наконец я нашел проблему, в панели песочницы в goocardless они показывают запрос unminified , так что длина другая, просто уменьшите ее, и вы сможете проверить! а теперь подписи совпадений!

2

Другие решения

Мы обновили нашу документацию для разработчиков, и вы можете найти пример проверки подписи webhook на https://developer.gocardless.com/getting-started/api/staying-up-to-date-with-webhooks/?lang=php#building-a-webhook-handler

Вы хотите сделать что-то вроде

<?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");
}
1

По вопросам рекламы [email protected]