Integraciones
CAPI App se integra con múltiples servicios externos para proporcionar funcionalidades avanzadas.
Stripe
Suscripciones
Stripe maneja las suscripciones mensuales de las clínicas.
Flujo de Suscripción
- Clínica selecciona plan (Starter, Premium, Elite)
- App crea checkout session vía N8N
- Usuario completa pago en Stripe
- Webhook de Stripe notifica a N8N
- N8N actualiza estado en Firestore
- App sincroniza estado de suscripción
Configuración
class="highlight">
1
2
3
4
5
6
// En app_constants.dart
static const String skLiveStripe = 'sk_live_...';
static const String pkLiveStripe = 'pk_live_...';
static const String planPrice01 = 'price_...'; // Starter
static const String planPrice02 = 'price_...'; // Premium
static const String planPrice03 = 'price_...'; // Elite
Validación de Suscripción
class="highlight">1
2
3
final isValid = await SubscriptionService.validateSubscription(
subscriptionId: clinica.stripeSubscriptionId,
);
Stripe Connect
Stripe Connect permite que pacientes paguen directamente a doctores.
Configuración
- Crear cuenta Connect en Stripe
- Obtener Client ID de Connect
- Configurar redirect URLs
- Implementar flujo de onboarding
Flujo de Pago
- Paciente selecciona servicio de pago
- App crea payment intent con Connect
- Paciente completa pago
- Stripe procesa y transfiere a doctor
- Webhook actualiza estado en Firestore
RevenueCat (iOS)
RevenueCat maneja las compras in-app para iOS usando StoreKit.
Configuración
class="highlight">1
2
3
4
// En app_constants.dart
static const String revenueCatIosApiKeyProd = 'appl_...';
static const String revenueCatEntitlementIdentifier = 'suscripciones Capi';
static const String revenueCatOfferingIdentifier = 'default';
Flujo de Compra iOS
- Usuario selecciona plan en iOS
- App llama a RevenueCat para obtener offerings
- Usuario completa compra en App Store
- RevenueCat valida compra
- Webhook de RevenueCat actualiza Firestore
- App sincroniza estado
Validación de Suscripción iOS
class="highlight">1
2
3
final hasActive = await RevenueCatService.hasActiveSubscription(
forceRefresh: true,
);
Zoom
Zoom proporciona videoconsultas integradas.
Configuración
- Crear app en Zoom Marketplace
- Obtener API Key y Secret
- Configurar en clínica: class="highlight">
1
2
3
4
clinica.zoom = ConfZoomStruct(
apiKey: '...',
apiSecret: '...',
);
Creación de Reuniones
class="highlight">1
2
3
4
5
6
7
8
9
final response = await ZoomCall.call(
token: zoomToken,
fechaCita: fecha,
tituloCita: 'Consulta médica',
anfitrion: doctorEmail,
invitado: pacienteEmail,
);
final meetingUrl = ZoomCall.zoomLink(response);
Enlaces Instantáneos
Las clínicas pueden configurar un enlace Zoom instantáneo que se usa para citas inmediatas.
N8N
N8N automatiza workflows y webhooks.
Workflows Principales
- Crear Checkout Stripe
- Crea customer y checkout session
- URL:
/webhook/pagar-suscripcion
- Procesar Pago Completado
- Procesa evento
checkout.session.completed - Actualiza suscripción en Firestore
- URL:
/webhook/stripe-webhook-completed
- Emails Automáticos
- Verifica chats pendientes periódicamente
- Envía emails de recordatorio
Configuración de Webhooks
class="highlight">1
2
// En N8N workflow
const webhookUrl = 'https://sincodigo-n8n.oawden.easypanel.host/webhook/...';
Firebase Cloud Messaging
Configuración
Web:
class="highlight">1
2
3
// firebase-messaging-sw.js
importScripts('https://www.gstatic.com/firebasejs/9.0.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/9.0.0/firebase-messaging.js');
Android:
- Configurar en
AndroidManifest.xml - Agregar
google-services.json
iOS:
- Configurar en
Info.plist - Agregar capabilities
Envío de Notificaciones
class="highlight">1
2
3
4
5
6
await NotificationService.sendNotification(
token: fcmToken,
title: 'Nueva cita',
body: 'Tienes una cita programada',
data: {'citaId': '...'},
);
Google Places API
Para autocompletado de direcciones.
Uso
class="highlight">1
2
3
4
final places = await PlacesCall.call(
input: 'Calle...',
apiKey: googlePlacesApiKey,
);
Proxy en Cloud Functions
Las llamadas a Places API se hacen a través de Cloud Functions para proteger la API key.
Algolia (Opcional)
Para búsqueda avanzada de doctores.
Configuración
class="highlight">1
2
3
// En backend/algolia/
final algolia = AlgoliaManager.instance;
await algolia.search('doctor', index: 'users');
Próximos Pasos
- Despliegue - Build y despliegue
- Troubleshooting - Problemas comunes
Anterior: Autenticación y Roles ← Siguiente: Despliegue →