Cambios FISERV · 11 y 12 de noviembre de 2026

UltraHost, modelo de pinpad FISERV: consultas y anulación de compra. Release UltraHost 20261112. APIDRIVER no cambia (sigue en v20261103b).

Resumen

4operaciones nuevas en FISERV
112 / 112escenarios de simulación OK
5revisiones independientes, sin bloqueantes
0cambios de comportamiento en PRISMA
CommitContenido
5148266refactor: extrae la lógica de anulación y consultas de PRISMA para reutilizarla. Sin cambio de comportamiento.
67d44e1feat: consultas y anulación de compra en el modelo FISERV.
Actualización desde 20261103: reemplazar UltraHost.exe y reiniciar. No requiere cambios de base de datos ni de UltraHost.ini.

Cambios

Antes

Con MODELO=FISERV, UltraHost solo aceptaba identificación de compra, compra y sincronización de pinpad. Cualquier otra operación respondía Operacion no implementada para modelo FISERV.

Consultas

Endpoint (APIDRIVER)OperaciónComportamiento
/consulta_operacionCONSULTA_OPERACION (135)Una sola llamada, sin pinpad. Misma lógica que PRISMA.
/consulta_ultimas_operacionesULTIMASOPERACIONES (122)Una sola llamada, sin pinpad. Hasta CANTIDAD_CONSULTA_ULT_OPER operaciones.

Anulación de compra

PasoEndpoint (APIDRIVER)Qué hace
1/identificacion_anulacion_compra_onlineLee la tarjeta (Y41 con ENCRIPTA=2, Y01 si no; luego Y02) y busca la compra original.
2/autorizacion_anulacion_compra_onlineAutoriza la anulación con FISERV. En chip manda Y03, tanto si se aprueba como si se rechaza.

Robustez

Reutilización de PRISMA

La lógica sin pinpad de PRISMA se extrajo a funciones que ahora usan los dos modelos: ValidarOriginalAnulacion, AutorizarAnulacionCompra, ArmarRespuestaAnulacionAprobada, ConsultaOperacion_SinPinPad y ConsultaUltOps_SinPinPad. FISERV agrega solo lo que depende del pinpad. Una revisión estática línea por línea confirmó que PRISMA hace exactamente lo mismo que antes.

Formato de los requests

Es el mismo JSON que manda el POS a APIDRIVER. Las respuestas del pinpad (datosPinPad) las agrega APIDRIVER, no el POS.

Consulta de operación

{
  "datosPos":  { "sucursal": 101, "nroPos": 1, "nroTicket": 9999 },
  "datosHost": { "idtrxtipre": 4321 }
}

Últimas operaciones

{ "datosPos": { "sucursal": 101, "nroPos": 1 } }

Anulación (los dos pasos, con el mismo ticket de la anulación)

{
  "datosPos":  { "sucursal": 101, "nroPos": 1, "nroTicket": 5001,
                 "importe": "100.00", "importe_cashback": "0.00", "documento": "12345678" },
  "datosHost": { "idtrxtipre": 4321 }
}

En el paso 1, idtrxtipre es el de la compra a anular. En el paso 2 se manda el que devolvió la identificación.

Pruebas

Simulación local, sin QA ni pinpad real: UltraHost en consola contra la base local UltraHost_Homologaciones, el simulador de autorizador FirstData en 127.0.0.1:28200 y un script Python que hace de APIDRIVER y de pinpad con datos de tarjeta sintéticos. Está en C:\Work\AI\FISERV\sim_fiserv\.

GrupoQué cubreResultado
ComprasCompra aprobada y rechazada, y compra por chip con Y03: aprobada, rechazada con 51 y sin respuesta del host.OK
ConsultasOperación existente, inexistente, campos faltantes, otra sucursal o POS, tope de 15 y operaciones rechazadas.OK
AnulaciónBanda, manual, chip y contactless, con ENCRIPTA=0 y ENCRIPTA=2. También segunda anulación, reimpresión y lote cerrado.OK
Anulación, casos negativosOriginal inexistente, otra tarjeta, otro importe, original rechazada, errores de pinpad en cada paso y rechazo del host.OK
Últimos 4 dígitosMisma tarjeta aceptada; mismo emisor con otros 4 dígitos rechazado (241), en todos los modos de lectura.OK
RobustezHost caído durante la anulación, cashback, pedidos simultáneos, reintentos, V04 y filas de error con borrado fallido.OK
Comparación con PRISMALas mismas pruebas sobre PRISMA antes y después del cambio, y sobre FISERV, comparando las respuestas campo por campo.OK

Revisiones

RevisiónResultado
Equivalencia de PRISMASin hallazgos Todas las funciones extraídas son equivalentes.
RiesgoSin bloqueantes Hallazgo medio abierto: no hay límite de intentos de identificación.
ResilienciaSin bloqueantes Los dos hallazgos medios están arreglados.
LegibilidadSin bloqueantes Comentarios, helper único y enum arreglados.
Confiabilidad de las pruebasResuelta Se agregaron los casos que faltaban.
Revisión final de los arreglosSin bloqueantes El hallazgo medio (fila de error 120) está arreglado y tiene su prueba.

Pendientes

Anexo A · Errores que recibe el POS

Todos llegan en datosHost.codigo_resultado y mensaje_resultado. Ante cualquier código distinto de 0, APIDRIVER manda Y06 para liberar el pinpad.

