неправильно вычисляется secret_key, т.к. согласно документации он тоже должен быть чем-то вроде
hash_hmac('sha256', BOT_TOKEN, 'WebAppData', true);
рабочий вариант:
// $input — то, что приходит от телеги строкой
parse_str($input, $initData);
$data = [];
foreach ($initData as $name => $item) {
if ($name === 'hash') continue;
$data[] = $name . '=' . $item;
}
sort($data);
$hashKey = hash_hmac('sha256', BOT_TOKEN, 'WebAppData', true);
$hash = hash_hmac('sha256', implode("\n", $data), $hashKey);
echo $hash !== $initData['hash'] ? 'BAD' : 'OK';