"Оплатите, пожалуйста, по QR-коду" – слышу это на кассе каждый день.
Вчера задумался: а как это вообще работает изнутри?
Когда я впервые описывал интеграцию с НСПК для оплаты по QR, думал: "Ну что там сложного? Генерируем код, показываем, деньги пришли". Рас рас и готово.
Но оказалось, что там куча нюансов.
(Кстати, если интересно, почему кассиры так просят оплатить по QR – напишите «почему», расскажу. А если знаете – поделитесь в комментах)
Два типа QR-кодов
🔸 Статический – один на всю точку, печатается и вывешивается у кассы. Раньше покупатель сам вводил сумму (фрод). Сейчас QR ведёт на веб-страницу, которая подтягивает сумму от кассы.
🔸 Динамический – генерируется для каждой транзакции, сумма уже в коде.
Как касса узнаёт, что оплата прошла?
Логично предположить: покупатель оплатил → банк отправляет уведомление на кассу (webhook) → "Оплачено ✓"
Но нет.
Касса сама спрашивает банк каждые 2-3 секунды:
"Заказ [OrderID] оплачен?"
→ Нет → пауза → снова спрашивает
→ Да → "Оплачено ✓"
Это называется polling (опрос).
Почему?
Кассе нельзя "позвонить" из интернета: она за роутером, у неё нет постоянного адреса. Или работает через 4G-модем.
Зато касса сама может позвонить в банк – это работает откуда угодно.
Как работает динамический QR:
1. Кассир пробивает товар, например, на 350 ₽ → касса генерирует уникальный
OrderID2. Касса через API банка запрашивает создание QR на 350 ₽ → показывает QR на экране
3. Касса начинает polling: "Оплатили OrderID?"
4. Покупатель сканирует → в приложении сумма уже заполнена → оплачивает
5. При очередном запросе от кассы "Оплатили OrderID?" банк отвечает "Да" → касса печатает чек
[сиквенс-диаграммы в комменте под постом]
Выводы для аналитика
🔸Уточняйте тип QR – статический или динамический (разные flow)
🔸Если устройство за NAT/роутером (у него не статический IP адрес, оно недоступно из внешней сети) – polling, не webhook
🔸 Проверяйте уникальность OrderID – формат типа
ORD-{TerminalID}-{Timestamp}🔸 Думайте о коллизиях – что если на точке несколько касс и несколько активных чеков? При статическом QR это проблема
🔸 Крайние случаи – что если интернет пропал? Кто отменяет транзакцию?
Именно в таких деталях кроется разница между "описал на коленке" и "продумал как надо".
А вы сталкивались с описанием платёжных интеграций?
Пишите в комментах 👇
@analyst_exe