Чистый код Короткие заметки веб-разработчика

Функция генерация подписи запроса для эквайринга Тинькофф

Очень часто есть необходимость подключить эквайринг Тинькофф к маленькому лендингу. Проблема в том, что по каким-то причинам в Тинькофф решили не разрабатывать собственный SDK для эквайринга. И каждый раз это вставляет палки в колёса. В статье привожу простой и понятный пример, который работает всегда.

Особенно сложно получается с генерацией токена/подписи запроса, так как в документации есть два способа генерации. Более того, в примере кода на PHP допущена ошибка. Что в сумме каждый раз создаёт мне головную боль. Публикую самую простую реализацию этой функции.

function createSignature($args) //$args - массив параметров запроса (функция автоматических из отфильтрует)
{
    $token = '';
    $args['Password'] = 'ЗДЕСЬ ВАШ ПАРОЛЬ ТЕРМИНАЛА';
    ksort($args);

    foreach ($args as $key => $arg) {
        if (!is_array($arg) && $key != 'Token') {
            if (is_bool($arg)) $token .= $arg ? 'true' : 'false';
            else $token .= $arg;
        }
    }

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

Для любознательных код с комментариями.

$token = ''; // Создаём пустую строку для дальнейшей конкатенации в неё
$args['Password'] = 'ЗДЕСЬ ВАШ ПАРОЛЬ ТЕРМИНАЛА'; //Добавляем в параметры
ksort($args); //Сортируем массив по ключам

foreach ($args as $key => $arg) { //Перебираем значения массива
    if (!is_array($arg) && $key != 'Token') { //Исключаем все объекты и поле Token, оно тоже не нужно, хотя в документации об это не написано
        if (is_bool($arg)) $token .= $arg ? 'true' : 'false'; //Этого момента нет нигде. Если значение булевое - то и представлять его нужно как true или false
        else $token .= $arg; //Все остальные параметры - строки или числа просто конкатенируем
    }
}

Надеюсь, когда-нибудь всё же соберусь с мыслями и напишу SDK для их API. Хотя бы на PHP.