СБП и способы оплаты

QR-код СБП для оплаты: статический или динамический

Динамический QR лучше для интернет-заказа, потому что связывает сумму и назначение с конкретной покупкой; статический код требует больше ручной сверки.

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

Разберём разницу по деталям, а заодно — сколько живёт код, каким его печатать, где он уместен офлайн и почему камера иногда отказывается его видеть.

Динамический и статический: в чём реальная разница

ПризнакДинамическийСтатический
СуммаЗашита в кодВводит плательщик
Привязка к заказуЕсть, через ваш идентификаторНет
Срок жизниМинуты, задаётся при созданииБессрочно
Где уместенОнлайн-заказ, счёт, кассаЧаевые, донат, разовый сбор
СверкаАвтоматическаяРуками по выписке

Динамический код выпускается на лету: вы делаете POST /api/v1/payments с суммой «2490.00» и своим order_id, в ответ приходит payment_id, pay_url и expires_at. Страница оплаты сама рисует QR по этому токену, вам не нужно генерировать картинку у себя.

Почему статический код рушит учёт

Одна картинка на всех платежей означает одно: у поступления нет имени. В выписке вы видите время и сумму, но не знаете, за какой заказ. Пока продаж пять в неделю, это терпимо. На тридцати в день начинается ад.

  • Двое купили один товар в одну минуту — какой из них оплатил, а какой ещё нет?
  • Клиент ошибся на сотню и перевёл 2390 вместо 2490 — заказ считать оплаченным?
  • Человек написал «за курс» вместо номера — искать его по имени в списке из сорока строк.
  • Нужен возврат — сначала докажите, что это тот самый перевод.

Школа рисования продавала три курса по одному коду в шапке профиля. Через месяц накопилось 11 спорных переводов: люди платили не ту сумму или без комментария. Разбор занял два вечера. После перехода на код под заказ спорные случаи свелись к одному в месяц — с неверной суммой, который система просто не подтвердила.

Статический код нормально работает там, где нет товара: чаевые мастеру, донат стримеру, сбор на подарок. Как только появляется «что купили» — берите динамический.

Сколько должен жить код

Срок берётся из expires_at и обычно составляет от 15 до 60 минут. Слишком короткий раздражает: человек отвлёкся на звонок и вернулся к мёртвому коду. Слишком длинный опасен по-другому — покупатель платит по вчерашнему скриншоту, а цена с тех пор изменилась.

Практика простая: онлайн-корзина — 20–30 минут, счёт по почте — до конца дня, касса и живая очередь — 5–10 минут. И в любом случае покажите на экране таймер и кнопку «Обновить код»: пересоздать платёж дешевле, чем разбирать просроченный перевод. Когда время вышло, вам придёт payment.expired — освободите резерв товара по этому событию.

Код читается камерой, а не человеком, поэтому дизайнерские вольности здесь стоят денег. Минимальные требования, которые стоит проверить перед тиражом.

  1. Размер. На настольной табличке — от 4 см по стороне, на плакате в двух метрах от зрителя — от 15 см. На экране — от 240 пикселей.
  2. Контраст. Тёмный код на светлом фоне. Белое на чёрном большинство камер читает хуже, а серое на бежевом не читает вовсе.
  3. Поле. Оставьте пустую рамку шириной примерно в четыре модуля кода. Текст и логотипы вплотную мешают распознаванию.
  4. Матовая бумага. Глянец и ламинация ловят блики от ламп, под ними код превращается в белое пятно.
  5. Никакого фона. Фотография или градиент под кодом убивают распознавание сильнее, чем плохой свет.

Логотип по центру допустим, если он закрывает не больше 20% площади и код напечатан с запасом по избыточности. Перед печатью тиража проверьте макет на трёх телефонах: старом Android, свежем iPhone и чужом устройстве с треснувшим стеклом.

Код на кассе, в кафе и на выставке

Офлайн у каждого места свои требования. На кассе продавец выпускает код под чек и разворачивает экран планшета к покупателю: сумма уже внутри, руками её никто не вводит, очередь не стоит. В кафе код кладут на стол, но сумму официант всё равно выставляет под конкретный счёт — иначе гости платят «примерно».

На выставке или конференции ситуация другая: интернет плохой, людей много, товар типовой. Здесь удобно заранее подготовить несколько кодов под фиксированные позиции — «мерч 1500», «книга 900» — и держать их на планшете отдельными экранами. Плюс запасной вариант: платёжная ссылка в мессенджере, если у гостя не работает камера.

Камера не читает: что проверить за минуту

Сначала исключите очевидное: яркость экрана на максимум, снять защитную плёнку с камеры, протереть объектив, отойти на 15–20 см. Дальше по списку.

  • Код просрочен — на странице висит старая картинка, обновите её.
  • Экран блёклый или включён ночной режим — жёлтый фильтр съедает контраст.
  • Камера снимает через стекло витрины — появляются блики и двойное отражение.
  • Стандартная камера телефона не умеет платёжные коды — открывайте сканер внутри приложения банка.
  • Картинку прислали скриншотом в мессенджере — сжатие размывает мелкие модули, отправьте ссылку.

Если ничего не помогло, не воюйте с камерой на глазах у покупателя: отправьте ссылку на оплату в чат или продиктуйте короткий адрес. Про выбор между кодом, ссылкой и картой полезно почитать в разборе СБП или оплата картой, а собрать это в рабочую схему помогает решение с платёжными ссылками.

И главное про подтверждение: отсканированный код и открытое приложение банка ещё не означают деньги на счёте. Товар отдавайте после события payment.paid на вашем сервере, с проверенной подписью — на кассе это буквально строка «Оплачено» на планшете продавца, а не слова покупателя «я отправил».

Частые вопросы

Чем динамический QR-код отличается от статического?

В динамическом коде сумма и идентификатор заказа зашиты заранее, у него есть срок жизни. Статический — это просто картинка с реквизитами, сумму в неё вводит сам плательщик. Для продажи товаров подходит только первый вариант.

Сколько времени должен жить код на оплату?

Для онлайн-корзины хватает 20–30 минут, на кассе достаточно 5–10, счёт по почте разумно оставить до конца дня. Срок задаётся при создании платежа и приходит в ответе полем expires_at. Когда время вышло, приходит событие payment.expired, по нему освобождайте резерв товара.

Каким размером печатать код на табличке и плакате?

Настольная табличка — от 4 см по стороне, плакат для взгляда с двух метров — от 15 см. Печатайте тёмный код на светлом матовом фоне и оставляйте вокруг пустое поле шириной примерно в четыре модуля. Глянец и фоновая фотография заметно ухудшают распознавание.

Покупатель говорит, что камера не видит код. Что делать?

Поднимите яркость экрана, выключите ночной режим, протрите объектив и отойдите на 15–20 см. Если код на экране висит давно, обновите его: скорее всего он просрочен. В крайнем случае отправьте платёжную ссылку в мессенджер вместо картинки.

Можно ли считать заказ оплаченным, когда клиент показал экран банка?

Нет, скриншот приложения ничего не подтверждает и легко подделывается. Ориентируйтесь на событие payment.paid, пришедшее на ваш сервер с корректной подписью. На кассе это выглядит как строка «Оплачено» на планшете продавца.

Источники и документация