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ódigo Propó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.