Как проверить подпись мини-приложения в телеграм на сервере?

По документации телеграм: 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';
}


Запрос из приложения:
$.post( "check", {"data":window.Telegram.WebApp.initData, "hash": window.Telegram.WebApp.initDataUnsafe.hash}, function( data ) {
    alert(data);
});


Хеши при проверке не совпадают. Что не учтено при проверке подписи?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
thewind
@thewind
php программист, front / backend developer
Вот здесь рабочий пример кода https://github.com/OxMohsen/validating-data/blob/m... - вы можете просто переписать более красиво.
В качестве начального аргумента нужно использовать уже query-строку от телеграма, а не POST данные по отдельности. Вот тут она описана https://core.telegram.org/bots/webapps#initializin... как initData
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
30 апр. 2024, в 16:35
5000 руб./за проект
30 апр. 2024, в 16:03
2500 руб./за проект