Intenciones de pago
Una Intención de pago es un objeto central en el ciclo de pago de Sangho. Representa su intención de cobrar dinero a un cliente y orquesta todas las etapas del proceso, desde la asociación de un método de pago hasta la confirmación final y la creación de una Transacción.
A cada pago le corresponde exactamente una Intención. Su ciclo de vida lo gestiona automáticamente la API de Sangho en función de las acciones de su cliente y de las respuestas de los operadores.
Las Intenciones de pago permiten gestionar los escenarios complejos: autenticación 3D Secure, redirección al operador móvil, captura diferida y reintento tras un fallo sin perder nunca el estado del pago en curso. Es el enfoque recomendado para cualquier integración de pago robusta.
Ciclo de vida
| Estado | Significado | Acción requerida |
|---|---|---|
requires_payment_method | Todavía no hay ningún método de pago asociado. | Mostrar el formulario de pago al cliente. |
requires_confirmation | Hay un método asociado, a la espera de confirmación. | Llamar a /confirm/ o pasar confirm: true en la creación. |
requires_action | El operador solicita una acción adicional (3DS, redirect). | Redirigir al cliente a next_action.redirect_url. |
pending | A la espera de la respuesta del operador (mobile money). | Esperar el webhook payment_intent.succeeded. |
processing | El pago está siendo procesado por el operador. | No hacer nada: esperar el webhook. |
requires_capture | Autorizado: se requiere captura manual (captura diferida). | Llamar a /capture/ antes de que caduque. |
succeeded | Pago correcto. Se ha creado una Transaction. | Entregar el servicio/producto. |
canceled | Cancelado definitivamente. No recuperable. | Crear una nueva Intención de Pago si es necesario. |
Endpoints
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /payment-intents/ | Crear una Intención de Pago |
| GET | /payment-intents/ | Listar las Intenciones de Pago (paginado, filtrable) |
| GET | /payment-intents/{id}/ | Recuperar una Intención de Pago por su ID |
| PATCH | /payment-intents/{id}/ | Actualizar una Intención de Pago (antes de la confirmación) |
| POST | /payment-intents/{id}/confirm/ | Confirmar el pago y activar el procesamiento |
| POST | /payment-intents/{id}/capture/ | Capturar un pago autorizado (captura diferida) |
| POST | /payment-intents/{id}/cancel/ | Cancelar definitivamente |
Esquema del objeto
Crear una Intención de pago
Instancia una nueva Intención de pago en el estado requires_payment_method.
Es la primera etapa de todo flujo de pago con Sangho.
amountRequisImporte que se va a cobrar, expresado en céntimos de la moneda. Para las monedas sin decimales como XAF/XOF, 1 FCFA = 1 céntimo (sin decimales). Para USD/EUR, 1 unidad = 100 céntimos.
El importe mínimo aceptado es de 100 céntimos (1 XAF).
El importe máximo depende del límite de transacción configurado en su App.
Utilice siempre enteros: los valores decimales (float) se rechazan con un error 400.
currencyRequisCódigo ISO 4217 de la moneda del pago. Sangho reconoce 132 monedas ISO 4217, pero la
moneda utilizada debe, además, estar activada en Sangho e
incluida en su plan: XAF y
XOF están disponibles en todos los planes.
Una moneda desconocida o desactivada devuelve 422 INVALID_CURRENCY.
Una moneda válida pero que no figura en su plan devuelve
403 CURRENCY_NOT_IN_PLAN: pase a un
plan superior para activarla. Una vez creado, el campo currency
de una Intención de Pago ya no se puede modificar.
payment_method_typesOptionnelLista de los métodos de pago autorizados para esta Intención. Si se omite, están disponibles todos los métodos activos de su App.
En savoir plus
Valores posibles: mobile_money, bank_card,
paypal. Restringir los tipos mejora la experiencia de usuario en la
página de pago y reduce los errores debidos a métodos no disponibles en una región determinada.
customerOptionnelIdentificador o correo electrónico de un objeto Customer existente que se asociará a este pago. Permite recuperar el historial de pagos de un cliente.
En savoir plus
Si pasa un correo electrónico aún no registrado, Sangho crea automáticamente un Customer.
Si pasa un ID y el Customer no existe, la API devuelve un error 404.
Asociar un Customer también le permite enviar automáticamente un recibo si
no se indica receipt_email.
descriptionOptionnelDescripción interna del pago no visible para el comprador en la página de pago. Útil para encontrar un pago en su panel o mediante la API.
En savoir plus
Máx. 500 caracteres. Esta descripción aparece en los registros y en las exportaciones CSV del panel, pero no en los recibos ni en la página de checkout.
receipt_emailOptionnelDirección de correo electrónico a la que Sangho enviará automáticamente el recibo de pago tras un pago correcto.
En savoir plus
Si no se indica y hay un Customer asociado, se utiliza por defecto el correo del Customer.
Para desactivar el envío del recibo, pase explícitamente null.
confirmOptionnelSi es true, intenta confirmar el pago inmediatamente después de la creación.
Requiere que payment_method se facilite en la misma solicitud.
En savoir plus
Útil para los pagos de servidor a servidor en los que ya dispone del método de pago.
Si la confirmación falla, el PaymentIntent pasa a requires_payment_method:
no se cancela.
payment_methodOptionnelID de un método de pago existente que se asociará de inmediato al PaymentIntent.
En savoir plus
Necesario si confirm: true.
El método debe pertenecer a la App o al Customer asociado.
categoryOptionnelCategoría de negocio del pago, utilizada para las estadísticas y el cumplimiento normativo OHADA.
Valores: product, service,
donation, invoice.
capture_methodOptionnelDetermina si el importe se captura automáticamente tras la autorización o si desea capturarlo manualmente más adelante.
En savoir plus
automatic: captura inmediatamente tras la confirmación (flujo estándar).
manual: solo autoriza; debe llamar a /capture/
en un plazo de 7 días; si no, la autorización se cancela automáticamente.
La captura manual es útil para las reservas, los pedidos anticipados o las validaciones de negocio.
metadataOptionnelDiccionario clave/valor para almacenar sus propios datos asociados al PaymentIntent: referencia del pedido, ID de usuario interno, etc.
En savoir plus
Máximo 50 claves; cada clave y cada valor son strings de 500 caracteres como máximo. Los metadatos se devuelven en todos los webhooks vinculados a este PaymentIntent. No son visibles para el cliente final.
Crear una Intención de Pago
Listar las Intenciones de pago
Devuelve una lista paginada de todas las Intenciones de pago de su App, ordenadas por fecha de creación descendente por defecto. Admite filtrado, búsqueda y ordenación.
statusOptionnelFiltrar las Intenciones por estado. Acepta los valores del ciclo de vida.
En savoir plus
Puede pasar varios valores separados por coma:
status=succeeded,canceled.
currencyOptionnelFiltrar por código de moneda ISO 4217.
customerOptionnelFiltrar por ID o correo electrónico de un Customer. Devuelve todos los pagos asociados a ese cliente.
En savoir plus
Puede pasar el ID (cust_xxx) o la dirección de correo exacta.
La búsqueda por correo distingue entre mayúsculas y minúsculas.
created_afterOptionnelDevuelve únicamente las Intenciones de pago creadas después de esta fecha/hora (inclusive).
created_beforeOptionnelDevuelve únicamente las Intenciones de pago creadas antes de esta fecha/hora (inclusive).
orderingOptionnelCampo de ordenación. Añada el prefijo - para un orden descendente.
En savoir plus
Campos ordenables: created_at, amount,
status. Ejemplos: ordering=amount (ascendente),
ordering=-amount (descendente).
pageOptionnelNúmero de la página que se va a devolver. La paginación empieza en 1.
En savoir plus
Si la página solicitada supera el número total de páginas, se devuelve una lista vacía (sin error 404).
page_sizeOptionnelNúmero de resultados por página. Mínimo: 1. Máximo: 100.
En savoir plus
Para recuperar todas las Intenciones de pago de un período, utilice
page_size=100 e itere mientras
pagination.next no sea nulo en la respuesta.
Paginación
Todos los endpoints de listado de Sangho utilizan una paginación por página
(page / page_size). La respuesta es un
envoltorio plano: count, next,
previous y data están al mismo nivel y
no hay ningún objeto pagination anidado.
Siga incrementando page mientras next no sea nulo.
Esta propiedad contiene la URL completa de la página siguiente,
lista para invocarse directamente.
Listar las Intenciones de pago
Confirmar una Intención de pago
Activa el procesamiento del pago. Pasa el PaymentIntent a processing
(o a requires_action si se necesita una etapa adicional).
payment_methodOptionnelID de un método de pago que se asociará antes de la confirmación. Requerido si el PaymentIntent
está en requires_payment_method.
Llame a /confirm/ con una cabecera Idempotency-Key
única para evitar las confirmaciones dobles en caso de timeout de red.
La clave debe ser única por PaymentIntent.
Capturar (captura diferida)
Captura un importe autorizado. Solo está disponible si
capture_method: “manual” y el estado es requires_capture.
Puede capturar un importe inferior al importe autorizado.
amount_to_captureOptionnelImporte que se va a capturar. Debe ser ≤ amount_capturable.
Si se omite, captura el importe total autorizado.
En savoir plus
Capturar un importe parcial cancela automáticamente el resto. Ejemplo: autorización de 20 000 XAF, captura de 15 000 → 5 000 cancelados automáticamente.
Cancelar
Cancela definitivamente el PaymentIntent. Es irreversible.
Si el PaymentIntent estaba en requires_capture,
la autorización se libera en el operador.
Una Intención de Pago cancelada no se puede reactivar. Si desea reintentar el pago, debe crear una nueva Intención de pago.