Integración de Veriff para Verificación de Identidad
Esta guía describe cómo funciona la solución completa de integración con Veriff, qué componentes la conforman, qué dependencias requiere y cómo comenzar a usarla.
El proyecto implementa un flujo de verificación de identidad con Veriff mediante:
-
Front-end HTML/JavaScript: Muestra la interfaz de usuario, carga el SDK de Veriff, lanza la ventana de verificación y gestiona el estado de la verificación.
-
Back-end PHP:
- Endpoint GET para que el cliente realice polling de la decisión (
index.php?docNumber=...
). - Webhook que recibe los eventos de Veriff (
$_SERVER REQUEST_METHOD === POST
) y guarda la decisión final en archivos JSON. - Clase
DesicionVeriff
para formatear la respuesta de Veriff. - Log de eventos para depurar y auditar.
- Endpoint GET para que el cliente realice polling de la decisión (
-
Interfaz de visualización de eventos (
view_events.php
).
- Servidor web con soporte PHP 8+.
- Escritura en disco para directorios:
/decisions
y/logs
. - Clave pública de Veriff (API Key) para la inicialización del SDK.
- Conexión HTTPS para seguridad (cookie
Secure
). - Navegador moderno con JavaScript habilitado.
-
Clona el repositorio en tu servidor:
git clone https://github.com/miusarname2/TestVeriff cd TestVeriff
-
Configura la API Key
-
Edita
app.js
y reemplaza:apiKey: 'Public API Key',
por tu clave real.
-
-
Asegura los permisos
-
Crea y otorga permisos de escritura a los directorios:
mkdir decisions logs chmod 755 decisions logs
-
-
Despliegue HTTPS
- Configura tu servidor (Apache/Nginx) con un certificado TLS válido.
-
Puntos de entrada
index.html
(o equivalente) cargaapp.js
.index.php
maneja tanto polling en GET como webhook en POST.DesicionVeriff.php
contiene la clase de formateo.view_events.php
muestra el log de eventos.
-
El usuario abre la página HTML.
-
Al hacer clic en "Iniciar verificación", se crea la instancia de Veriff:
- Se pasa un objeto
vendorData
con eldocumentNumber
y campos adicionales. - Se ocultan los inputs de nombre, ya que
person
ya está preconfigurado.
- Se pasa un objeto
-
En el callback
onSession
, se recibe la URL de la sesión y el ID:- Se guarda en
data-veriff-session-id
. - Se monta el iFrame de Veriff.
- Se guarda en
-
El front-end escucha el mensaje
VERIFF_FINISHED
para iniciar el polling. -
La función
pollVerificationResult()
consultaindex.php?docNumber=...
hasta obtener un resultado nopending
. -
Una vez disponible, muestra el resultado en el contenedor
#verification-results
.
-
Ruta:
index.php?docNumber={docNumber}
-
Lógica:
- Obtiene
docNumber
de GET o de cookiesessionId
. - Construye la ruta al archivo JSON:
/decisions/{sessionId}.json
. - Si no existe, responde
{ status: 'pending' }
. - Si existe, lee y devuelve el contenido JSON.
- Obtiene
-
Recepción de eventos
started
,submitted
: responde{'status':'received'}
para ACK. -
Evento
fullauto
constatus==='success'
:- Decodifica
vendorData
para extraerdocumentNumber
. - Genera
sessionId
a partir de él y crea cookie HttpOnly/Secure. - Formatea la respuesta con
DesicionVeriff::formatVerificationJson()
. - Guarda el objeto resultante en
/decisions/{sessionId}.json
. - Registra el evento en
logs/veriff_events.log
. - Responde con
{ status: 'success', message: 'Webhook processed...' }
.
- Decodifica
class DesicionVeriff {
// Recibe decision ('approved'|'rejected') y score
public function __construct(string $decision, string|float $decisionScore, string|int $document) { ... }
// Convierte 'approved' a true, otro caso false
protected function convertDescicionToBool(string $decision): bool { ... }
// Formatea el JSON bruto del webhook a un objeto con campos esenciales
public static function formatVerificationJson(string $jsonDecision): object { ... }
}
view_events.php
muestra el contenido delogs/veriff_events.log
en reversa para ver los eventos más recientes arriba.
-
Campos adicionales: Añade en
vendorData
otros identificadores (ej.:user_id
,company_id
). -
Seguridad:
- Valida y sanitiza
vendorData
ydocNumber
. - Usa HTTPS y cookies seguras.
- Valida y sanitiza
-
UI: Adapta estilos con Tailwind o tu propio CSS.
-
Escalabilidad: En lugar de archivos, almacena las decisiones en base de datos.
data-veriff-vendor-data
no encontrado: Asegúrate de setear el atributo antes de iniciar Veriff.- Permisos de archivos: Verifica lecto-escritura en
/decisions
y/logs
. - Cookie no enviada: Revisa ruta y dominio en
setcookie()
.