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.

 

Описание

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

Ценность

Удобство для покупателя:
Позволяет покупателю подтвердить возраст без предъявления бумажного документа.

Соответствие законодательству:
Исключает риски продажи товаров 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-коде.

Настройка

Настройте процессинг по инструкции в статье https://crystals.atlassian.net/wiki/spaces/SR10SUPPORT/pages/5583831117/SetRetail+SCO+v.3+MAX#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0

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

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

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
  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-код

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <purchases count="1"> <purchase tabNumber="99999" userName="Иванов Иван Иванович" operationType="true" cashOperation="INCOME" operDay="2025-12-02+03:00" shop="779" cash="2" shift="141" number="3" saletime="2025-12-02T17:38:31.532+03:00" begintime="2025-12-02T17:38:11.811+03:00" amount="97.00" discountAmount="0.00" inn="0210020113" fiscalDocNum="302;3"> <plugin-property key="AGE_VERIFICATION_RESULT" value="{"is_adult": true, "timestamp": 1751558379}"/> <plugin-property key="PROMO_PRINT_DISABLED" value="true"/> <plugin-property key="FISCAL_DOC_ID" value="302"/> <plugin-property key="FN_DOC_NUM_IN_SHIFT" value="2"/> <plugin-property key="AGE_VERIFICATION_SESSION_ID" value="GXo4szIiQL2bBQchr8fjLw"/> <plugin-property key="CASHIER_NAME" value="Иванов Иван Иванович"/> <plugin-property key="UID_PURCHASE" value="c797119a-768d-411a-bc6b-6a818a19c988"/> <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="2025-12-02T17:38:11.890+03:00" insertType="0"> <plugin-property key="lineNumberAfterRegistration" value="1"/> <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>

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

 

© 1994-2025, ООО «Кристалл Сервис Интеграция».
Все права защищены.

Политика обработки персональных данных