Kyc service
kyc-service интеграция: HTTP job submission, callback, OCR result.
Взаимодействие¶
sequenceDiagram
KycEndpoint->>KycQueueService: submitKycJob(userId, kycId, s3Keys)
KycQueueService->>kycsvc: POST /api/v1/process (X-Service-Token)
Note over kycsvc: OCR + face match (async, BullMQ)
kycsvc->>AC: callback POST (faceMatchScore, ocrResult encrypted)
AC->>KycService: autoVerify() если faceMatchScore >= 0.85
AC->>KycService: submitForManualReview() если faceMatchScore < 0.85
Вызов KycQueueService.submitKycJob — fire-and-forget (unawaited). Session может быть уже закрыта к моменту выполнения.
Конфиг из passwords.yaml¶
| Ключ | Dev default | Назначение |
|---|---|---|
kycServiceUrl |
http://10.10.10.19:3003 |
Base URL kyc-service |
kycServiceSecret |
dev-kyc-secret-change-in-prod |
Передаётся в заголовке X-Service-Token |
Что отправляет AC¶
POST $kycServiceUrl/api/v1/process с телом:
| Поле | Тип | Описание |
|---|---|---|
userId |
int | Numeric ID пользователя |
kycId |
int | ID записи kyc_verification |
passportKey |
string | S3 ключ фото паспорта |
selfieKey |
string | S3 ключ селфи |
stampKey |
string? | S3 ключ штампа визы (опционально) |
Ответ: { "jobId": "..." } — логируется, не используется для дальнейшей логики.
Что возвращает kyc-service (callback)¶
kyc-service оборачивает результат OCR в формат:
| Поле | Тип | Описание |
|---|---|---|
faceMatchScore |
double | Уверенность совпадения лица (0.0–1.0) |
ocrData |
object | Распознанные поля паспорта |
ocrResult хранится в kyc_verification.ocrResult как AES-256-GCM зашифрованный ByteData через PiiCryptoService.
Порог autoVerify¶
| Условие | Действие |
|---|---|
faceMatchScore >= 0.85 |
autoVerify() — KYC автоматически одобряется |
faceMatchScore < 0.85 |
submitForManualReview() — статус pending_operator_review |
status = ocr_failed |
retryKycProcessing() — повторная отправка старых S3 ключей |
Retry при ocr_failed¶
KycService.retryKycProcessing(session, userId) — допускается только при status = ocr_failed. Повторно вызывает KycQueueService.submitKycJob с теми же S3 ключами, что уже хранятся в kyc_verification.
Ошибки KycQueueService (DioException и прочие) логируются на уровне SEVERE, но не пробрасываются — операция не откатывается.