Черно-белый квадрат на кассе или в терминале — это не просто картинка и не всегда банальная веб-ссылка. Под капотом у платежного QR-кода находится структурированный payload, который связывает мобильное приложение покупателя, процессинг и кассу мерчанта.
Разбираем, как устроен этот транспорт данных и по каким принципам работают платежи по QR, что вообще зашито внутри QR-кода.
На рынке нет единого монопольного формата, но большинство национальных платежных систем, банков и финтех-шлюзов опираются на международный стандарт EMVCo (или строят на его базе локальные адаптации вроде СБП, Pix или UPI).
Чаще всего данные упаковываются в текстовую строку формата TLV (Tag-Length-Value), где каждый параметр имеет строгий идентификатор, длину и значение. Реже используются кастомные форматы: JSON-строки или URL-схемы (deeplink).
Если отбросить специфику конкретной системы, типовой payload платежного QR содержит базовый набор атрибутов
Распространено два базовых сценария о которых я расскажу ниже.
1. Статический QR (наклейка на стойке) Это наклейка на кассовой стойке или распечатка, созданная один раз. Архитектурно здесь нет связки с конкретной корзиной: в полезную нагрузку зашиты только неизменяемые параметры — идентификатор точки, банк-эквайер и валюта. Большим преимуществом является экономия, не нужны интеграции с кассовым софтом и стабильный интернет на торговой точке. Пользовательский флоу максимально простой: камера считывает реквизиты, а сумму покупатель вбивает руками в банковском приложении.
2. Динамический QR (экран терминала, кассы или сайта)
Код генерируется кассовым бэкендом на лету под конкретную корзину покупателя и отображается на экране терминала, мониторе самообслуживания или веб-странице. В payload, помимо реквизитов продавца, сразу зашиваются фиксированная сумма с точностью до цента и уникальный ID заказа. У такого кода всегда есть ограниченный TTL (обычно 2–10 минут), чтобы избежать рассинхрона цен и зависших транзакций. Флоу для клиента бесшовный: сканирование —> проверка суммы на экране смартфона —> подтверждение. Как только эмитент одобряет списание, касса по вебхуку или сокет-соединению получает статус PAID, мапит его на открытый чек и автоматически закрывает продажу