API リファレンス:アーキテクチャ、フィールド、ステータスコード

すべての操作に共通する構成要素:リクエストフロー、共通 JSON フィールド、テンプレートタイプ、ステータスコード、ポート、ペイロード暗号化。

API アーキテクチャ

項目コールバック APIRESTful API
開始側機器 / Biometric Gatewayお客様のサーバー
方向機器 → お客様のサーバーお客様のサーバー → 機器
レイテンシリアルタイム(ミリ秒)約 15 秒
トリガー機器上の生体認証イベントお客様のコードからの HTTP POST
お客様の役割受信して応答するコマンドを送信し、応答をポーリング/待機する
レスポンスボディ{"status":"done"}{"Status":"done","OperationID":"…","StatusCode":0}
オフライン時の動作エンジンがキャッシュし、サーバーの復旧後に配信エンジンがキューに保持し、機器の再接続後に配信

共通フィールド

コールバックと RESTful のすべてのリクエストは、次のトップレベルフィールドを共通で使用します。

AuthTokenString。特定の機器からのリクエストを識別・認証する 32 文字のトークンです。API Monitor ポータルで設定します。受信するすべてのコールバックで検証してください。
OperationIDString。この操作インスタンスを一意に識別する ID です(例:"j95xfejt3vr1")。RESTful のレスポンスは同じ OperationID を返すため、リクエストとレスポンスを対応付けられます。
TimeString。イベントが処理された時刻の UTC タイムスタンプで、形式は YYYY-MM-DD HH:mm:ss GMT +0000 です。ペイロード内の機器ローカルのタイムスタンプは、異なるタイムゾーンオフセットを使用する場合があります。
stgid (クエリパラメータ)String。Service Tag ID — RESTful API 呼び出しの対象機器を識別します。API Monitor アカウントに記載のエンドポイントに URL クエリパラメータとして渡します:POST https://<your-endpoint>?stgid=YOUR_TAG_ID。

テンプレートタイプ

生体データと認証情報は Template 配列で運ばれます。各項目には Type フィールドがあります:

テンプレートのマージ動作 — コールバックハンドラー実装時の重要事項
機器からユーザーデータがプッシュされる場合(コールバック操作 #3~#9)、テンプレートは複数のコールバックに分かれて、1 件ずつまたはグループで届くことがあります。各コールバックにはユーザーのテンプレート一式が含まれるわけではなく、追加または変更されたテンプレートのみが含まれます。

サーバーは、受信したテンプレートをそのユーザーの保存済みテンプレートとマージする必要があります。各テンプレートの一意キーは Type + Index です。例:
• コールバック 1 が Fingerprint Index 0 を送信 → 保存
• コールバック 2 が Face Index 0 + Card を送信 → マージし、指紋は上書きしない
• コールバック 3 が Fingerprint Index 0(新しいデータ)を送信 → Index 0 の既存の指紋を更新
コールバックですべてのテンプレートを置き換えないでください。必ず Type + Index でアップサート(upsert)してください。
タイプ説明主な追加フィールド
CardRFID / 近接カード番号Data(カード番号の文字列)
Password数字の PINData(PIN 文字列)
Fingerprint指紋テンプレート — Base64 エンコードされたバイナリIndex(指のインデックス 0~9)、Size、Data
Face顔テンプレート — Base64 エンコードされた JPEG またはバイナリIndex, Size, Data
Palm手のひら静脈テンプレート — Base64 エンコードされたバイナリIndex, Data
UserPhotoユーザーのプロフィール写真 — Base64 エンコードされた JPEGData

レスポンスステータスコード

RESTful API のレスポンスには数値の StatusCode が含まれます。コールバック API のレスポンスは、結果にかかわらず常にシンプルな {"status":"done"} 形式です。

コードステータス説明
0成功操作が正常に完了しました。
1リクエストデータが無効JSON ボディの形式が不正、または無効な値が含まれています。
2Service Tag ID が無効stgid クエリパラメータが、登録済みのどの機器とも一致しません。
3リクエストが無効リクエストの構造が、期待される操作の形式と一致しません。
4暗号化が無効ペイロードの暗号化(AES-256)を復号できませんでした。暗号化キーをご確認ください。
5機器オフライン対象の機器は現在 Biometric Gateway に接続されていません。
6操作タイムアウト機器がタイムアウト時間内にコマンドに応答しませんでした。
7認証トークンが無効リクエスト内の AuthToken が、機器に設定されたトークンと一致しません。
8ユーザーが既に存在機器に既に存在する UserID に対して追加操作が試行されました。
9ユーザーが見つかりません指定された UserID は機器に存在しません。
10テンプレートエラー生体テンプレートデータが破損しているか、未対応の形式です。
11機器のメモリ不足機器がユーザー数またはテンプレート数の上限に達しています。
13セキュリティキーが無効API Monitor に設定されたセキュリティキーが一致しません。
15機能非対応要求された操作は、この機器モデルまたは通信モードではサポートされていません。
999不明なエラー予期しないエラーが発生しました。OperationID を添えて Cams サポートまでお問い合わせください。

対応ポート

リアルタイムの勤怠情報を受信するには、サーバーで Cams Protocol Engine から到達可能な HTTP(S) エンドポイントを公開する必要があります。

ポートプロトコル用途
80HTTP本番環境。コールバック URL をポート 80 にバインドします。API Monitor で設定し、打刻時に自動的に呼び出されます。
443HTTPS本番環境(セキュア)。有効な SSL 証明書を使用した HTTPS。本番環境での利用を推奨します。
8123HTTPテスト専用。開発中に一時的に利用できる非標準ポートです。
HTTPS を推奨します。本番環境では有効な SSL 証明書を使用した HTTPS をご利用ください。サーバーの再起動なしで自動更新されるようにしてください。

サンプルデータ

全 38 操作のサンプルのリクエスト/レスポンスペイロードは、上記の各操作セクションに記載されています。まとめて確認する場合:

このページ上記の各操作セクションには、コピーしてそのまま使えるサンプルデータ付きのリクエスト/レスポンス JSON が含まれています。
旧サンプルページbiometric-web-api-sample-request-response.html — 操作ごとのドロップダウンセレクター付き。106 給与計算

暗号化

オプションの AES-256 暗号化を有効にすると、Cams Protocol Engine とお客様のサーバー間でやり取りするすべてのデータを暗号化できます。

アルゴリズムAES-256、ECB モード、PKCS5 パディング(AES/ECB/PKCS5PADDING)。
キーの設定API Monitor で、キーを Security Key として設定します。設定すると、すべての raw JSON ペイロードが暗号化されます。
エンコード暗号化されたペイロードは、HTTP で安全に転送するため Base64 エンコードされます。

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");
重要:暗号化を有効にした場合は、受信したコールバックのペイロードを復号し、送信する RESTful リクエストボディを同じキーで暗号化してください。