Skip to main content

KYC события

Love&Pay отправляет вебхуки о результатах KYC верификации.

Доступные события

СобытиеОписание
kyc.completedВерификация успешно завершена
kyc.failedВерификация не пройдена

kyc.completed

Отправляется при успешном прохождении KYC верификации.
{
  "id": "evt_kyc001",
  "type": "kyc.completed",
  "createdAt": "2024-01-15T14:00:00Z",
  "data": {
    "session": {
      "id": "kyc_abc123def456",
      "level": "basic",
      "status": "completed",
      "verifiedData": {
        "firstName": "Иван",
        "lastName": "Петров",
        "dateOfBirth": "1990-05-15",
        "nationality": "RU",
        "documentType": "passport",
        "documentNumber": "****5678"
      },
      "metadata": {
        "userId": "user_12345",
        "email": "[email protected]"
      },
      "createdAt": "2024-01-15T10:30:00Z",
      "completedAt": "2024-01-15T14:00:00Z"
    }
  }
}

kyc.failed

Отправляется при неудачной KYC верификации.
{
  "id": "evt_kyc002",
  "type": "kyc.failed",
  "createdAt": "2024-01-15T14:00:00Z",
  "data": {
    "session": {
      "id": "kyc_abc123def456",
      "level": "basic",
      "status": "failed",
      "failureReason": "document_expired",
      "failureDetails": "Срок действия документа истёк. Пожалуйста, используйте действующий документ.",
      "metadata": {
        "userId": "user_12345",
        "email": "[email protected]"
      },
      "createdAt": "2024-01-15T10:30:00Z",
      "failedAt": "2024-01-15T14:00:00Z"
    }
  }
}

Обработка KYC событий

app.post('/webhooks/loveandpay', (req, res) => {
  // Верификация подписи (см. раздел Верификация подписи)

  const event = req.body;

  switch (event.type) {
    case 'kyc.completed':
      handleKycCompleted(event.data.session);
      break;
    case 'kyc.failed':
      handleKycFailed(event.data.session);
      break;
  }

  res.status(200).json({ received: true });
});

async function handleKycCompleted(session) {
  const userId = session.metadata.userId;

  // Обновляем статус пользователя в базе
  await db.users.update({
    where: { id: userId },
    data: {
      kycStatus: 'verified',
      kycLevel: session.level,
      kycVerifiedAt: session.completedAt,
      // Сохраняем верифицированные данные
      firstName: session.verifiedData.firstName,
      lastName: session.verifiedData.lastName,
      dateOfBirth: session.verifiedData.dateOfBirth
    }
  });

  // Отправляем уведомление пользователю
  await sendEmail(session.metadata.email, 'kyc-success', {
    firstName: session.verifiedData.firstName
  });

  console.log(`KYC пройден для пользователя ${userId}`);
}

async function handleKycFailed(session) {
  const userId = session.metadata.userId;

  // Обновляем статус
  await db.users.update({
    where: { id: userId },
    data: {
      kycStatus: 'failed',
      kycFailureReason: session.failureReason
    }
  });

  // Уведомляем пользователя о необходимости повторной верификации
  await sendEmail(session.metadata.email, 'kyc-failed', {
    reason: session.failureDetails
  });

  console.log(`KYC не пройден для пользователя ${userId}: ${session.failureReason}`);
}

Рекомендации

Используйте metadata

Передавайте userId и другие идентификаторы в metadata для связи с вашей системой

Обрабатывайте оба события

Всегда обрабатывайте как успешные, так и неудачные верификации

Уведомляйте пользователей

Информируйте пользователей о результате верификации по email

Предлагайте повтор

При неудаче предложите пользователю пройти верификацию повторно

Причины отказа

КодОписаниеРекомендация пользователю
document_expiredДокумент просроченИспользуйте действующий документ
document_unreadableПлохое качество фотоСделайте чёткое фото при хорошем освещении
document_mismatchДанные не совпадаютПроверьте правильность введённых данных
selfie_mismatchЛицо не распознаноСнимите очки, головной убор, обеспечьте хорошее освещение
suspected_fraudПодозрение на мошенничествоСвяжитесь со службой поддержки
unsupported_documentТип документа не поддерживаетсяИспользуйте паспорт или ID-карту