Skip to main content
El response de POST /VerificacionPago contiene un campo str_res_pago con los detalles de las transacciones en un formato propietario de texto plano:
campo1|campo2|...|campoN|;|campo1|campo2|...|campoN|;|

Reglas del formato

Separador de campos: pipe simple |
Separador de pagos: pipe-punto-y-coma-pipe |;|
Orden fijo: los primeros 21 campos son comunes a todos los medios de pago.
Campos adicionales: a partir del 22, dependen de int_id_forma_pago (ver Campos por medio).
Trailing |;|: el string suele terminar con |;| — ignóralo al dividir.

Orden fijo de los 21 campos base

#CampoTipoDescripción
1int_ped_numerointNúmero de pedido generado por ZonaPagos.
2int_n_pagointNúmero de transacción del pago. Puede repetirse si es pago mixto.
3int_pago_parcialint1 si el pago es parcial (mixto).
4int_pago_terminadoint200 iniciado, 1 terminado, 2 pendiente (mixto incompleto).
5int_estado_pagointEstado final. Ver tabla.
6dbl_valor_pagadodecimalValor pagado en esta transacción.
7dbl_total_pagodecimalTotal que envió el comercio.
8dbl_valor_iva_pagadodecimalIVA pagado.
9str_descripcionstringConcepto del pago (lo que enviaste en str_descripcion_pago).
10str_id_clientestringID del cliente.
11str_nombrestringNombre del pagador.
12str_apellidostringApellido del pagador.
13str_telefonostringTeléfono.
14str_emailstringEmail.
15str_campo1stringTu str_opcional1.
16str_campo2stringTu str_opcional2.
17str_campo3stringTu str_opcional3.
18str_campo4stringTu str_opcional4.
19str_campo5stringTu str_opcional5.
20dat_fechastringFecha/hora dd/mm/yyyy hh:mm.
21int_id_forma_pagointCódigo del medio: 29, 32, 41, 47, 48, 51, 77.
Los campos 22+ dependen del medio. Ver Campos por medio de pago.

Ejemplo de string real

31|3773|1|1|1|12500|12500|0|camisa|123456789|Cristina|Vargas|3001234567|c@ejemplo.com|opcion1|opcion2|opcion3|||21/04/2026 12:58:41|29|18092100031|2701|1022|BANCO UNION COLOMBIANO|1468228|3|;|
Descompuesto:
  • Pedido 31, intento 3773
  • Pago parcial: 1, terminado: 1, estado: 1
  • Valor: 12500, total: 12500, IVA: 0
  • Descripción: “camisa”, cliente “Cristina Vargas”
  • Medio: 29 (PSE), banco: BANCO UNION COLOMBIANO (código 1022)
  • CUS (str_codigo_transaccion): 1468228

Parsers listos para copiar

/**
 * Parsea el campo str_res_pago de VerificacionPago.
 * @param {string} raw - El valor del campo str_res_pago.
 * @returns {Array<Object>} Array de pagos con todos sus campos.
 */
export function parseStrResPago(raw) {
  if (!raw || typeof raw !== "string" || raw.trim() === "") return [];

  const CAMPOS_BASE = [
    "int_ped_numero", "int_n_pago", "int_pago_parcial",
    "int_pago_terminado", "int_estado_pago",
    "dbl_valor_pagado", "dbl_total_pago", "dbl_valor_iva_pagado",
    "str_descripcion", "str_id_cliente",
    "str_nombre", "str_apellido", "str_telefono", "str_email",
    "str_campo1", "str_campo2", "str_campo3", "str_campo4", "str_campo5",
    "dat_fecha", "int_id_forma_pago"
  ];

  const EXTRAS_POR_MEDIO = {
    "29": ["str_ticketID", "int_codigo_servicio", "int_codigo_banco",
           "str_nombre_banco", "str_codigo_transaccion", "int_ciclo_transaccion"],
    "32": ["str_ticketID", "int_numero_tarjeta", "str_franquicia",
           "int_cod_aprobacion", "int_num_recibido"],
    "47": ["str_ticketID", "int_codigo_banco"],
    "48": ["str_ticketID"],
    "51": ["str_ticketID", "int_numero_tarjeta", "str_franquicia",
           "int_cod_aprobacion", "int_num_recibido"],
    "77": [],
    "41": []
  };

  return raw
    .split("|;|")
    .map(s => s.trim())
    .filter(s => s.length > 0)
    .map(pagoRaw => {
      const partes = pagoRaw.split("|").map(x => x.trim());
      const pago = {};

      CAMPOS_BASE.forEach((campo, i) => {
        pago[campo] = partes[i] !== undefined ? partes[i] : "";
      });

      // Campos adicionales según medio de pago
      const medio = pago.int_id_forma_pago;
      const extras = EXTRAS_POR_MEDIO[medio] || [];
      extras.forEach((campo, i) => {
        const idx = CAMPOS_BASE.length + i;
        pago[campo] = partes[idx] !== undefined ? partes[idx] : "";
      });

      // Conversión de tipos para campos numéricos
      ["int_ped_numero", "int_n_pago", "int_pago_parcial",
       "int_pago_terminado", "int_estado_pago", "int_id_forma_pago",
       "dbl_valor_pagado", "dbl_total_pago", "dbl_valor_iva_pagado"
      ].forEach(k => {
        if (pago[k] !== undefined && pago[k] !== "") {
          const n = Number(pago[k]);
          if (!isNaN(n)) pago[k] = n;
        }
      });

      return pago;
    });
}

// ─────────────────────────────────────────
// Uso
// ─────────────────────────────────────────
const response = await axios.post(`${API_URL}/VerificacionPago`, body);
const pagos = parseStrResPago(response.data.str_res_pago);

pagos.forEach(p => {
  console.log(`Pago ${p.int_n_pago}: estado ${p.int_estado_pago}`);
  if (p.int_estado_pago === 1) console.log("✅ Aprobado");
});

Casos especiales

str_res_pago vacío

Cuando int_cantidad_pagos: 0, el campo puede venir como "", null o con solo |;|. El parser devuelve [] en todos los casos.

Varios intentos de pago (mixto)

Si el pago fue mixto (109: "1"), verás varios objetos en el array retornado por el parser. Cada uno tiene su propio int_n_pago, int_id_forma_pago y dbl_valor_pagado. La suma de dbl_valor_pagado debería equivaler a flt_total_con_iva del request original.

Campos con pipe en el valor

No verificado empíricamente: no sabemos si ZonaPagos escapa los pipes en valores de campos libres como str_opcional1-5. Para evitar problemas, no incluyas | ni ; en los campos opcionales que envíes.[Pendiente con TI: confirmar si existe un mecanismo de escape.]

Ver también

Campos por medio de pago

Detalle de cada campo adicional según el medio usado.

Estados de pago

Qué significa cada valor de int_estado_pago.