Несмотря на то, что следуют всем руководствам. Согласно официальной документации Telegram, строка проверки данных для входа в систему строится путем объединения всех полученных полей (кроме самого хэша), отсортированных в алфавитном порядке, причем каждая клавиша = пара, разделенная Newline (\ n) core.telegram.org. Что я и сделал.
Код: Выделить всё
{
"id": 785xxxxxx,
"first_name": "xxxxxxx",
"last_name": "xxxxxx",
"language_code": "en",
"allows_write_to_pm": true,
"photo_url": "https://t.me/i/userpic/320/abc123.svg",
"auth_date": "1750072455",
"hash": "a55cdfdexxxxxx"
}
< /code>
my java -проверка кода: < /p>
public static boolean isValid(Map authData, String botToken) {
String receivedHash = authData.get("hash");
authData.remove("hash");
// Step 1: Build data_check_string
Map sorted = new TreeMap(authData);
String dataCheckString = sorted.entrySet().stream()
.map(e -> e.getKey() + "=" + e.getValue())
.collect(Collectors.joining("\n"));
try {
// Step 2: Generate secret key (HMAC_SHA256 of bot token using "WebAppData")
Mac mac1 = Mac.getInstance("HmacSHA256");
mac1.init(new SecretKeySpec("WebAppData".getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
byte[] secretKey = mac1.doFinal(botToken.getBytes(StandardCharsets.UTF_8));
// Step 3: HMAC_SHA256 of dataCheckString using secretKey
Mac mac2 = Mac.getInstance("HmacSHA256");
mac2.init(new SecretKeySpec(secretKey, "HmacSHA256"));
byte[] hmac = mac2.doFinal(dataCheckString.getBytes(StandardCharsets.UTF_8));
String calculatedHash = bytesToHex(hmac);
System.out.println("DataCheckString: " + dataCheckString);
System.out.println("Expected Hash: " + receivedHash);
System.out.println("Calculated Hash: " + calculatedHash);
return calculatedHash.equalsIgnoreCase(receivedHash);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
< /code>
Что я пробовал: < /p>
не обеспечил дополнительных новых или пространственных символов в DataceckString < /p>
< /li>
Сопоставленная логика PHP (которая работает нормально) < /p>
< /li>
ase sha>
< /li>
Проверено одинаковое упорядочение ключей и форматирования значений < /p>
< /li>
< /ul>
Все еще лицом: < /p>
< /ul>
< /p>
< /ul>
< /p> < /p> < /li>
< /ul>
Mismatch between calculated hash and Telegram’s received hash for every input.
Кто -нибудь успешно проверял хэш из initdataunsafe в java (с Telegram WebApp)? Виджет?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... on-in-java