Rutas de Redirección
Endpoints para manejo de redirecciones de Bridge tras completar procesos.
1. Éxito en Bridge
GET /bridge/success
Redirección exitosa después de firmar ToS en Bridge.
Query Parameters:
signed_agreement_id(string): ID del acuerdo firmadouser_token(string): Token de usuario
Ejemplo de URL:
GET /bridge/success?signed_agreement_id=agr_123&user_token=uuid-token-123
Comportamiento: Redirección automática a:
https://tu-frontend.com/registro-exitoso?customer_id=bridge_customer_123
2. Fallo en Bridge
GET /bridge/failed
Redirección de fallo en Bridge.
Query Parameters (opcionales):
error(string): Código de errormessage(string): Mensaje de error
Ejemplo de URL:
GET /bridge/failed?error=verification_failed&message=Documents rejected
Comportamiento: Redirección automática a:
https://tu-frontend.com/error?reason=bridge_verification_failed
🔄 Flujo de Redirección
Proceso Exitoso
- Usuario firma ToS en portal de Bridge
- Bridge redirecciona a
/bridge/successcon parámetros - Backend procesa la información y actualiza estado
- Redirección final al frontend con datos del customer
Proceso Fallido
- Error en Bridge (documentos rechazados, etc.)
- Bridge redirecciona a
/bridge/failedcon error - Backend registra el fallo en logs
- Redirección final al frontend con mensaje de error
📋 Parámetros de Éxito
signed_agreement_id
- Tipo: String
- Descripción: ID único del acuerdo firmado
- Ejemplo:
agr_abc123def456 - Uso: Verificar que el acuerdo se firmó correctamente
user_token
- Tipo: String (UUID)
- Descripción: Token temporal del usuario
- Ejemplo:
550e8400-e29b-41d4-a716-446655440000 - Uso: Identificar al usuario y vincular con customer
📋 Parámetros de Error
error
- Tipo: String
- Valores comunes:
verification_failed- Verificación KYC fallidadocuments_rejected- Documentos rechazadosinvalid_data- Datos inválidostimeout- Tiempo de sesión agotado
message
- Tipo: String
- Descripción: Mensaje descriptivo del error
- Ejemplo:
"Documents do not meet verification requirements"
🏠 URLs de Frontend
Configuración por Ambiente
Producción
const FRONTEND_URLS = {
success: 'https://app.swapbits.com/onboarding/success',
error: 'https://app.swapbits.com/onboarding/error'
};
Staging
const FRONTEND_URLS = {
success: 'https://staging.swapbits.com/onboarding/success',
error: 'https://staging.swapbits.com/onboarding/error'
};
Desarrollo
const FRONTEND_URLS = {
success: 'http://localhost:3000/onboarding/success',
error: 'http://localhost:3000/onboarding/error'
};
🔍 Procesamiento Backend
Éxito - /bridge/success
app.get('/bridge/success', async (req, res) => {
try {
const { signed_agreement_id, user_token } = req.query;
// 1. Validar parámetros
if (!signed_agreement_id || !user_token) {
return res.redirect(`${FRONTEND_URL}/error?reason=invalid_params`);
}
// 2. Buscar usuario por token
const user = await findUserByToken(user_token);
if (!user) {
return res.redirect(`${FRONTEND_URL}/error?reason=user_not_found`);
}
// 3. Obtener datos del customer en Bridge
const customer = await bridge.getCustomerByAgreement(signed_agreement_id);
// 4. Actualizar base de datos
await updateUserBridgeCustomer(user.id, customer.id);
// 5. Redireccionar al frontend
res.redirect(`${FRONTEND_URL}/success?customer_id=${customer.id}`);
} catch (error) {
logger.error('Bridge success redirect failed:', error);
res.redirect(`${FRONTEND_URL}/error?reason=processing_error`);
}
});
Error - /bridge/failed
app.get('/bridge/failed', (req, res) => {
const { error, message } = req.query;
// Log del error para debugging
logger.warn('Bridge redirect failed:', { error, message });
// Redireccionar con información del error
const params = new URLSearchParams({
reason: 'bridge_verification_failed',
error_code: error || 'unknown',
error_message: message || 'Verification failed'
});
res.redirect(`${FRONTEND_URL}/error?${params.toString()}`);
});
📱 Manejo en Frontend
Página de Éxito
// /onboarding/success
useEffect(() => {
const urlParams = new URLSearchParams(window.location.search);
const customerId = urlParams.get('customer_id');
if (customerId) {
// Actualizar estado de usuario
setUserVerificationStatus('verified');
// Mostrar mensaje de éxito
showSuccessMessage('¡Verificación completada exitosamente!');
// Redireccionar al dashboard
setTimeout(() => {
navigate('/dashboard');
}, 3000);
}
}, []);
Página de Error
// /onboarding/error
useEffect(() => {
const urlParams = new URLSearchParams(window.location.search);
const reason = urlParams.get('reason');
const errorCode = urlParams.get('error_code');
// Mostrar mensaje de error específico
const errorMessages = {
verification_failed: 'No se pudo verificar tu identidad',
documents_rejected: 'Los documentos fueron rechazados',
timeout: 'El tiempo de verificación ha expirado'
};
showErrorMessage(errorMessages[errorCode] || 'Error en la verificación');
}, []);
⚠️ Errores Comunes
Parámetros Faltantes
- Problema: URLs sin parámetros requeridos
- Solución: Validar parámetros y redireccionar con error
Tokens Expirados
- Problema: user_token no válido o expirado
- Solución: Generar nuevo ToS link
Customer No Encontrado
- Problema: signed_agreement_id inválido
- Solución: Verificar configuración de Bridge
📝 Notas Importantes
- Las redirecciones son GET requests sin autenticación
- Los tokens son de un solo uso y expiran
- Siempre validar parámetros antes de procesar
- Logs detallados para debugging de problemas
- URLs de frontend configurables por ambiente