POST /payment-intents, leído vía GET /payment-intents/{id}, listado vía GET /payment-intents.
El mismo envelope lo devuelven los tres endpoints + el simulador sandbox + cualquier evento del log relacionado al intent. Construye tu cliente alrededor de este envelope y tienes un solo decoder para cada entry point.
El envelope
Todo campo abajo está siempre presente en la respuesta, connull cuando no aplica. Es deliberado — código del partner que hace response.metadata sin guard no se rompe en intents sin metadata. Estilo Stripe.
Transiciones de estado
failed está reservado para uso futuro; ningún path actual lo emite. Construye tu cliente para ignorar estados futuros desconocidos sin romper.
Campos cumulativos
Los tres campos cumulativos cierran el gap del pago parcial: un depósito de 5 es estructuralmente distinto de “todavía no llegó nada”.| Campo | Qué es | Cuándo usarlo |
|---|---|---|
amount_received | Suma de depósitos completados contra este intent. Arranca en 0.0. | Mostrar “recibido hasta ahora” en la UI parcial. |
amount_remaining | max(0, amount - amount_received). Sin tolerancia aplicada. Clampea a 0 en sobre-pago. | Mostrar “envía $X más para completar”. |
partial_payment | true sólo si amount_received > 0 AND status == 'pending'. | El booleano canónico para “renderiza UI parcial”. |
partial_payment como el boolean de dispatch — respeta transitivamente la tolerancia de 0.01 que usa el backend para decidir completion. Un intent dentro de tolerancia ya pasó a completed, así que partial_payment es false y el booleano te dice renderiza éxito, no parcial.
Ciclo de pago parcial
Ejemplo concreto: intent de 3 y luego $2.deposites el ÚLTIMO crédito, no el acumulado. En el flujo parcial→completo,deposit.amount_receivedmuestra los 5. No sumesdeposit.amount_receivedentre polls — usa el campo top-level.- La tolerancia es invisible para ti. Un depósito de 5.00 pasa el
statusacompleted(dentro de la tolerancia de 0.01 que usa el flujo de crédito).partial_paymentesfalse. Confía en el booleano; no reimplementes el threshold del lado del cliente.
Polling
Un widget poleandoGET /payment-intents/{id} para estado debe despachar en un árbol de decisión pequeño:
mountPaymentWidget y normalizeIntent.
El objeto deposit
deposit se puebla cuando un crédito aterriza. En el flujo parcial→completo refleja el ÚLTIMO crédito en cada lectura (no el acumulado). Usa amount_received (top-level) para acumulado.
data del evento webhook payment_intent.completed. Partners que hacen reconciliación pull (GET) y push (webhook) pueden usar un solo decoder para los dos.
Transacciones atribuidas a Connect
Cada fila que devuelveGET /transactions carga un campo payment_intent_id. Si es no-null, esa transacción fue un crédito contra el intent nombrado (flujo SDK-driven). Si es null, la transacción vino por otro path (depósito directo a dirección org-owned, transferencia, funding interno). Úsalo para deep-linkear filas de transacción a su intent originador en los dashboards del partner.
Ver también
- Crear Payment Intent
- Consultar Payment Intent
- Direct vs. whitelabel flows —
external_refdecide a qué tabla de balance cae el crédito. - Eventos —
payment_intent.completedypayment_intent.payment_received.