Skip to main content
Zonapay permite al usuario dividir el total de una transacción entre:
  • Medios distintos (ej. PSE + TC) - pagos mixtos.
  • Varias instancias del mismo medio (ej. 2 tarjetas distintas) - pagos fraccionados.
Ambos se habilitan con códigos en AdicionalesConfiguracion.

Pagos mixtos (PSE + TC)

Habilita pagos mixtos:
{ "int_codigo": 109, "str_valor": "1" }
y permite división en varios medios
{ "int_codigo": 100, "str_valor": "1" }

Ejemplo completo

{
  "AdicionalesConfiguracion": [
    { "int_codigo": 50,  "str_valor": "tu_codigo_servicio" },
    { "int_codigo": 109, "str_valor": "1" },
    { "int_codigo": 100, "str_valor": "1" },
    { "int_codigo": 105, "str_valor": "50000" },
    { "int_codigo": 106, "str_valor": "3" }
  ]
}
Permite al usuario dividir su pago en hasta 3 fracciones, mínimo $50.000 por fracción.

Pagos fraccionados (varias TC o varios PSE)

Fraccionar en varias tarjetas de crédito:
{ "int_codigo": 101, "str_valor": "1" }
Fraccionar en varias cuentas PSE:
{ "int_codigo": 102, "str_valor": "1" }

Configuración de límites

CódigoPropósito
105Monto mínimo por fracción
106Número máximo de fracciones
112Valor por defecto de la primera fracción

Qué recibes en VerificacionPago

int_cantidad_pagos será mayor a 1. Cada elemento del array parseado es un sub-pago con su propio int_n_pago, int_id_forma_pago y dbl_valor_pagado.
const pagos = parseStrResPago(data.str_res_pago);
const totalPagado = pagos.reduce((sum, p) => sum + Number(p.dbl_valor_pagado), 0);
// totalPagado debe igualar flt_total_con_iva del request original

const todosAprobados = pagos.every(p => Number(p.int_estado_pago) === 1);

Lógica de aprobación

El pago se considera completamente aprobado solo cuando todos los sub-pagos están aprobados. Si uno falla, los demás pueden requerir reversa manual — coordina con soporte.
function estadoPagoMixto(pagos) {
  const todosAprobados = pagos.every(p => Number(p.int_estado_pago) === 1);
  const algunRechazado = pagos.some(p =>
    [1000, 1001, 4000, 4003].includes(Number(p.int_estado_pago))
  );
  const algunPendiente = pagos.some(p =>
    [888, 999, 4001].includes(Number(p.int_estado_pago))
  );

  if (todosAprobados) return "aprobado";
  if (algunPendiente) return "pendiente";
  if (algunRechazado) return "rechazado_parcial";
  return "desconocido";
}

Cuándo usar pagos mixtos

  • Tickets altos ($300k+) donde el usuario quiere distribuir entre medios.
  • Productos donde un solo medio puede no cubrir el cupo (electrónica, muebles, tecnología).
  • Recaudo tributario que permite pagar con varias cuentas.
No recomendados para:
  • Tickets bajos (<$100k): genera complejidad sin beneficio.
  • Productos digitales de entrega inmediata: esperar varios sub-pagos ralentiza la experiencia.

Ver también

AdicionalesConfiguracion

Catálogo completo de códigos.

Verificar estado

Cómo leer múltiples sub-pagos.