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
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"
}
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}}
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
}'
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
}
Este método garantiza unicidad y cumplimiento con Previred. Debe aplicarse de manera consistente.