Публичное пространство
SetRetail10 ◾️ Подтверждение возраста покупателя по биометрии через MAX на кассах POS и SetTouch
10.4.22.0 10.4.21.5 10.4.20.12
Работа с MAX поддерживается только на кассах, работающих на Java 21.
Кассы, работающие на Java 8, не поддерживают работу с MAX.
- 1 Описание
- 2 Ценность
- 3 Условия работы
- 4 Примеры работы
- 5 Ограничения
- 6 Настройка
- 7 Экспорт
- 8 Статьи по теме
Описание
Реализована возможность подтвердить возраст покупателя с помощью встроенного в мессенджер MAX сервиса биометрической верификации для оформления продажи товаров с возрастным ограничением в случаях отсутствия документа, удостоверяющего личность.
Ценность
Удобство для покупателя:
Позволяет покупателю подтвердить возраст без предъявления бумажного документа.
Соответствие законодательству:
Исключает риски продажи товаров 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-коде.
Настройка
Настройте процессинг по инструкции в статье 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
Настройка текста кнопки подтверждения
В зависимости от разрешения экрана и размеров интерфейсных элементов, стандартная надпись на кнопке может отображаться не полностью (обрезаться).
Стандартное название кнопки - Использовать биометрию - может быть изменено с помощью файла локализации 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Сохраните изменения в файле → перезагрузите кассовый модуль для применения изменений.
Конвертация в Unicode Escape
При редактировании файлов локализации текст на кириллице должен быть сконвертирован в формат Unicode, для этого:
Откройте любой подходящий онлайн-декодер → установите UTF-8 для исходного текста → установите Unicode Escape для результата расшифровки.
Вставьте значение ключа → нажмите Расшифровать → скопируйте полученное значение.
Экспорт
В выгрузке чека в плагинные свойства сохраняется результат проверки возраста:
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>Статьи по теме
https://crystals.atlassian.net/wiki/spaces/SR10SUPPORT/pages/5583831117
https://crystals.atlassian.net/wiki/spaces/SR10SUPPORT/pages/447709476
https://crystals.atlassian.net/wiki/spaces/SR10SUPPORT/pages/447644006
© 1994-2025, ООО «Кристалл Сервис Интеграция».
Все права защищены.