1 min read

Как работает оплата по QR-коду (НСПК/СБП)

"Оплатите, пожалуйста, по QR-коду" — слышу это на кассе каждый день.

Вчера задумался: а как это вообще работает изнутри?

Когда я впервые описывал интеграцию с НСПК для оплаты по QR, думал: "Ну что там сложного? Генерируем код, показываем, деньги пришли." Рас рас, и готово.

Но оказалось там два разных сценария, касса не получает уведомления от банка (а сама его спрашивает!), и куча нюансов.

(Кстати, если интересно, почему кассиры так просят оплатить по QR — напишите «почему», расскажу. А если знаете - пишите сами)

Два типа QR-кодов

🔸 Статический — один на всю точку, печатается на табличке. Раньше покупатель сам вводил сумму (фрод). Сейчас QR ведёт на веб-страницу, которая подтягивает сумму от кассы. 🔸 Динамический — генерируется для каждой транзакции, сумма уже в коде.

Как касса узнаёт, что оплатили?

Обычно думаешь: покупатель оплатил → банк отправляет уведомление на кассу (webhook) → "Оплачено ✓"

Но нет.

Касса сама спрашивает банк каждые 2-3 секунды: "Оплатили OrderID=ORD-001?" → Нет → пауза → снова спрашивает → Да → "Оплачено ✓"

Это называется polling (опрос).

Почему? Кассе нельзя "позвонить" из интернета — она за роутером, у неё нет постоянного адреса. Или работает через 4G-модем.

Зато касса сама может позвонить в банк — это работает откуда угодно.

Как работает (динамический QR):

  1. Кассир пробивает товар, 350₽ → генерирует уникальный OrderID
  2. Запрашивает у банка API создание QR → показывает на экране
  3. Покупатель сканирует → в приложении сумма уже заполнена → подтверждает
  4. Касса начинает polling: "Оплатили OrderID?"
  5. Банк отвечает "Да" → касса печатает чек

[Диаграмма]

Выводы для аналитика

🔸 Уточняйте тип QR — статический или динамический (разные flow) 🔸 Если устройство за NAT/роутером (у него не статический IP адрес, так просто до него не дотянуться) — polling, не webhook 🔸 Проверяйте уникальность OrderID — формат типа ORD-{TerminalID}-{Timestamp} 🔸 Думайте о коллизиях — что если на точке несколько касс и несколько активных чеков? При статическом QR это проблема 🔸 Крайние случаи — что если интернет пропал? Кто отменяет транзакцию?

Да не суть, но именно эти детали делают разницу между "описал на коленке" и "продумал как надо".

А вы сталкивались с описанием платёжных интеграций?

Пишите в комментах 👇

@analyst_exe