6 мин чтенияВозможности

EPC QR-код: стандарт SEPA-платежей объяснён

EPC QR-код кодирует SEPA-перевод, а не URL, поэтому банковское приложение может заполнить форму автоматически. Что находится в полезной нагрузке и почему её нельзя отследить.

Marius Voß
DevRel · edge infra
Полезная нагрузка EPC QR-кода в виде двенадцати строк обычного текста, начинающихся со служебного тега BCD, рядом с формой перевода в банковском приложении, заполненной на основе этих данных

EPC QR-код не содержит ссылку. В нём зашит SEPA-перевод, записанный коротким блоком обычного текста, и банковское приложение, распознающее формат, считывает его и заполняет форму перевода. Ни один сервер не задействован, ничего не запрашивается, и информация о сканировании до вас никак не доходит.

Именно этот факт определяет всё остальное в том, как используются такие коды. Такой код нельзя сократить, нельзя перенаправить и нельзя посчитать сканирования, потому что нигде в процессе нет ни одного запроса. Стандарт за этим - EPC069-12 Европейского платёжного совета, на немецкоязычных рынках такие коды обычно называют GiroCode, и в формате стоит разобраться досконально до того, как вы напечатаете тысячи таких кодов на счетах. Про то, что вообще может нести QR-код в общем случае, статья что такое QR-код рассказывает подробно.

Что на самом деле содержит полезная нагрузка

Полезная нагрузка - это последовательность строк в фиксированном порядке, каждая из которых отдельный элемент. Парсер читает строку 1, ожидает там BCD, читает строку 4, ожидает там SCT, и сдаётся, если хотя бы одно из этого отсутствует.

СтрокаСодержимоеОграничение
Service tagBCDфиксировано, 3 символа
Version001 или 002002 делает BIC необязательным
Character set1 для UTF-8, до 8одна цифра
IdentificationSCTфиксировано, 3 символа
BICидентификатор банка получателя11 символов, часто опускается
Beneficiary nameвладелец счёта70 символов
IBANсчёт получателя34 символа
AmountEUR, за которым следует значениеот 0.01 до 999999999.99, в EUR
Purpose codeкод назначения ISO, используется редко4 символа
Structured refреференс кредитора, либо35 символов
Unstructured textпроизвольный текст назначения платежа вместо этого140 символов
Beneficiary to originatorпримечание, показываемое плательщику70 символов

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

Весь блок ограничен 331 байтом. Руководство EPC069-12 также фиксирует уровень коррекции ошибок M и ограничивает символ версией 13, так что у печатаемого кода есть известный потолок по количеству модулей. Если вы собираете это в коде, а не кликаете в генераторе, документация библиотеки Segno показывает порядок полей и правила кодирования в виде, которое можно проверить на практике.

Четыре блока полезной нагрузки EPC QR-кода: от фиксированного служебного тега через данные получателя и сумму до назначения платежа

Почему его нельзя сократить или отследить

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

Здесь ничего из этого не работает. Банковское приложение - это не браузер. Оно разбирает текст, сопоставляет его с форматом и открывает форму платежа локально на устройстве. Перехватывать нечего, потому что нет никакого HTTP-запроса, так что:

  • Счётчика сканирований не существует нигде. Ни в вашем инструменте, ни в банковском.
  • Ничего нельзя перенаправить. Неверный IBAN означает перепечатку.
  • Обёртывание полезной нагрузки в короткую ссылку полностью её ломает, потому что парсер видит https там, где ожидает BCD.

Я видел, как команда потратила неделю, пытаясь получить атрибуцию для платёжного кода, прежде чем кто-то наконец прочитал спецификацию. Честный ответ таков: платёжная сторона и сторона измерения - это два разных кода, и если в макете есть место только для одного, побеждает платёжный.

Измерять можно всё, что вокруг него. Если в рассылке идёт счёт с платёжным кодом, разместите на письме отдельную отслеживаемую короткую ссылку - на клиентский портал, условия или страницу поддержки - и считывайте вовлечённость по ней. QR-функции Elido охватывают отслеживаемую половину листа, а платёжный код остаётся именно таким, каким его требует стандарт.

Где это работает, а где нет

Поддержка живёт в конкретных банковских приложениях, поэтому покрытие неравномерно - куда неравномернее, чем можно подумать по спискам стран. Австрийские и немецкие приложения читают эти коды уже много лет, финские и нидерландские в целом надёжны, бельгийская поддержка тоже хороша. За пределами этого списка тестируйте перед тем, как отправлять код в печать тиражом.

Есть два соседних формата, с которыми его часто путают. Швейцарский QR-bill - это отдельная спецификация со своим макетом и швейцарским крестом в центре символа; это не EPC-код, и приложения из еврозоны не распознают его как платёж. А платёжная ссылка от процессинга банковских карт - это вообще не то же самое: это обычный URL внутри QR-кода, ведущий на размещённую страницу оплаты, и он ведёт себя как любая другая веб-ссылка, включая всё, что можно отследить.

