Un endpoint, múltiples métodos de pago
Todos los débitos automáticos se ejecutan conPOST /charges. Lo que cambia es cómo capturas y autorizas el método de pago antes de cobrar.
| Método | Captura | Procesamiento | Interacción del cliente |
|---|---|---|---|
| Tarjeta de crédito/débito | SDK Elements (recomendado) o API directa | Inmediato | Solo al registrar la tarjeta |
| Cuenta bancaria (ACH) | API con número de cuenta | Siguiente día hábil | Solo al autorizar la cuenta |
| Nequi | API + autorización en app | Inmediato | Autoriza en la app Nequi cada vinculación |
| Daviplata | API + código OTP por SMS | Inmediato | Ingresa OTP recibido por SMS |
Todos los métodos requieren
authorization: true al momento de registrar el medio de pago. Sin esto, no podrás crear cargos.Débito con tarjeta de crédito/débito
Hay dos formas de capturar los datos de la tarjeta:Opción A: SDK Elements (recomendado)
El SDK Elements captura los datos sensibles en un iframe seguro y te devuelve uncard_token. Tu servidor nunca toca los datos de la tarjeta, lo que simplifica el cumplimiento PCI DSS.
Paso 1: Tokenizar en el frontend
Integra el SDK Elements en tu página de captura. Consulta la guía de integración para el setup completo.
Paso 2: Registrar la tarjeta tokenizada
Opción B: API directa (requiere PCI DSS)
Si tu empresa cumple con PCI DSS, puedes enviar los datos de tarjeta directamente a la API.POST /charges igual que en la Opción A.
Respuesta de la tarjeta
Si
action.action no es "NULL", la tarjeta requiere autenticación 3D Secure. Redirige al cliente a la URL en action.next para completar la verificación.Débito con cuenta bancaria (ACH)
Los débitos a cuentas bancarias se procesan mediante ACH (Cámara de Compensación Automatizada). El procesamiento no es inmediato: los fondos se acreditan el siguiente día hábil.Tiempos de procesamiento
| Tipo de cuenta | Procesamiento | Horario de corte |
|---|---|---|
| Ahorros / Corriente (ACH) | Siguiente día hábil | Antes de las 4:00 PM |
| Nequi | Inmediato | 24/7 |
| Daviplata | Inmediato | 24/7 |
Flujo completo
Paso 1: Consultar bancos disponiblessubtype):
| Valor | Descripción |
|---|---|
SAVINGS | Cuenta de ahorros |
CHECKING | Cuenta corriente |
ELECTRONIC_DEPOSIT | Depósito electrónico (Nequi, Daviplata) |
pending hasta que ACH procese el débito. Recibirás un webhook con el resultado:
Débito con billeteras digitales (Nequi / Daviplata)
Las billeteras digitales requieren que el cliente autorice la vinculación desde su app bancaria antes de poder debitar. A diferencia de ACH, el procesamiento es inmediato.Nequi: Autorización en la app
El cliente debe aprobar la vinculación directamente en la app de Nequi. No se requiere OTP.Crear la cuenta Nequi
El
account_number es el número de celular registrado en Nequi (sin prefijo +57).El cliente autoriza en Nequi
Muestra instrucciones al cliente:
- Abre la app de Nequi
- Busca la notificación de autorización de débito automático
- Aprueba la vinculación
Validar la cuenta
Una vez que el cliente autoriza en Nequi, valida la cuenta. Para Nequi no se requiere OTP.
Daviplata: Validación con OTP
Daviplata requiere que el cliente ingrese un código OTP recibido por SMS para completar la vinculación.Crear la cuenta Daviplata
El
account_number es el número de celular registrado en Daviplata (sin prefijo +57).El cliente recibe el OTP
Daviplata envía un SMS con un código de 6 dígitos al número del cliente. Muestra un campo en tu interfaz para que el cliente ingrese el código.
Estados de la cuenta
Después de crear una cuenta, pasa por estos estados antes de poder debitar:| Estado | Descripción |
|---|---|
PENDING | Cuenta creada, esperando autorización del cliente |
VALIDATING | Validación en progreso (Daviplata con OTP) |
ACTIVE | Lista para débitos |
REJECTED | Autorización rechazada por el cliente o el banco |
INACTIVE | Cuenta desactivada |
Comparación rápida
| Tarjeta | Cuenta ACH | Nequi | Daviplata | |
|---|---|---|---|---|
| Captura | SDK Elements o API directa | Número de cuenta + banco | Celular | Celular |
| Autorización | Al registrar la tarjeta | Al crear la cuenta | App Nequi (push) | OTP por SMS |
| Validación extra | 3DS (si aplica) | No | POST /accounts/{id}/validate | POST /accounts/{id}/validate con OTP |
| Procesamiento | Inmediato | Siguiente día hábil | Inmediato | Inmediato |
| Webhook resultado | charge.succeeded | charge.succeeded | charge.succeeded | charge.succeeded |
Errores comunes
| Error | Causa | Solución |
|---|---|---|
ACCOUNT_IS_NOT_AUTHORIZED | La cuenta no tiene authorization: true | Crea la cuenta con authorization: true |
INSUFFICIENT_FUNDS | Fondos insuficientes | Notifica al cliente y reintenta |
CARD_EXPIRED | Tarjeta expirada | Solicita al cliente que actualice la tarjeta |
invalid_otp | OTP incorrecto o expirado (Daviplata) | Solicita un nuevo OTP al cliente |
validation_error | Falta customer_id o método de pago | Verifica que envías card_id o account_id |
Webhooks relevantes
- Webhook de cuentas: Cambios de estado de cuentas (vinculación aprobada/rechazada)
- Webhook de cargos: Resultado de los débitos (aprobado/rechazado)
- Webhook de tarjetas: Cambios de estado de tarjetas