SetRetail10 ◾️ Подтверждение возраста покупателя по биометрии через MAX на кассах POS и SetTouch

Публичное пространство

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 до актуальной версии (не ниже указанных выше).

Инструкция для получения токена:

 

Описание

Реализована возможность подтвердить возраст покупателя с помощью встроенного в мессенджер 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. Настройка кнопки описана далее в главе Настройка текста кнопки подтверждения.

  1. Кассир добавляет в чек товар с возрастным ограничением.

  2. Касса запрашивает подтверждение возраста.

172.29.17.126_03_12_2025-17_20_49.png
  1. Кассир в окне запроса подтверждения возраста сканирует следующий товар.

  2. Касса добавляет первый товар в чек. Сообщение о проверке возраста закрывается.

172.29.17.126_03_12_2025-17_21_10.png
  1. Кассир после добавления всех товаров переходит к расчету.

  2. Касса отображает окно с запросом подтверждения возраста.

  3. Кассир нажимает кнопку Подтвердить MAX.

172.29.17.126_03_12_2025-17_21_32.png
  1. Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.

172.29.17.126_03_12_2025-17_21_43.png
  1. Кассир сканирует QR код из приложения покупателя.

  2. Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.

  3. Касса получает результат:

    1. Возраст подтвержден: "is_adult": true

  4. Касса отправляет событие в Kafka|Prisma (при условии подключения сервиса) 126 “Возраст покупателя подтвержден”. В событии указан сервис подтверждения возраста: "ageConfirmationMethod": {"method": "plugin","pluginId": "max.age.confirmation.plugin"}

  5. Кассир переходит к расчету.

172.29.17.126_03_12_2025-17_22_14.png
  1. Покупатель оплачивает покупку.

  2. Касса регистрирует чек.

 

Сервис подтверждения возраста по биометрии недоступен

  1. Повторение шагов 1-10 Основного сценария.

  2. Сервис подтверждения возраста по биометрии не отвечает в течение заданного в настройке таймаута.

  3. Касса отображает неблокирующее уведомление “Сервис подтверждения возраста недоступен” и возвращается к окно с запросом подтверждения возраста.

172.29.17.126_03_12_2025-17_02_28.png

 

Сервис подтверждения возраста вернул ошибку

  1. Повторение шагов 1-10 Основного сценария.

  2. Сервис подтверждения возраста вернул ошибку (например http code 401 или http code 400).

  3. Касса отображает блокирующее уведомление: “Ошибка сервиса. Повторите сканирование или подтвердите возраст иначе”.

172.29.17.126_02_12_2025-20_30_10.png
  1. Кассир выполняет одно из двух действий:

    1. Повторно сканирует QR код → касса повторно обращается в сервис подтверждения возраста

    2. Нажимает Отмена на клавиатуре → касса возвращается в окно с запросом подтверждения возраста.

 

SetTouch

Приведены примеры работы с названием кнопки по умолчанию - Использовать биометрию

Подтверждение на этапе добавления товара

  1. Кассир добавляет в чек товар с возрастным ограничением.

  2. Касса запрашивает подтверждение возраста.

  3. Кассир нажимает кнопку Использовать биометрию.

image-20251204-074044.png
  1. Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.

chrome_iz80DyiDhU.png
  1. Кассир сканирует QR код из приложения покупателя.

  2. Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.

  3. Касса получает результат:

    1. Возраст подтвержден: "is_adult": true

  4. Касса отправляет событие в Kafka|Prisma (при условии подключения сервиса) 126 “Возраст покупателя подтвержден” . В событии указан сервис подтверждения возраста: "ageConfirmationMethod": {"method": "plugin","pluginId": "max.age.confirmation.plugin"}

  5. Товар добавляется в чек.

  6. Кассир переходит к расчету, касса не запрашивает подтверждение возраста.

chrome_0I7dVk9cAk.png
  1. Покупатель оплачивает покупку.

  2. Касса регистрирует чек.

 

