Skip to main content

Overview

Este documento describe el proceso de Traspasos entre las Administradoras de Fondos de Pensiones (AFPs) y Previred, garantizando la validación de identidad de afiliados y agentes de ventas antes de transferencias de fondos.

El servicio es desarrollado por FacePhi como Proveedor de Verificación de Identidad (PVI), y es consumido por Previred para validar la identidad en traspasos entre AFPs.


1️⃣ Validación de Identidad por AFP

La AFP valida la identidad del usuario mediante el proceso de Onbording que involucra estos servicios:

  • {{baseUrlIdentity}}/verify/documentValidation/v2/start
  • {{baseUrlIdentity}}/onboarding/v2/identity
  • {{baseUrlIdentity}}/verify/documentValidation/v2/status
  • {{baseUrlIdentity}}/verify/documentValidation/v2/data
note

Validaciones requeridas antes de procesar traspasos:

  • facialAuthenticationResult = 3 (Autenticación facial exitosa)
  • passiveLivenessResult = 3 (Prueba de vida superada)
  • documentValidation = 9001 (Validación documental aprobada)

2️⃣ Consumo del Servicio de Verificación

La AFP consume el servicio con la siguiente petición:

curl --location '{{baseUrlIdentity}}/services/previred/{{serviceTransactionId}}/verify' \
--header 'x-api-key: {{apiKey}}' \
--header 'Content-Type: application/json' \
--data '{
"scanReference": "{{scanReference}}"
}'

Ejemplo de Respuesta:

{
"token": "MUOJHSYODkRtgVENLbXXXpujiDHqGTYS"
}
caution

Almacenar el token de manera segura, ya que es requerido en los siguientes pasos.


3️⃣ Envío de Evidencia de Verificación a Previred

La AFP debe enviar url_verificacion a Previred como prueba de validación.

🔗 Formato de la URL:

{{baseUrlIdentity}}/services/previred/{{serviceTransactionId}}/certificate?token={{token}}&apiKey={{previredApiKey}}
note

El apiKeyPrevired se acompaña de username y password para autenticación.

Llamada a Previred:

curl --location '{{baseUrlPrevired}}/tvi/solicitudTokenWS' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic {{authToken}}' \
--data '{
"afiliado": {
"nombre": "{{nombre_afiliado}}",
"apellido_paterno": "{{apellido_paterno_afiliado}}",
"apellido_materno": "{{apellido_materno_afiliado}}",
"rut_numero": "{{rut_numero_afiliado}}",
"dv": "{{dv_afiliado}}",
"verificacion": {
"identificacion_proveedor": "{{identificacion_proveedor}}",
"fecha_verificacion": "{{fecha_verificacion}}",
"url_verificacion": "{{baseUrlIdentity}}/services/previred/{{serviceTransactionId}}/certificate?token={{token}}&apiKey={{previredApiKey}}",
"url_usuario": "{{username}}",
"url_clave": "{{password}}",
"tipo_verificacion": "{{tipo_verificacion}}",
"codigo_verificacion": "{{codigo_verificacion}}"
}
},
"codigo_institucion": "{{codigo_institucion}}",
"requiere_segunda_verificacion": false
}'
caution

El campo codigo_verificacion debe cumplir con las restricciones de Previred, por lo que se genera a partir del serviceTransactionId en formato Base64 URL-safe. Para más detalles, consulta la sección 🔄 Formato de UUID para Previred.

Ejemplo de Respuesta:

{
"respuesta": {
"codigo": 200,
"mensaje": "Ticket generado exitosamente",
"ticket_tvi": "17416257523259999232077343926588:...",
"fecha": "20250310 135552",
"errores": []
}
}

Llamada para obtener token de Previred:

curl --location '{{baseUrlPrevired}}/tvi/obtenerTokenWS' \
--header 'Content-Type: application/json' \
--data '{
"codigo_institucion": "9999",
"ticket_tvi": "{{ticket_tvi}}"
}'

Ejemplo de Respuesta:

{
"respuesta": {
"codigo": 200,
"mensaje": "OK",
"token": "2N/BNwHs6kMlVKKEPsFi6fpPjf5I/x0X+IFKFk/EhWZn3vQIvY4FQbORNpzPpOFsO7Gp/jiiCzhE5EnLgjSTUg==",
"fecha": "20250310 135555",
"errores": []
}
}

🔄 Formato de UUID para Previred

Previred impone un límite de 30 caracteres en codigo_verificacion. Los UUID (36 caracteres) se transforman a Base64 URL-safe sin padding.

Conversión de UUID a Base64 URL-safe: Ejemplo:

  • UUID original: 3994d0f4-77c2-4079-8fd3-ccd14e90f909
  • UUID convertido: OTlEbw93wkCeNMzNF5D5CQ

Implementación en Go:

import (
"encoding/base64"
"github.com/google/uuid"
)

func ShortID(ID string) string {
tID := uuid.MustParse(ID) // Parse UUID
marshalled, _ := tID.MarshalBinary() // Convertir a binario
return base64.RawURLEncoding.EncodeToString(marshalled) // Base64 sin padding
}
caution

Este método garantiza unicidad y cumplimiento con Previred. Debe aplicarse de manera consistente.