Почему Тинькофф-эквайринг АПИ не удаётся проверить токен

14 марта 2019

Когда ваш сайт получает нотификацию от Тинькофф-банка, он конкатенирует все параметры запроса и высчитывает sha256-хеш. Алгоритм простой, но есть несколько нюансов:

  1. Нужно удалить из входящих параметров поле Token;
  2. Нужно добавить параметр Password, который содержит пароль от терминала (указан в личном кабинете);
  3. Самое важное! Поле Success нужно привести из boolean в строку «true» или «false», иначе при конкатенации PHP будет подставлять в строку 1 или 0, из-за чего сгенерированный вами токен не будет совпадать с пришедшим от банка.

Вот так выглядит функция генерации токена:

/**
 * @return string
 */
public function generateToken($data) : string
{
    $data = array_except($data, 'Token');
    $data = array_merge($data, ['Password' => config('tinkoff.secretKey')]);

    // Success field to string
    $data['Success'] = $data['Success'] ? 'true' : 'false';

    ksort($data);
    $data = implode(array_values($data));

    return hash('sha256', $data);
}

Комментарии 3
  1. Сергей 5 июля 2019

    У тебя в коде функция array_except, она не нативная, а из Laravel

  2. Да, всё так. Можно сделать так: $data = array_diff ($data, $data['Token']);

  3. Сергей 12 мая 2023

    Коллега, приношу вам глубочайшее уважение!)
    Полдня не мог понять почему хэш не сходится, а все из-за 'Success'.
    Чуть с ума не сошел_

Добавить комментарий