De 0 a pagos por WhatsApp: Mercado Pago + Stripe desde una conversación
Cómo construí un sistema de pagos integrado en WhatsApp que procesa órdenes médicas y cobra automáticamente con Mercado Pago y Stripe.
Mario Inostroza
Un paciente envía un mensaje por WhatsApp. Adjunta un examen médico. El sistema procesa la imagen, extrae datos, calcula el precio, y envuelve todo en un flujo de pago automático. ¿Simple? Detrás hay arquitectura.
El desafío real
Los flujos de pago por WhatsApp no son solo botones. Es un rompecabezas complejo con piezas móviles:
- Detección de documentos médicos desde imágenes
- Extracción de datos con OCR
- Cálculo de precios según tipo de examen
- Validación de identidad con RUT
- Integración con dos proveedores de pago distintos
- Manejo de estados complejos en conversaciones
- Generación de comprobantes PDF
- Notificación inmediata al confirmar pago
La clave no está en un único componente. Está en cómo todos se conectan sin que el usuario lo note.
Arquitectura del flujo de pago
La arquitectura sigue un modelo etapa-gate. Primero validamos que el documento sea médico. Luego procesamos según el tipo.
Etapa 1: Clasificación de documentos
El sistema recibe una imagen y verifica tres cosas:
- ¿Es documento médico? (clasificador de documentos)
- ¿Es orden de examen o resultados? (diferenciación clave)
- ¿Qué tipo de examen específico? (hemograma, lípidos, glucosa, etc.)
Esta etapa usa un clasificador que detecta el tipo de documento antes de procesar. Si no es médico, el sistema rechaza amablemente.
// Flujo básico de clasificación
documentClassifier.classifyDocumentFromStorage()
El sistema aprendió que confundir hemogramas con orina era un error crítico. Las pruebas encontraron falsos positivos que derivaban en flujos incorrectos.
Etapa 2: Procesamiento OCR
Si el documento es válido, el sistema extrae datos. Aquí hay dos caminos según el tipo de documento:
Para órdenes de examen:
- Extraer nombre del paciente
- Validar RUT (requerido en Chile)
- Identificar exámenes solicitados
- Calcular precio basado en catálogo
Para resultados de examen:
- Extraer tipo de examen
- Validar rangos normales vs patológicos
- Generar interpretación automática
- Enviar resultados con firma digital
El OCR utiliza tanto OpenAI Vision como modelos locales. La clave está en los prompts específicos para cada tipo de documento médico.
Integración con proveedores de pago
Aquí está la complejidad real. Dos sistemas de pago distintos que deben comportarse como uno solo desde la perspectiva del usuario.
Mercado Pago: el preferido en Chile
Mercado Pago domina el mercado chileno por su integración con WhatsApp Business. El flujo es:
- Generar preferencia de pago con monto y descripción
- Enviar botón de pago con URL personalizada
- Esperar confirmación webhook del pago
- Liberar servicios automáticamente al confirmar
// Simplified flow for Mercado Pago
await mercadopago.preferences.create({
items: [{
title: examen.nombre,
unit_price: examen.precio,
currency_id: 'CLP'
}]
})
Stripe: para pagos internacionales
Stripe requiere un enfoque diferente. Aunque soporta WhatsApp, su integración es más compleja:
- Crear PaymentIntent con amount y currency
- Generar Checkout Session URL
- Redirigir usuario a interfaz segura de Stripe
- Webhook para confirmación en servidor
El desafío es mantener la experiencia de WhatsApp mientras rediriges a un entorno externo seguro.
Estado en conversaciones
Las conversaciones de WhatsApp son stateless por naturaleza. El sistema debe recordar contexto entre mensajes.
Usamos un cache en memoria con patrones específicos:
// Pattern: pendingOcr para capturar múltiples documentos
const contextCache = new Map<string, string>()
function savePendingOcr(userId: string, ocrData: string) {
contextCache.set(`pending_ocr_${userId}`, ocrData)
}
function getPendingOcr(userId: string): string | undefined {
return contextCache.get(`pending_ocr_${userId}`)
}
Este sistema permite recibir múltiples imágenes en secuencia y procesarlas como parte del mismo pedido.
Validación de identidad
En Chile, el RUT es fundamental. Validamos identidad antes de cualquier pago:
- Usuario envía RUT o número de documento
- Sistema valida formato y dígito verificador
- Si válido, procede con el pago
- Si inválido, solicita formato correcto
La validación ocurre en segundo plano para no interrumpir la conversación.
Manejo de errores y reintentos
Los pagos fallan por muchas razones: tarjeta vencida, saldo insuficiente, problemas de red.
El sistema implementa:
- Intentos automáticos con backoff exponencial
- Notificación amable de falla
- Opción de cambiar método de pago
- Logging detallado para debugging
No podemos dejar al usuario en la incertidumbre si algo falla.
Transparencia con el usuario
La clave es mantener al usuario informado sin abrumar:
- Confirmación inmediata al recibir documento
- Progreso real de procesamiento
- Estado del pago en tiempo real
- Comprobante PDF enviado automáticamente
El usuario siempre sabe qué está pasando.
Lecciones aprendidas
Construir este sistema enseñó varias cosas importantes.
Primero, la separación de flujos es crítica. Los pedidos de examen y los resultados deben procesarse con lógicas distintas. Un error aquí causa flujos incorrectos y pérdida de confianza.
Segundo, los proveedores de pago tienen comportamientos muy distintos. Mercado Pago funciona mejor para pagos rápidos dentro de Chile. Stripe es necesario para internacional pero rompe la experiencia fluida de WhatsApp.
Tercero, las pruebas integrales son obligatorias. Creamos 13 tests que simulan conversaciones completas: desde el primer mensaje hasta la confirmación de pago. Sin ellos, los problemas aparecen en producción.
Futuro: interoperabilidad total
El siguiente paso es conectar esto con sistemas de salud existentes. FHIR, HL7, y la Ley 21.668 nos obligan a interoperar con clínicas, laboratorios y aseguradoras.
La arquitectura actual permite esta expansión. Podemos integrarnos con cualquier sistema que use estándares médicos.
El valor real
Un paciente puede pedir exámenes desde su celular, pagar sin complicaciones y recibir resultados sin papeles. Todo en una conversación natural. En Examya procesamos este flujo con dos proveedores de pago y un tiempo promedio de respuesta de 8 segundos desde que llega la imagen hasta que el usuario ve el botón de pago.
📱 WhatsApp: +56962170366 🐦 X.com: @marioHealthBits 🌐 mariohealthbits.dev
Lecturas relacionadas
En esta serie
Cómo instalé el primer lab PCR privado de Magallanes (y por qué terminé construyendo IA)
En marzo 2021, subí un gabinete de 300 kg con grúa al segundo piso en cuarentena patagónica. En mayo procesábamos los primeros PCR COVID privados de Magallanes. Lo que aprendí en esas noches me llevó a construir Examya.
En esta serie
Examya: cómo construí un agente médico para WhatsApp que procesa órdenes de exámenes
Detalles técnicos de la implementación del agente Shuri en Examya, un sistema para procesar órdenes médicas vía WhatsApp con integración FONASA.
En esta serie
pgvector + embeddings en producción: La base de razonamiento médico en Examya
Arquitectura de búsqueda semántica y similitud textual en producción con pgvector, pg_trgm y datos MINSAL reales.