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
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,
);
Asignación Manual / Planes Ilimitados (Panel Admin)
Es posible asignar planes sin interactuar directamente con el flujo de compra, útil para:
- Otorgar un Plan Ilimitado u otros planes internos (isPublic = false).
- Planes con Monto 0 (gratuitos).
Al asignar estos planes desde el Panel de Administrador:
- Se actualiza el
planSuscripcion en Firestore. - Se limpian los IDs previos de Stripe (
stripe_subscription_id, stripe_subscription_price_id, stripe_subscription_product_id). - Se marca manualmente el status:
stripe_subscription_status = 'active', para que la App Móvil reconozca el servicio como vigente sin requerir verificación con Stripe. - Importante: Si la clínica poseía una suscripción pagada activa previamente, el administrador debe ir al Dashboard de Stripe para cancelar el cobro iterativo manualmente, dado que el Panel no hace la cancelación directa en la API por seguridad.
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 →