Публичное пространство
SetRetail10 ◾️ Подтверждение возраста покупателя по биометрии через MAX на кассах POS и SetTouch
10.4.22.0 10.4.21.5 10.4.20.12
Работа с MAX поддерживается только на кассах, работающих на Java 21.
Кассы, работающие на Java 8, не поддерживают работу с MAX.
SetRetail10 ▪️ Касса ◾️ Как узнать, что касса запущена на Java 21?
Информируем о переходе на обновленный протокол API MAX. Для корректной работы сервиса необходимо обновить кассовое ПО до версий 10.4.23.21, 10.4.24.6, 10.4.25.6, 10.4.26.0 и выше.
Важно: С 1 мая 2026 года поддержка старого протокола будет прекращена, и сервис MAX перестанет функционировать на более ранних версиях.
Особенности работы с токенами, необходимыми для работы MAX, после обновления:
Если токен получен через Бизнес-портал: сервис продолжит работу в штатном режиме.
Если токен получен напрямую от MAX (через почту, Telegram и т.д.): старый токен станет недействительным. Для восстановления функционала подтверждения возраста необходимо пройти официальную процедуру получения токена.
Рекомендуемый порядок действий:
Чтобы избежать простоя сервиса подтверждения возраста, соблюдайте строгую последовательность:
Получение токена: Заблаговременно получите официальный токен через Бизнес-портал MAX (по инструкции).
Настройка: Внесите новый токен в параметры системы (если ранее использовался полученный не по инструкции).
Обновление ПО: Произведите обновление SetRetail10 до актуальной версии (не ниже указанных выше).
Инструкция для получения токена:
- 1 Описание
- 2 Ценность
- 3 Условия работы
- 4 Примеры работы
- 5 Ограничения
- 6 Настройка
- 7 Экспорт
- 8 Статьи по теме
Описание
Реализована возможность подтвердить возраст покупателя с помощью встроенного в мессенджер MAX сервиса биометрической верификации для оформления продажи товаров с возрастным ограничением в случаях отсутствия документа, удостоверяющего личность.
Реализация функциональности реализована во исполнение Федерального закона от 29.12.2025 N 569-ФЗ "О внесении изменений в Федеральный закон "Об информации, информационных технологиях и о защите информации" и отдельные законодательные акты Российской Федерации".
Закон закрепляет возможность подтверждения возраста при покупке:
алкогольных напитков;
безалкогольной тонизирующей продукции;
табака, никотиносодержащих изделий и устройств для их потребления, а также кальянов;
лотерейных билетов;
посещении зрелищного мероприятия.
Ценность
Удобство для покупателя:
Позволяет покупателю подтвердить возраст без предъявления бумажного документа.
Соответствие законодательству:
Исключает риски продажи товаров 18+ несовершеннолетним и связанные с этим нарушения закона.
Дополнительный доход ритейлера:
Сокращает количество отказов в продаже из-за отсутствия документа и снижает нагрузку на персонал.
Условия работы
Для использования функциональности у покупателя должны быть:
подтвержденная учетная запись в ЕСИА (Госуслуги);
сданы биометрические данные в ЕБС (единую биометрическую систему);
установлен мессенджер MAX;
подключен Цифровой ID.
Для работы функциональности клиенту (торговой сети) требуется получить токен авторизации у MAX. Для получения токена напишите письмо на адрес электронной почты gov@max.ru в свободной форме.
Требуется обеспечить выполнение GET-запроса к https://ext-api.max.ru/esia/age-verification по стандартному порту 443.
Сканер должен поддерживать считывание URL-ссылок, закодированных в QR-коде.
Примеры работы
POS
Подтверждение при переходе к расчету
Приведены примеры работы с кастомным названием кнопки подтверждения - Подтвердить MAX. Настройка кнопки описана далее в главе Настройка текста кнопки подтверждения.
Кассир добавляет в чек товар с возрастным ограничением.
Касса запрашивает подтверждение возраста.
Кассир в окне запроса подтверждения возраста сканирует следующий товар.
Касса добавляет первый товар в чек. Сообщение о проверке возраста закрывается.
Кассир после добавления всех товаров переходит к расчету.
Касса отображает окно с запросом подтверждения возраста.
Кассир нажимает кнопку Подтвердить MAX.
Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.
Кассир сканирует QR код из приложения покупателя.
Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.
Касса получает результат:
Возраст подтвержден:
"is_adult": true
Касса отправляет событие в Kafka|Prisma (при условии подключения сервиса) 126 “Возраст покупателя подтвержден”. В событии указан сервис подтверждения возраста:
"ageConfirmationMethod": {"method": "plugin","pluginId": "max.age.confirmation.plugin"}Кассир переходит к расчету.
Покупатель оплачивает покупку.
Касса регистрирует чек.
Сервис подтверждения возраста по биометрии недоступен
Повторение шагов 1-10 Основного сценария.
Сервис подтверждения возраста по биометрии не отвечает в течение заданного в настройке таймаута.
Касса отображает неблокирующее уведомление “Сервис подтверждения возраста недоступен” и возвращается к окно с запросом подтверждения возраста.
Сервис подтверждения возраста вернул ошибку
Повторение шагов 1-10 Основного сценария.
Сервис подтверждения возраста вернул ошибку (например
http code 401илиhttp code 400).Касса отображает блокирующее уведомление: “Ошибка сервиса. Повторите сканирование или подтвердите возраст иначе”.
Кассир выполняет одно из двух действий:
Повторно сканирует QR код → касса повторно обращается в сервис подтверждения возраста
Нажимает Отмена на клавиатуре → касса возвращается в окно с запросом подтверждения возраста.
SetTouch
Приведены примеры работы с названием кнопки по умолчанию - Использовать биометрию
Подтверждение на этапе добавления товара
Кассир добавляет в чек товар с возрастным ограничением.
Касса запрашивает подтверждение возраста.
Кассир нажимает кнопку Использовать биометрию.
Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.
Кассир сканирует QR код из приложения покупателя.
Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.
Касса получает результат:
Возраст подтвержден:
"is_adult": true
Касса отправляет событие в Kafka|Prisma (при условии подключения сервиса) 126 “Возраст покупателя подтвержден” . В событии указан сервис подтверждения возраста:
"ageConfirmationMethod": {"method": "plugin","pluginId": "max.age.confirmation.plugin"}Товар добавляется в чек.
Кассир переходит к расчету, касса не запрашивает подтверждение возраста.
Покупатель оплачивает покупку.
Касса регистрирует чек.
Сервис подтверждения возраста по биометрии недоступен
Кассир добавляет в чек товар с возрастным ограничением.
Касса запрашивает подтверждение возраста.
Кассир нажимает кнопку Использовать биометрию.
Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.
Кассир сканирует QR код из приложения покупателя.
Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.
Сервис подтверждения возраста по биометрии не отвечает в течении заданного в настройке таймаута
Касса отображает уведомление “Сервис подтверждения возраста недоступен” и возвращается к окно с запросом подтверждения возраста.
Сервис подтверждения возраста вернул ошибку
Кассир добавляет в чек товар с возрастным ограничением.
Касса запрашивает подтверждение возраста.
Кассир нажимает кнопку Использовать биометрию.
Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.
Кассир сканирует QR код из приложения покупателя.
Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.
Касса отображает уведомление: “Ошибка сервиса. Повторите сканирование или подтвердите возраст иначе”.
Кассир выполняет одно из двух действий:
Повторно сканирует QR код → касса повторно обращается в сервис подтверждения возраста.
Нажимает Отменить → касса возвращается в окно с запросом подтверждения возраста.
Ограничения
При использовании процессинга MAX становятся недоступны следующие функции контроля:
Двухэтапный контроль продажи товаров с ограничением возраста.
Ввод даты рождения покупателя для контроля продажи товаров с ограничением возраста.
Сканирование QR-кода для подтверждения возраста доступно только в рамках процессингового окна, вызываемого кнопкой Использовать биометрию. Прямое сканирование с экрана запроса подтверждения возраста недоступно.
Подтверждение возраста через систему MAX допустимо исключительно для товаров с возрастными ограничениями 16+ и 18+. Для товаров категории 21+ доступен единственный способ подтверждения — предоставление оригинала документа, удостоверяющего личность.
При одновременном наличии в чеке товаров с ограничениями 16+ и 18+, подтверждение возраста производится по максимальному из встречающихся ограничений — то есть для категории 18+.
При переходе к оплате касса запрашивает проверку возраста каждый раз. Т. е., после подтверждения возраста и возврата к чеку, при повторном переходе в режим расчёта касса снова потребует подтверждение возраста.
Для корректной работы функциональности сканер должен поддерживать считывание URL-ссылок, закодированных в QR-коде.
Настройка
Настройте процессинг по инструкции в статье SetRetail SCO v.3◾Подтверждение возраста покупателя по биометрии через MAX
Обязательно проверьте, что не установлен флажок Двухэтапный контроль продажи товаров с ограничением возраста в шаблоне касс. Для подтверждения работы через MAX он должен быть снят.
Кассовый модуль → Шаблоны касс → [Шаблон кассы]
Настройка текста кнопки подтверждения
В зависимости от разрешения экрана и размеров интерфейсных элементов, стандартная надпись на кнопке может отображаться не полностью (обрезаться).
Стандартное название кнопки - Использовать биометрию - может быть изменено с помощью файла локализации res-custom_ru_RU.properties
Настройка производится одним из способов:
Централизованная настройка (сервер)
Используйте этот способ, если требуется изменить название кнопки на всех кассах POS и SetTouch.
/var/lib/jboss/nginx/html/crystal-cash/config/localizations/res-custom_ru_RU.properties
Локальная настройка (конкретная касса)
/home/tc/storage/crystal-cash/config/localizations/res-custom_ru_RU.properties
Порядок действий:
Если файл отсутствует — создайте новый или скопируйте из шаблона .
Если файл существует — откройте его для редактирования.
Добавьте ключи локализации в формате ключ=значение. Для корректного отображения русскоязычного текста необходимо использовать кодировку Unicode Escape.
Пример:
Для изменения текста на Подтвердить MAX используйте следующую строку:
USE_BIOMETRICS=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c\u0020\u004d\u0041\u0058Для кассы POS используйте параметр ON_BIOMETRICS
Для кассы SetTouch используйте параметр USE_BIOMETRICS
Для кассы POS, начиная с версии 10.4.23.0 изменено название кнопки на “По биометрии“.
https://crystals.atlassian.net/browse/SRTB-10234
Сохраните изменения в файле → перезагрузите кассовый модуль для применения изменений.
Конвертация в Unicode Escape
При редактировании файлов локализации текст на кириллице должен быть сконвертирован в формат Unicode, для этого:
Откройте любой подходящий онлайн-декодер → установите UTF-8 для исходного текста → установите Unicode Escape для результата расшифровки.
Вставьте значение ключа → нажмите Расшифровать → скопируйте полученное значение.
Экспорт
В выгрузке чека в плагинные свойства сохраняется результат проверки возраста:
AGE_VERIFICATION_VALIDATION_SERVICE- ID плагина, который использовался для проверки возрастаAGE_VERIFICATION_RESULT- ответ из сервиса проверки возраста;AGE_VERIFICATION_SESSION_ID- отсканированный QR-код;AGE_VERIFICATION_METADATA- параметры запроса (идентификатор и время запроса).
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purchases count="1">
<purchase tabNumber="99999" userName="Иванов Иван Иванович" operationType="true" cashOperation="INCOME" operDay="2026-04-22+03:00" shop="779" cash="2" shift="157" number="3" saletime="2026-04-22T16:07:30.928+03:00" begintime="2026-04-22T16:07:20.205+03:00" amount="97.00" discountAmount="0.00" inn="1234567890" fiscalDocNum="327;3">
<plugin-property key="AGE_VERIFICATION_RESULT" value="true"/>
<plugin-property key="PROMO_PRINT_DISABLED" value="true"/>
<plugin-property key="FISCAL_DOC_ID" value="327"/>
<plugin-property key="FN_DOC_NUM_IN_SHIFT" value="3"/>
<plugin-property key="AGE_VERIFICATION_SESSION_ID" value="https://www.gosuslugi.ru/m1/okResponseAdultTrue"/>
<plugin-property key="AGE_VERIFICATION_URL" value="http://172.29.17.205:50052"/>
<plugin-property key="CASHIER_NAME" value="Иванов Иван Иванович"/>
<plugin-property key="UID_PURCHASE" value="816e8910-1141-4994-aeaf-c7ffa6365d92"/>
<plugin-property key="AGE_VERIFICATION_METADATA" value="MaxResponseMetadata{requestId='req_123456789', timestamp='2024-01-15T14:31:00Z'}"/>
<plugin-property key="KPP" value="987654321"/>
<plugin-property key="CASH_TIME_ZONE" value="+03:00"/>
<plugin-property key="AGE_VERIFICATION_VALIDATION_SERVICE" value="max.age.confirmation.plugin"/>
<positions>
<position order="1" departNumber="1" goodsCode="225612" barCode="460765225612" count="1.000" cost="97.00" nds="20.0" ndsSum="16.17" discountValue="0.00" costWithDiscount="97.00" amount="97.00" dateCommit="2026-04-22T16:07:20.504+03:00" insertType="3">
<plugin-property key="lineNumberAfterRegistration" value="1"/>
<plugin-property key="catalogStatistic" value="{ "@type" : "ru.crystals.catalog.CatalogStatistic", "fullTimeCustomerMs" : 91491 }"/>
<plugin-property key="salesTax" value="0"/>
<plugin-property key="ffdTag2108"/>
<plugin-property key="minimalPrice" value="-1"/>
</position>
</positions>
<payments>
<payment order="0" typeClass="CashPaymentEntity" amount="100.00" description="Оплата наличными"/>
<payment order="0" typeClass="CashChangePaymentEntity" amount="3.00" description=""/>
</payments>
</purchase>
</purchases>
Статьи по теме