Skip to content

Instantly share code, notes, and snippets.

@PaulAsaf2
Created July 16, 2024 12:46
Show Gist options
  • Save PaulAsaf2/61fd01af152bb23845603a086304c17e to your computer and use it in GitHub Desktop.
Save PaulAsaf2/61fd01af152bb23845603a086304c17e to your computer and use it in GitHub Desktop.
Валидация initData передаваемая из Telegram Mini App [PHP]
<?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