и с этим кодом выдаёт "Data is NOT from Telegram". Т.к $hash и $check_hash разные
P.S
Я и через Javascript подготавливал $data_check_string и через php потом этим способом (думал может ошибка в подготовке строки)
$data_check_arr = [];
foreach ($auth_data as $key => $value) {
$data_check_arr[] = $key . '=' . $value;
}
sort($data_check_arr);
$data_check_string = implode("\n", $data_check_arr);
и "true" убирал в конце hash_hmac('sha256', BOT_TOKEN, 'WebAppData', true);
Нашел рабочий код, может кому пригодится
<?php
$bot_token = '0123456789:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$data_check_string = 'XXX'; // get from Telegram.WebAppData
$data_check_arr = explode('&', rawurldecode($data_check_string));
$needle = 'hash=';
$check_hash = FALSE;
foreach($data_check_arr AS &$val){
if(substr($val, 0, strlen($needle)) === $needle){
$check_hash = substr_replace($val, '', 0, strlen($needle));
$val = NULL;
}
}
$data_check_arr = array_filter($data_check_arr);
sort($data_check_arr);
$data_check_string = implode("\n", $data_check_arr);
$secret_key = hash_hmac('sha256', $bot_token, "WebAppData", true);
$hash = bin2hex(hash_hmac('sha256', $data_check_string, $secret_key, true) );
if(strcmp($hash, $check_hash) === 0){
print('ok');
} else {
print('fail');
}