Как проверить подпись мини-приложения в телеграм на сервере?
По документации телеграм: https://core.telegram.org/bots/webapps#validating-...
Получится вот такой код (PHP):
$bot_token = ‘ТОКЕН_БОТА'; $data = urldecode($_POST['data']); $hash = $_POST['hash']; $data = explode("&", $data); $new_data = array(); foreach($data as $value) { $value_array = explode("=", $value); if($value_array[0] == 'hash') {continue;} $new_data += array($value_array[0] => $value_array[1]); } ksort($new_data); $array_data = array(); foreach($new_data as $k => $v) { array_push($array_data, "$k=$v"); } $array_data = implode('n', $array_data); $secret_key = hash_hmac('sha256', $bot_token, "WebAppData"); if(hash_hmac('sha256', $array_data, $secret_key) == $hash) { echo 'ok!'; } else { echo ‘error'; } |
$bot_token = ‘ТОКЕН_БОТА'; $data = urldecode($_POST['data']); $hash = $_POST['hash']; $data = explode("&", $data); $new_data = array(); foreach($data as $value) { $value_array = explode("=", $value); if($value_array[0] == 'hash') {continue;} $new_data += array($value_array[0] => $value_array[1]); } ksort($new_data); $array_data = array(); foreach($new_data as $k => $v) { array_push($array_data, "$k=$v"); } $array_data = implode('n', $array_data); $secret_key = hash_hmac('sha256', $bot_token, "WebAppData"); if(hash_hmac('sha256', $array_data, $secret_key) == $hash) { echo 'ok!'; } else { echo ‘error'; }
Запрос из приложения:
$.post( "check", {"data":window.Telegram.WebApp.initData, "hash": window.Telegram.WebApp.initDataUnsafe.hash}, function( data ) { alert(data); }); |
$.post( "check", {"data":window.Telegram.WebApp.initData, "hash": window.Telegram.WebApp.initDataUnsafe.hash}, function( data ) { alert(data); });
Хеши при проверке не совпадают. Что не учтено при проверке подписи?
Дополнительно:
Не вникал, но код галимый, его бы упростить до строк 3-4. Начать хотя бы с этого: https://www.php.net/manual/ru/function.parse-str.php
echo md5("testn"); echo md5('testn'); |
echo md5("testn"); echo md5('testn');
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для проверки подписи мини-приложения в телеграм на сервере, вам следует выполнить следующие шаги:
1. Получить данные, переданные от телеграм в ваш сервер после запроса от пользователя. Обычно это JSON объект с информацией о запросе.
2. Извлечь из полученных данных подпись и само сообщение, которое было подписано.
3. Получить ваш секретный ключ, который был использован для подписи сообщения.
4. Вычислить хеш сообщения с использованием HMAC алгоритма с использованием вашего секретного ключа.
5. Сравнить вычисленный хеш с полученной подписью. Если они совпадают, значит подпись верна.
Пример кода на PHP для проверки подписи:
$data = file_get_contents('php://input'); $data = json_decode($data, true); $signature = isset($_SERVER['HTTP_X_TELEGRAM_AUTH_SIGNATURE']) ? $_SERVER['HTTP_X_TELEGRAM_AUTH_SIGNATURE'] : ''; if ($signature !== hash_hmac('sha256', $data['body'], $your_secret_key)) { // Подпись не верна die('Invalid signature'); } // Подпись верна, обрабатываем запрос
Не забудьте заменить `$your_secret_key` на ваш секретный ключ, который был использован для подписи сообщения. Таким образом, вы сможете проверить подпись мини-приложения в телеграм на вашем сервере.