Про более широкий вопрос - что регулируемый платёжный или кредитный бизнес вообще может показывать клиентам - статья сокращатели URL для финтеха рассказывает о той части, где задействована ссылка.

Платёжный QR-код, декодируемый офлайн в форму перевода, в сравнении с QR-кодом-ссылкой, который обращается к редиректу и формирует аналитику

Как сделать код без сожалений

Шесть проверок в том порядке, в котором они экономят вам деньги.

  1. Проверяйте IBAN до генерации, а не после печати. Проверка контрольной суммы ничего не стоит, а перепечатка тиража стоит денег.
  2. Осознанно решите вопрос с суммой. Фиксированная - для счетов, пустая - для плакатов с пожертвованиями, где должна быть возможна любая сумма.
  3. Предпочитайте структурированный референс произвольному тексту. Он короче, автоматически сверяется в вашей бухгалтерии и держит полезную нагрузку компактной.
  4. Тестируйте минимум в трёх банковских приложениях на обеих мобильных платформах. Парсеры по-разному строго относятся к необязательным полям.
  5. Подбирайте размер напечатанного кода под расстояние, с которого его будут сканировать - точно так же, как для любого другого кода. Арифметику для этого содержит статья каким должен быть размер QR-кода.
  6. Делайте поверхность матовой. Глянцевый лак поверх платёжного кода на счёте под офисным освещением - это гарантированное обращение в поддержку.

Проблема с наклейкой

Есть один реальный вектор мошенничества, и он физический, а не цифровой. Статический платёжный код, напечатанный на счёте, парковочном автомате, вывеске рыночного прилавка или благотворительном плакате, можно заклеить наклейкой с другим IBAN. Ничто в самом коде этому не противостоит, потому что полезная нагрузка - это и есть бумага.

Меры защиты тоже физические. Печатайте код прямо внутри макета счёта, там, где наклейка была бы заметна, а не на отдельном клейком стикере. Показывайте текстом рядом с кодом имя получателя и последние цифры IBAN, чтобы плательщик мог сверить. И в инструкции по подтверждению платежа просите людей читать имя, которое показывает их банковское приложение, прежде чем подтверждать перевод, потому что именно этот экран - единственное место, где подмена становится видимой. Статья безопасны ли QR-коды и что такое квишинг на самом деле разбирает более широкий паттерн атаки, большая часть которого применима и к кодам-ссылкам, напечатанным где-то ещё на той же странице.

Успокаивающая часть в том, что платёж всё равно требует подтверждения человеком в авторизованном банковском приложении. Код лишь заполняет форму, он никогда не переводит деньги сам.

Читайте цикл опорных статей

Эта статья входит в кластер функций. Про весь процесс печати вокруг любого кода, который вы генерируете, QR-кампания с нуля - опорная статья, а руководство по QR-кодам в документации рассказывает про генерацию отслеживаемого варианта через API.

Связанные статьи в блоге

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

Что такое EPC QR-код?

QR-код, который кодирует реквизиты SEPA-перевода в виде обычного текста, чтобы банковское приложение могло прочитать их и заполнить форму перевода. Он был стандартизирован Европейским платёжным советом в руководстве EPC069-12 и также известен как GiroCode. Полезная нагрузка - это фиксированная последовательность строк, начинающаяся со служебного тега BCD, и в ней нет вообще никакого веб-адреса.

В каких странах поддерживаются платежи GiroCode?

Поддержка зависит от банковского приложения, а не от страны, но на практике эти коды широко распознаются в Австрии, Германии, Финляндии, Нидерландах и Бельгии. В остальной части еврозоны покрытие неравномерное, а за её пределами код вообще не имеет смысла. В Швейцарии используется собственный стандарт QR-bill, который выглядит похоже, но несовместим.

Может ли EPC QR-код быть динамическим или отслеживаемым?

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

Что произойдёт, если поместить короткую ссылку в EPC QR-код?

Банковское приложение не сможет его разобрать и либо покажет ошибку, либо просто откроет код как обычный URL. Парсер ожидает, что первая строка будет BCD, а четвёртая - SCT; URL не совпадает ни с тем, ни с другим. Платёжные QR-коды и QR-коды со ссылками - это два разных кода, которые случайно совпадают по внешней форме.

Насколько большой может быть полезная нагрузка?

331 байт - именно это по правилам EPC ограничивает QR-код версией 13 с уровнем коррекции ошибок M. На практике место в основном занимает текст назначения платежа, так что именно длинный произвольный текст чаще всего выталкивает код за лимит. Держите назначение платежа структурированным и коротким - тогда код останется достаточно разреженным, чтобы его можно было отсканировать с бумажного счёта.

Безопасны ли платёжные QR-коды на бумажных счетах?

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

Попробуйте Elido

Вставьте URL - получите короткую ссылку

Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.

Бесплатно, без регистрации · 2 в день

Попробуйте Elido

URL-сокращатель с хостингом в ЕС: собственные домены, глубокая аналитика, открытый API. Бесплатный тариф - без банковской карты.

Теги
epc qr code
girocode
sepa payment qr code
qr code payment
static qr code
invoice qr code

Читать дальше