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.