Created
July 16, 2024 12:46
-
-
Save PaulAsaf2/61fd01af152bb23845603a086304c17e to your computer and use it in GitHub Desktop.
Валидация initData передаваемая из Telegram Mini App [PHP]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Разрешаем CORS | |
header('Access-Control-Allow-Origin: *'); | |
header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); | |
header('Access-Control-Allow-Headers: Content-Type'); | |
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { | |
header('HTTP/1.1 200 OK'); | |
exit(); | |
} | |
// Получаем данные из тела запроса | |
$inputJSON = file_get_contents('php://input'); | |
$input = json_decode($inputJSON, true); | |
if (isset($input['initData'])) { | |
$initData = $input['initData']; | |
// Парсим initData | |
parse_str($initData, $parsedData); | |
// Извлекаем hash | |
$hash = $parsedData['hash']; | |
unset($parsedData['hash']); // Удаляем hash из массива данных | |
// Создаем строку проверки данных | |
ksort($parsedData); // Сортируем массив по ключам | |
$dataCheckString = ''; | |
foreach ($parsedData as $key => $value) { | |
$dataCheckString .= $key . '=' . $value . "\n"; | |
} | |
$dataCheckString = rtrim($dataCheckString, "\n"); // Удаляем последний символ новой строки | |
// Создаем секретный ключ | |
$botToken = 'YOUR_BOT_TOKEN'; // Замените на ваш токен бота | |
$secretKey = hash_hmac('sha256', $botToken, 'WebAppData', true); | |
// Вычисляем HMAC-SHA-256 подпись для data-check-string | |
$hmac = hash_hmac('sha256', $dataCheckString, $secretKey); | |
// Проверяем подпись | |
if (hash_equals($hmac, $hash)) { | |
// Извлекаем данные пользователя | |
$userData = json_decode($parsedData['user'], true); | |
// Возвращаем данные пользователя | |
header('Content-Type: application/json'); | |
echo json_encode([ | |
'status' => 'success', | |
'message' => 'Data is valid', | |
'user' => $userData | |
]); | |
} else { | |
header('Content-Type: application/json'); | |
echo json_encode(['status' => 'error', 'message' => 'Data is invalid']); | |
} | |
} else { | |
header('Content-Type: application/json'); | |
echo json_encode(['error' => 'initData not received'], JSON_PRETTY_PRINT); | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment