Skip to content

T-Банк (T-Kassa)

T-Kassa — merchant acquiring от Т-Банка. Принимает карты и СБП-QR в одном API. Аналог ЮKassa, популярен у новых ИП и ООО’шек из-за быстрой онбординг-процедуры Т-Банка.

В личном кабинете Т-Банк → «Интернет-эквайринг»«Настройки»:

  • TerminalKey — идентификатор терминала (публичный)
  • Password — секретный пароль терминала (держите в секрете)

SettingsSecrets:

  • tbank-terminal-key: ваш TerminalKey
  • tbank-password: ваш Password
НодаЧто делает
tbank.webhook.triggerIncoming события (авторизация / захват / отмена / refund)
tbank.payment.initСоздание платежа → вернёт PaymentURL для редиректа клиента
tbank.payment.getСтатус по PaymentId
tbank.payment.qrПолучить SBP-QR для этого платежа
tbank.payment.cancelОтмена / refund (unified — в T-Kassa это одна операция)
webhook.trigger
{order_id, amount_rub, description}
tbank.payment.init
OrderId = "{{trigger.order_id}}"
Amount = {{trigger.amount_rub * 100}} # копейки!
Description = "{{trigger.description}}"
NotificationURL = "https://app.opora.example/webhook/<uuid>"
# Отдать клиенту tbank.payment.init.result.PaymentURL

Два пути:

a) QR на этапе оплаты — пользователь сканирует QR в своём банковском приложении вместо ввода карты:

tbank.payment.init
... (как выше)
PayType = "O" # one-stage
tbank.payment.qr
PaymentId = "{{init.result.PaymentId}}"
DataType = "PAYLOAD" # или "IMAGE" для base64 SVG

tbank.payment.qr вернёт SBP-URL (https://qr.nspk.ru/AS...) или base64-encoded SVG картинку. Фронтенд рендерит её.

b) QR вместо карты — клиент в кассе показывает QR со своего телефона (кассир сканирует) — другой flow, не покрывается OPORA’ой.

tbank.webhook.trigger
control.switch (on: {{trigger.Status}})
├─ "AUTHORIZED" → одобрен, ждёт capture
├─ "CONFIRMED" → захвачен, деньги у мерчанта
├─ "REFUNDED" → возврат прошёл
└─ "REJECTED" → отказ банка / мошенничество

Подпись webhook’а — Token-based (SHA-256 над отсортированными полями + password). OPORA валидирует автоматически, используя tbank-password secret.

tbank.payment.init
... PayType = "T" # T = two-stage
# После AUTHORIZED webhook'а — когда товар отгружен:
tbank.payment.confirm # API note: в коде это tbank.payment.capture
PaymentId = "{{payment_id}}"
Amount = {{actual_captured_amount * 100}}

Не захватил за 7 дней → T-Kassa автоматически отменит.

Подпись не сошлась. Проверьте что tbank-password secret совпадает с Password в кабинете T-Kassa (регистр важен; не путайте с паролем личного кабинета — это разные пароли).

T-Kassa не даёт создать платёж с тем же OrderId. Либо используйте уникальные (например, order_id + "_" + timestamp), либо сначала tbank.payment.get с OrderId-фильтром, чтобы подобрать существующий.

QR от Т-Банка подходит только СБП-compatible банкам (большинство, но не все). Проверьте в мобильном банке клиента — есть ли «Платежи по QR».

T-Kassa ретраит до 200 OK. Если OPORA ответила 5xx’ом — получите дубликат через 5 минут. Используйте data_table.rows.upsert с уникальным PaymentId чтобы idempotent’но обрабатывать повторы.

  • ЮKassa — альтернатива, шире rollout на рынке (в том числе секция «СБП-QR» для сравнения реализаций)