Вычисление подписи уведомления
Сформируйте строку для вычисления подписи:
Извлеките параметры уведомления.
Удалите параметр sign — он не участвует в формировании подписи.
Отсортируйте оставшиеся параметры по алфавиту (A-Z).
Примените URL-кодирование к значениям каждого параметра (в кодировке UTF-8, RFC 3986).
Объедините параметры в строку формата ключ=значение, разделяя их символом &. Пустые значения оставьте как key= (без пробелов).
Вычислите HMAC-SHA256 от полученной строки, используя секретный ключ из настроек HTTP-уведомлений. Представьте результат в HEX (нижний регистр).
<?php
$notification_secret = "1234567890"; // Секретный код
$sign = isset($_POST['sign']) ? trim($_POST['sign']) : ''; // HMAC-SHA256 подпись
if($sign == '') {
die("Hacking attempt");
exit;
}
$params = $_POST; // забираем ВСЕ параметры
unset($params['sign']); // удаляем sign (он не участвует в подписи)
ksort($params); // сортировка A-Z
$hash_arr = array(); // формируем строку
foreach($params as $key => $value) {
$hash_arr[] = $key . '=' . rawurlencode($value);
}
$hash = implode('&', $hash_arr);
// вычисляем подпись
$signature = hash_hmac('sha256', $hash, $notification_secret);
// проверяем подлинность запроса
if(hash_equals($signature, $sign)) {
$hach_ok = 'YES'; // успешно
} else {
$hach_ok = 'NO'; // ошибка
}
// =============================================================================================== //
// ЛОГ
// =============================================================================================== //
$log = '';
foreach ($_POST as $name => $line) {
$log .= $name .': '. $line ."\n";
}
$logname = "/tmp/test_ya.log";
if ($handle = fopen($logname, 'a+')) {
fwrite(
$handle,
date('d.m.Y H:i:s') . " | " . $_SERVER['SCRIPT_FILENAME'] . "\n" .
$hash . " --> " . $signature . " == " . $sign . "\n" .
$hach_ok . "\n" .
$log . "\n\n"
);
fclose($handle);
}
// 2026-05-29 Plutos
?>
https://yoomoney.ru/docs/wallet/using-api/notifica...