Довідник API: архітектура, поля та коди статусів

Базові елементи, спільні для всіх операцій: схема запитів, спільні поля JSON, типи шаблонів, коди статусів, порти та шифрування payload.

Архітектура API

ПараметрCallback APIRESTful API
ІніціаторПристрій / Biometric GatewayВаш сервер
НапрямокПристрій → ваш серверВаш сервер → пристрій
ЗатримкаУ реальному часі (мілісекунди)~15 секунд
ТригерБіометрична подія на пристроїHTTP POST із вашого коду
Ваша рольПрийняти та підтвердитиНадіслати команду та очікувати відповідь
Тіло відповіді{"status":"done"}{"Status":"done","OperationID":"…","StatusCode":0}
Поведінка в офлайніКешується рушієм; доставляється, коли сервер знову онлайнСтавиться рушієм у чергу; доставляється, коли пристрій перепідключиться

Спільні поля

Усі запити — і Callback, і RESTful — використовують такі спільні поля верхнього рівня.

AuthTokenРядок. 32-символьний токен, що ідентифікує та автентифікує запити від конкретного пристрою. Налаштовується на порталі API Monitor. Перевіряйте його під час кожного вхідного callback.
OperationIDРядок. Унікальний ідентифікатор екземпляра операції (наприклад, "j95xfejt3vr1"). У відповідях RESTful повертається той самий OperationID, що дає змогу зіставляти запити та відповіді.
TimeРядок. Мітка часу UTC обробки події у форматі YYYY-MM-DD HH:mm:ss GMT +0000. Мітки часу пристрою всередині payload можуть використовувати інший часовий пояс.
stgid (параметр запиту)Рядок. Service Tag ID — ідентифікує цільовий пристрій для викликів RESTful API. Передається як параметр запиту URL на endpoint, указаний у вашому обліковому записі API Monitor: POST https://<your-endpoint>?stgid=YOUR_TAG_ID.

Типи шаблонів

Біометричні дані та дані облікових даних передаються в масиві Template. Кожен елемент має поле Type:

Злиття шаблонів — важливо для обробників callback
Коли дані користувача передаються з пристрою (операції Callback №3–№9), шаблони можуть надходити по одному або групами в кількох callback. Кожен callback не містить повний набір шаблонів користувача — лише додані або змінені шаблони.

Ваш сервер має об'єднувати вхідні шаблони з уже збереженими шаблонами цього користувача. Унікальний ключ шаблону — Type + Index. Наприклад:
• Callback 1 надходить із Fingerprint Index 0 → збережіть його
• Callback 2 надходить із Face Index 0 + Card → об'єднайте, не перезаписуючи відбиток
• Callback 3 надходить із Fingerprint Index 0 (нові дані) → оновіть наявний відбиток з Index 0
Ніколи не замінюйте всі шаблони під час callback — завжди виконуйте upsert за Type + Index.
ТипОписОсновні додаткові поля
CardНомер RFID-картки / картки безконтактного доступуData (рядок із номером картки)
PasswordЦифровий PIN-кодData (рядок із PIN-кодом)
FingerprintШаблон відбитка пальця — двійкові дані в кодуванні Base64Index (індекс пальця 0–9), Size, Data
FaceШаблон обличчя — JPEG або двійкові дані в кодуванні Base64Index, Size, Data
PalmШаблон вен долоні — двійкові дані в кодуванні Base64Index, Data
UserPhotoФото профілю користувача — JPEG у кодуванні Base64Data

Коди статусу відповіді

Відповіді RESTful API містять числовий StatusCode. Відповіді Callback API завжди мають просту форму {"status":"done"} незалежно від результату.

КодСтатусОпис
0УспішноОперацію виконано успішно.
1Недійсні дані запитуТіло JSON має неправильний формат або містить недійсні значення.
2Недійсний Service Tag IDПараметр запиту stgid не відповідає жодному зареєстрованому пристрою.
3Недійсний запитСтруктура запиту не відповідає очікуваному формату операції.
4Недійсне шифруванняНе вдалося розшифрувати payload (AES-256). Перевірте ключ шифрування.
5Пристрій офлайнЦільовий пристрій наразі не підключений до Biometric Gateway.
6Тайм-аут операціїПристрій не підтвердив команду протягом відведеного часу.
7Недійсний Auth TokenAuthToken у запиті не збігається з токеном, налаштованим для пристрою.
8Користувач уже існуєСпробу операції Add виконано для UserID, який уже існує на пристрої.
9Користувача не знайденоУказаний UserID не існує на пристрої.
10Помилка шаблонуДані біометричного шаблону пошкоджені або мають непідтримуваний формат.
11Пам'ять пристрою заповненаПристрій досяг максимальної місткості за користувачами або шаблонами.
13Недійсний ключ безпекиКлюч безпеки, указаний в API Monitor, не збігається.
15Функція не підтримуєтьсяЗапитувана операція не підтримується цією моделлю пристрою або режимом обміну даними.
999Невідома помилкаСталася непередбачена помилка. Зверніться до служби підтримки Cams, указавши OperationID.

Підтримувані порти

Щоб отримувати дані про відвідуваність у реальному часі, ваш сервер має надавати HTTP(S) endpoint, доступний для Cams Protocol Engine.

ПортПротоколПризначення
80HTTPРобоче середовище. Прив'яжіть ваш callback URL до порту 80. Налаштовується в API Monitor і викликається автоматично під час відміток.
443HTTPSРобоче середовище (захищено). HTTPS із дійсним SSL-сертифікатом. Рекомендовано для робочого середовища.
8123HTTPЛише для тестування. Нестандартний порт, тимчасово доступний на час розробки.
Рекомендовано HTTPS. Використовуйте HTTPS із дійсним SSL-сертифікатом у робочому середовищі. Забезпечте автоматичне подовження без перезапуску сервера.

Приклади даних

Приклади запитів і відповідей payload для всіх 38 операцій наведено вище в розділі кожної операції. Зведене подання:

Ця сторінкаУ кожному розділі операції вище є готові до копіювання JSON запиту та відповіді з прикладами даних.
Застаріла сторінка з прикладамиbiometric-web-api-sample-request-response.html — випадаючий список для вибору кожної операції.

Шифрування

Для всіх даних, якими обмінюються Cams Protocol Engine і ваш сервер, можна ввімкнути додаткове шифрування AES-256.

АлгоритмAES-256 у режимі ECB із доповненням PKCS5 (AES/ECB/PKCS5PADDING).
Налаштування ключаВкажіть свій ключ як Security Key в API Monitor. Після налаштування всі чисті JSON-payload шифруються.
КодуванняЗашифровані payload кодуються в Base64 для безпечної передачі по HTTP.

Приклад на Java

Шифрування / розшифрування (Java)
// Encryption
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
SecretKeySpec keySpec = new SecretKeySpec(securityKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
String encrypted = Base64.getEncoder().encodeToString(cipher.doFinal(rawJson.getBytes("UTF-8")));

// Decryption
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decoded = Base64.getDecoder().decode(encryptedPayload);
String decrypted = new String(cipher.doFinal(decoded), "UTF-8");
Важливо: якщо шифрування ввімкнено, розшифровуйте вхідні payload Callback і шифруйте тіла вихідних запитів RESTful за допомогою того самого ключа.