Почему Тинькофф-эквайринг АПИ не удаётся проверить токен
Когда ваш сайт получает нотификацию от Тинькофф-банка, он конкатенирует все параметры запроса и высчитывает sha256-хеш. Алгоритм простой, но есть несколько нюансов:
- Нужно удалить из входящих параметров поле
Token
; - Нужно добавить параметр
Password
, который содержит пароль от терминала (указан в личном кабинете); - Самое важное! Поле
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);
}
Поделиться
Поделиться
Отправить
Твитнуть
Вотсапнуть
У тебя в коде функция array_except, она не нативная, а из Laravel
Да, всё так. Можно сделать так:
$data = array_diff ($data, $data['Token']);
Коллега, приношу вам глубочайшее уважение!)
Полдня не мог понять почему хэш не сходится, а все из-за 'Success'.
Чуть с ума не сошел_