10 KiB
chestny-znak-web-app — План реализации тестового web-приложения для API Честного знака
Статус: Активен
Описание задачи
Проанализировать API «Честный знак» (ГИС МТ, True API) и создать план реализации тестового web-приложения, которое позволяет:
- Авторизоваться в системе (подписать тестовый набор данных УКЭП)
- Получить информацию о QR-кодах (КМ) из УПД — актуальны или нет
Результаты анализа API
Документация True API
| Параметр | Значение |
|---|---|
| Официальная документация | https://docs.crpt.ru/gismt/True_API/ |
| Тестовый контур (sandbox) | https://markirovka.sandbox.crptech.ru/api/v3/true-api |
| Промышленный контур | https://markirovka.crpt.ru/api/v3/true-api |
| Версия API | v3/v4 |
| Формат | REST, JSON |
| Аутентификация | УКЭП (ГОСТ, CAdES-BES) → Bearer token |
Процесс аутентификации (Единая аутентификация)
Шаг 1: GET /auth/key → { uuid, data }
(получаем UUID и случайную строку для подписи)
Шаг 2: Подписать data УКЭП (CAdES-BES, присоединённая подпись, base64)
(требуется КриптоПро или совместимое СКЗИ)
Шаг 3: POST /auth/simpleSignIn → { token, uuidToken?, expireDate? }
Body: { uuid: "<uuid>", data: "<base64 signature>" }
- Срок действия токена: не более 10 часов
- Форматы токена: JWT (по умолчанию) или UUID (параметр
unitedToken: true) - Поддержка JWT — до марта 2026 года, UUID — основной формат
Ключевые методы для задачи
| Метод | Endpoint | Описание |
|---|---|---|
| Получение информации о КМ | POST /api/v3/true-api/cises/info |
Статус, производитель, собственник, GTIN |
| Проверка кодов (розница) | POST /api/v4/true-api/codes/check |
Проверка перед продажей |
| Публичная проверка | GET https://mobile.api.crpt.ru/mobile/check?code=<код> |
Без авторизации (недокументированный эндпоинт моб. приложения) |
| Поиск КМ | POST /api/v4/true-api/cises/search |
Поиск по фильтрам |
Пример публичного API (без авторизации)
Запрос:
GET https://mobile.api.crpt.ru/mobile/check?code=0104640507713421215TxdVFoOB.zFF
Ответ (JSON):
{
"code": "0104640507713421215TxdVFoOB.zFF",
"found": true,
"valid": true,
"status": "INTRODUCED"
}
Ограничения публичного API:
- Не требует аутентификации — можно использовать для быстрой проверки единичных кодов
- Возвращает минимум данных: только статус и флаг валидности
- Не подходит для пакетной проверки (по одному коду за запрос)
- Не документирован официально (эндпоинт мобильного приложения)
Для полноценной проверки КМ из УПД рекомендуется использовать авторизованный метод POST /api/v3/true-api/cises/info, который возвращает полную информацию: GTIN, наименование товара, производителя, владельца, дату ввода в оборот и т.д.
Структура ответа /cises/info
{
"cisInfo": [{
"requestedCis": "0104600702028445...",
"cis": "0104600702028445...",
"gtin": "04600702028445",
"status": "INTRODUCED",
"productName": "Молоко 3.2%",
"productGroup": "Молочная продукция",
"producerName": "АО \"Данон Россия\"",
"ownerName": "ООО Магнит",
"ownerBin": "2309085638",
"producedDate": "2025-01-15T10:00:00.000Z",
"packageType": "UNIT"
}]
}
Статусы КМ: EMITTED (эмитирован), APPLIED (нанесён), INTRODUCED (в обороте), RETIRED (выбыл), WRITTEN_OFF (списан), DISAGGREGATION (расформирован), CANCELLED (аннулирован)
Работа с УПД
- Коды маркировки в XML УПД (формат Приказа №970 ФНС) находятся в элементе
Документ/ТаблСчФакт/СведТов/ДопСведТов/НомСредИдентТов - При проверке QR-кодов из УПД необходимо:
- Загрузить XML УПД (формат 970 приказа)
- Распарсить XML по XPath:
//Документ/ТаблСчФакт/СведТов/ДопСведТов/НомСредИдентТов - Извлечь все коды маркировки
- Отправить запрос в
/cises/info(с авторизацией) - Отобразить статус каждого кода
Шаги
-
1. Инициализация проекта — создать Fastify/Express backend + React frontend. Оба сервиса запускаются через
docker-compose -
2. Backend: модуль аутентификации
- 2.1. Реализовать
GET /auth/key— получение UUID + data от True API - 2.2. Реализовать подпись data через КриптоПро с помощью
@vgoma/crypto-pro(Node.js binding для КриптоПро CSP) - 2.3. Реализовать
POST /auth/simpleSignIn— получение токена - 2.4. Кеширование и auto-refresh токена (раз в 10 часов)
- 2.1. Реализовать
-
3. Backend: модуль проверки КМ
- 3.1. Реализовать
POST /api/check-codes— принимает массив кодов маркировки - 3.2. Вызов
POST /api/v3/true-api/cises/infoдля каждого кода (батчами до 1000) - 3.3. Возврат статуса: актуален / неактуален / не найден / ошибка
- 3.1. Реализовать
-
4. Backend: модуль обработки УПД
- 4.1. Приём XML-файла УПД через
POST /api/upload-upd - 4.2. Парсинг XML, извлечение кодов маркировки из
НомСредИдентТов - 4.3. Передача кодов в модуль проверки КМ (шаг 3)
- 4.1. Приём XML-файла УПД через
-
5. Frontend: страница авторизации
- 5.1. Форма ввода/загрузки сертификата УКЭП
- 5.2. Отображение статуса авторизации и срока действия токена
-
6. Frontend: страница проверки QR-кодов
- 6.1. Проверка одного кода — поле ввода + две кнопки:
- «Проверить без авторизации» — через публичный API (
mobile.api.crpt.ru/mobile/check), минимум данных - «Проверить с авторизацией» — через
POST /cises/info, полная информация: GTIN, наименование, производитель, владелец, статус
- «Проверить без авторизации» — через публичный API (
- 6.2. Загрузка XML УПД (формат 970 приказа) — drag & drop / file picker, парсинг на backend, пакетная проверка через
/cises/info - 6.3. Таблица результатов: код, GTIN, наименование, статус, производитель, владелец
- 6.4. Цветовая индикация: зелёный (актуален / в обороте), красный (выбыл / списан), жёлтый (предупреждение)
- 6.1. Проверка одного кода — поле ввода + две кнопки:
-
7. Тестирование на sandbox
- 7.1. Получение тестового УКЭП через testca2012.cryptopro.ru
- 7.2. Регистрация в sandbox (markirovka.sandbox.crptech.ru)
- 7.3. Интеграционные тесты: авторизация → проверка кодов
-
8. Docker-сборка
- 8.1.
Dockerfile.backend— backend-образ с Node.js + установленным КриптоПро CSP (crypto-pro) - 8.2.
Dockerfile.frontend— nginx-образ со статикой React-приложения - 8.3.
docker-compose.yml— сервисыbackend,frontend, общая сеть - 8.4. README с инструкцией по запуску (
docker-compose up --build)
- 8.1.
-
9. Переключение контура (sandbox/prod) из UI
- 9.1. Backend: два набора URL (
envUrls) вconfig.ts, per-env кеш токенов - 9.2. Backend: все сервисы и роуты принимают
?env=sandbox|prod - 9.3. Frontend:
<select>в хедере,getEnv()/setEnv()в модуле API - 9.4. QA-доработки:
onUnauthorizedпередаёт env — логаут правильного контура при 401window.confirmпри переключении на промышленный контурsetPage('auth')при смене envgetAuthStatusпри переключении — восстановлениеauthenticatedесли токен живuploadUpdчерез общийrequest()(устранено дублирование)
- 9.1. Backend: два набора URL (
Затрагиваемые сервисы
backend/— Fastify/Express backend с модулями:auth-service— получение и менеджмент токена True APIcrypto-service— подпись данных через@vgoma/crypto-pro(КриптоПро CSP)cises-service— проверка статусов кодов маркировки через/cises/infoupd-parser— парсинг XML УПД и извлечение кодов
frontend/— React (Next.js) SPA:- Страница авторизации
- Страница проверки кодов
- Компонент загрузки УПД