Интеграция 1С-Битрикс с платёжной системой Тинькофф Оплата
Тинькофф Оплата — это не Тинькофф Кредит и не Тинькофф Pay. Три разных продукта, три разных API, и путаница между ними — стандартная ошибка при первичной настройке. Тинькофф Оплата (она же «Интернет-эквайринг Тинькофф») — полноценный платёжный шлюз для приёма карточных платежей, работающий через API securepay.tinkoff.ru/v2/. Именно о нём пойдёт речь.
Архитектура шлюза Тинькофф
API Тинькофф построено по схеме Init → Pay → Confirm/Cancel. Основные методы:
-
Init— инициализация платежа, получениеPaymentURLиPaymentId -
GetState— получение актуального статуса транзакции -
Confirm— подтверждение предавторизованного платежа -
Cancel— отмена платежа или возврат -
Charge— рекуррентное списание по привязанной карте
Все запросы подписываются токеном — SHA-256 от конкатенации значений параметров и пароля в алфавитном порядке ключей. Неправильный порядок при генерации токена — самая частая причина ошибки INVALID_SIGNATURE при первом запуске.
Интеграция с модулем sale Битрикс
Тинькофф имеет официальный модуль для Битрикс на Маркетплейсе. Альтернативно — кастомный обработчик в /local/php_interface/include/sale_payment/tinkoff_acquiring/.
Структура обработчика:
handler.php — основной класс, наследует ServiceHandler
.description.php — описание и иконка
.settings.php — поля: TerminalKey, Password, TestMode, TwoStagePayment
template/ — шаблон кнопки оплаты
Метод initiatePay формирует запрос к Init:
$request = [
'TerminalKey' => $terminalKey,
'Amount' => $payment->getSum() * 100, // в копейках
'OrderId' => $payment->getOrderId(),
'Description' => 'Заказ №' . $order->getField('ACCOUNT_NUMBER'),
'SuccessURL' => $returnUrl,
'FailURL' => $failUrl,
'NotificationURL' => $notifyUrl,
'Receipt' => $this->buildReceipt($order), // для 54-ФЗ
];
Нотификации и обработка статусов
Тинькофф отправляет POST на NotificationURL при каждой смене статуса. Статусы, требующие действий в Битрикс:
| Статус | Значение | Действие |
|---|---|---|
AUTHORIZED |
Средства заблокированы | Для двухстадийной — ждать Confirm |
CONFIRMED |
Оплата подтверждена | $payment->setPaid('Y') |
REJECTED |
Отклонён банком | Уведомить покупателя |
REFUNDED |
Полный возврат | Обновить статус заказа |
PARTIAL_REFUNDED |
Частичный возврат | Обновить сумму возврата |
REVERSED |
Отмена авторизации | Отменить платёж |
Нотификация содержит Token для верификации подписи — проверку обязательно реализовывать. После успешной обработки возвращать строку OK, иначе Тинькофф повторит попытку.
Чековые данные для 54-ФЗ
Тинькофф имеет встроенную онлайн-кассу. При передаче объекта Receipt в запрос Init касса формирует чек автоматически. Структура Receipt:
{
"Email": "[email protected]",
"Phone": "+79001234567",
"Taxation": "osn",
"Items": [
{
"Name": "Название товара",
"Price": 150000,
"Quantity": 2,
"Amount": 300000,
"Tax": "vat20",
"PaymentMethod": "full_payment",
"PaymentObject": "commodity"
}
]
}
Данные товаров берутся из корзины заказа: $order->getBasket()->getOrderableItems(). Для каждой позиции нужно сопоставить ставку НДС из каталога с кодом Tax в API Тинькофф (vat0, vat10, vat20, none).
Рекуррентные платежи
Тинькофф поддерживает привязку карты при первом платеже (параметр Recurrent: Y в Init) и последующие списания методом Charge без участия покупателя. В Битрикс это используется для подписок: при оформлении подписки сохраняется RebillId из нотификации, затем по крону вызывается Charge с нужным Amount. Подробнее — в статье про рекуррентные платежи.
Реальный кейс: таймаут при высокой нагрузке
Маркетплейс одежды, нагрузка ~500 заказов в день. Периодически покупатели жаловались, что после оплаты попадают на страницу «Ошибка», хотя деньги списались. Диагностика: при нагрузочных пиках SuccessURL-обработчик успевал вызвать GetState раньше, чем Тинькофф завершал проводку — статус возвращался AUTHORIZED вместо CONFIRMED. Статус заказа не менялся, покупатель видел ошибку. Решение: на SuccessURL показывать промежуточную страницу «Платёж обрабатывается» с JS-поллингом статуса через собственный AJAX-эндпоинт, а подтверждение оплаты делать исключительно по нотификации.
Тестирование
В личном кабинете Тинькофф (merchant.tinkoff.ru) создаётся тестовый терминал с отдельным TerminalKey. Тестовые карты для разных сценариев (успех, отказ, 3DS) — в документации API. Перед выходом в прод обязательно проверить: подпись нотификаций, корректность суммы в копейках, формирование Receipt, обработку двойного callback.
Сроки: базовое подключение без кассы — 1–3 дня. С 54-ФЗ и кастомной логикой статусов — 3–6 рабочих дней.