Сервис подтверждения возраста по биометрии недоступен

  1. Кассир добавляет в чек товар с возрастным ограничением.

  2. Касса запрашивает подтверждение возраста.

  3. Кассир нажимает кнопку Использовать биометрию.

  4. Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.

  5. Кассир сканирует QR код из приложения покупателя.

  6. Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.

  7. Сервис подтверждения возраста по биометрии не отвечает в течении заданного в настройке таймаута

  8. Касса отображает уведомление “Сервис подтверждения возраста недоступен” и возвращается к окно с запросом подтверждения возраста.

chrome_j5pLwKYL9Y.png

 

Сервис подтверждения возраста вернул ошибку

  1. Кассир добавляет в чек товар с возрастным ограничением.

  2. Касса запрашивает подтверждение возраста.

  3. Кассир нажимает кнопку Использовать биометрию.

  4. Касса переходит к окну “Отсканируйте QR-код из приложения MAX”.

  5. Кассир сканирует QR код из приложения покупателя.

  6. Касса отправляет отсканированный QR код в сервис подтверждения возраста MAX.

  7. Касса отображает уведомление: “Ошибка сервиса. Повторите сканирование или подтвердите возраст иначе”.

chrome_biKbxWX61N.png
  1. Кассир выполняет одно из двух действий:

    1. Повторно сканирует QR код → касса повторно обращается в сервис подтверждения возраста.

    2. Нажимает Отменить → касса возвращается в окно с запросом подтверждения возраста.

 

Ограничения

  • При использовании процессинга MAX становятся недоступны следующие функции контроля:

    • Двухэтапный контроль продажи товаров с ограничением возраста.

    • Ввод даты рождения покупателя для контроля продажи товаров с ограничением возраста.

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

  • Подтверждение возраста через систему MAX допустимо исключительно для товаров с возрастными ограничениями 16+ и 18+. Для товаров категории 21+ доступен единственный способ подтверждения — предоставление оригинала документа, удостоверяющего личность.

  • При одновременном наличии в чеке товаров с ограничениями 16+ и 18+, подтверждение возраста производится по максимальному из встречающихся ограничений — то есть для категории 18+.

  • При переходе к оплате касса запрашивает проверку возраста каждый раз. Т. е., после подтверждения возраста и возврата к чеку, при повторном переходе в режим расчёта касса снова потребует подтверждение возраста.

  • Для корректной работы функциональности сканер должен поддерживать считывание URL-ссылок, закодированных в QR-коде.

Настройка

Настройте процессинг по инструкции в статье SetRetail SCO v.3◾Подтверждение возраста покупателя по биометрии через MAX

Обязательно проверьте, что не установлен флажок Двухэтапный контроль продажи товаров с ограничением возраста в шаблоне касс. Для подтверждения работы через MAX он должен быть снят.

Кассовый модульШаблоны касс[Шаблон кассы]

image-20260330-211430.png

Настройка текста кнопки подтверждения

В зависимости от разрешения экрана и размеров интерфейсных элементов, стандартная надпись на кнопке может отображаться не полностью (обрезаться).

172.29.17.126_02_12_2025-20_37_59.png

Стандартное название кнопки - Использовать биометрию - может быть изменено с помощью файла локализации 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

Порядок действий:

  1. Если файл отсутствует — создайте новый или скопируйте из шаблона .

  2. Если файл существует — откройте его для редактирования.

  3. Добавьте ключи локализации в формате ключ=значение. Для корректного отображения русскоязычного текста необходимо использовать кодировку 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

  1. Сохраните изменения в файле → перезагрузите кассовый модуль для применения изменений.

Конвертация в Unicode Escape

При редактировании файлов локализации текст на кириллице должен быть сконвертирован в формат Unicode, для этого:

  1. Откройте любой подходящий онлайн-декодер → установите UTF-8 для исходного текста → установите Unicode Escape для результата расшифровки.

  2. Вставьте значение ключа → нажмите Расшифровать → скопируйте полученное значение.

image-20251203-193003.png

Экспорт

В выгрузке чека в плагинные свойства сохраняется результат проверки возраста:

  • 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="{&#10; &quot;@type&quot; : &quot;ru.crystals.catalog.CatalogStatistic&quot;,&#10; &quot;fullTimeCustomerMs&quot; : 91491&#10;}"/> <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>

Статьи по теме