A.1 · El pinpad responde Y0E

Código al POS = 1000 + código del pinpad. Mensaje: ERROR EN PINPAD (NN). El código extendido (CEX) solo va al log.

Validación:
  • Manuales: V02 y V04 tienen la misma tabla, del 01 al 09 y del 12 al 39, y el mismo formato Y0E + comando recibido (3) + código (2) + extendido opcional.
  • Código: UltraHost lee el código en la misma posición para los dos protocolos y responde 1000 + código para cualquier valor, así que todos quedan contemplados, incluso los que no figuran en el manual. POSDINO hace lo mismo (pos_ppfd.cpp:2579-2587) y además usa el código 11, error de LRC, que no está en el manual.
  • Fuera del Y03: el Y0E se trata igual en cualquier paso: lectura, Y02, sincro e identificación de anulación.
  • Después del Y03: el Y0E no cambia el resultado (ver A.4).
  • Diferencia con POSDINO: POSDINO muestra la descripción en pantalla (ShowErrorPinPad); UltraHost solo devuelve el número.
Al POSPinpadSignificado (manual)
100101Cancelado
100202Error en el ingreso de los últimos 4 dígitos
100303Error de lectura del track 2
100404Error al ingresar el PIN
100505Error de chip
100606Fecha inválida
100707Timeout
100808Error en la secuencia de comandos
100909Error en el formato del comando
101111Error de LRC (lo usa POSDINO, no figura en el manual)
101212Error al eliminar el registro
101313Registro no encontrado
101414Error de desencripción
101515Error de encripción
101616Falta la definición por Y00
101717Falta la posición de la master key
101818Falta la working key
101919Falta la master key
102020Debe sincronizar
102121Error de protocolo (por ejemplo, una versión V02/V04 que no coincide)
102222Funcionalidad no disponible (solo PP)
102323Sin papel (solo POS)
102424Error en el formato de línea (solo POS, comando Y05)
102525Error contactless: intente por chip
102626Error en la longitud del certificado
102727Ticket no encontrado
102828Formato de DNI inválido
102929Error de autenticación de archivo
103030Clave RSA disponible
103131Clave RSA ausente
103232Dato inválido
103333Ticket pendiente de envío
103434Retire la tarjeta del lector de chip
103535Error al imprimir y al generar el archivo (solo POS)
103636Cancelado con Y06
103737Reintentar por banda
103838Terminal ocupada
103939Reintentar EMV (chip o contactless)

A.2 · Errores que genera APIDRIVER (YEE)

Código 99, con el texto que manda APIDRIVER:

MensajeCausa
Error PinPad: Existe operacion previa usando puerto serie: COMxHay otra operación en curso sobre el puerto.
Error PinPad: No se pudo abrir el puerto de comunicacion: COMxPinpad desenchufado o COM cambiado.
Error PinPad: Al enviar datosFalló la escritura al puerto.
Error PinPad: al esperar ACK luego de envio de datosEl pinpad no confirmó la trama (5 intentos).
Error PinPad: No se recibe respuestaVenció el timeout del comando.

A.3 · Otras respuestas del pinpad

CódigoMensajeCuándo
269OPERACION CANCELADA EN PINPAD (Y06)Llega el ack de un Y06 fuera del Y03.
269ERROR DENEGADA_POR_PINPADEl chip deniega con Z1 en la lectura (contactless).
266ERROR_COMANDO_PINPAD_NO_ESPERADOEl comando no corresponde al paso. Hay variantes con texto propio: Respuesta Y41/Y00/S00/S01 invalida del pinpad, Pinpad rechazo la sincronizacion (S02) y Contactless sin EPT no soportado.
265ERROR_COMANDO_PINPAD_NO_SOPORTADOEl pinpad devolvió un comando que FISERV no maneja.
264ERROR_SINCRO_FALTAN_DATOS_IDEEn la sincro faltan los datos del IDE.
262ERROR_FALTA_ID_ENCRIPCIONEn la sincro falta el ID de encripción.

A.4 · Anulación

CódigoMensajeCuándo
241ERROR DIFIERE TARJETA TRX ORIGINALNo coinciden el emisor o los últimos 4 dígitos. El log dice cuál de los dos.
121ERROR EMISOR DESCONOCIDONo se pudo resolver el emisor de la tarjeta.
270NO_ID_ANULACIONSe autoriza sin una identificación completa.
137ERROR_SQL_CONNECTFalló el borrado de las identificaciones previas.

Respuestas al Y03 que no son error: después de que FISERV aprobó, cualquier respuesta (Z3, Y0E, YEE, Y06 o vacía) deja la operación aprobada. Si el host rechazó, el POS recibe el código del host y no el del pinpad.

A.5 · Errores propios de APIDRIVER

CódigoMensaje
998Error: No responde/faltan datos UltraHost
997Error: No hay datos recibidos de UltraHost para enviar al PinPad!

Anexo B · Bloque de claves del Y02 en V04

La tabla de campos del manual es igual en V02 y V04: PMK(1) LWK(1) WKP(1..48) <FS> WKD(1..48) <FS>.

Bloque sin clavesPMKLWK
Ejemplo del manualNNN<FS>N<FS>NN
UltraHost02N<FS>N<FS>02 fijo