Release 20261003 — APIDRIVER + UltraHost

Integración de terminal de pago FISERV / PP-Caja. Documento orientado a testers (con detalle técnico para devs). Cubre los dos componentes que se liberan juntos.

Resumen — qué incluye este release

APIDRIVER 20261003

Relay Java / Spring Boot entre la Caja (POS) y el pinpad por puerto serie. Expone HTTP en 50001.

  • 2 bugs HIGH corregidos (concurrencia + lock de puerto serie).
  • Configuración externalizada: ahora lee un apidriver.properties externo.
  • Script de arranque r.bat corregido.

UltraHost FISERV

Gateway ISO 8583 contra el autorizador. Modelo de pinpad FISERV.

  • Soporte V02 / V04 por terminal del protocolo PP-Caja.
  • Sincronización de pinpad FISERV (S00/S01/S02) + working keys.
  • Build con Visual Studio 2026 (toolset v145), x86 self-contained.
  • Ajustes de base (SQL) para QA documentados.
Antes de probar: los dos componentes se liberan en conjunto. Levantá primero UltraHost (gateway) y después APIDRIVER (relay del pinpad). El pinpad físico se conecta a la máquina donde corre APIDRIVER.
Validado E2E en QA: con este build (y clientes en NSL21) la compra contactless toma el bitmap encriptado (ENC, sModoIngreso=3, iIdBitmap=10002) y el ISO 0200 llega al autorizador FISERV. La respuesta del autorizador (campo 39) ya es tema de homologación con FISERV, no del gateway.

Qué cambió respecto de la versión anterior

Cada fila mapea el cambio con la acción requerida al actualizar. «Ninguna (código)» = ya viene en el binario, no hay que hacer nada.

UltraHost vs build anterior (p. ej. UH230508)

ÁreaAntesAhoraAcción al actualizar
Protocolo PP-CajaSolo V02 (implícito)V02 / V04 por terminalCorrer add_protocolo_pinpad_column.sql; setear mTerminal.cProtocoloPinPad='V04' en los terminales que usen V04.
Esquema de baseSin columnas nuevasEl build consulta columnas nuevas al arrancarCorrer qa_ajustes_fiserv.sql — si faltan, UltraHost no arranca.
Protocolo binario POS↔UHLayout de struct anteriorLayout NSL21El cliente/POS debe enviar en NSL21. No requiere cambio de base.
Sincro FISERV (WK inyectadas)Leía las WK antes de resolver el terminal → error 264Resuelve el terminal primeroNinguna (código).
Bitmap de sincro (SINCROPP)Campo 11 marcado requerido → conform 126Layout validadoRevisar la nota de bitmap en qa_ajustes_fiserv.sql.
Build / toolchainVS2012VS2012 / VS2026 (v145), x86 self-containedReemplazar UltraHost.exe.

APIDRIVER vs 20231017

ÁreaAntesAhoraAcción al actualizar
Concurrencia (HIGH)jsoncontainer compartido (campo de instancia) → respuestas cruzadas bajo cargaLocal por-llamadaNinguna (código).
Puerto serie (HIGH)El lock no se liberaba ante excepción → "Existe operacion previa" hasta reiniciarLiberación del puerto + lock en finallyNinguna (código).
ConfiguraciónEmbebida en el jarArchivo .properties externoCrear el apidriver.properties externo + usar la línea de arranque con -Dspring.config.location antes del -jar.
ArtefactoAPIDRIVER-20231017.jarAPIDRIVER-20261003.jarReemplazar el jar.
Serie (verificar): esta versión usa 7E1 @ 115200. Si la instalación anterior venía con otra config de puerto serie (p. ej. 8N1 @ 19200), confirmar cuál corresponde antes de dar por buena la actualización en producción.

Actualizar UltraHost (soporte técnico)

Actualizar una instalación existente de UltraHost requiere SÍ o SÍ: (1) correr el script SQL, (2) revisar el UltraHost.ini, y (3) reemplazar el ejecutable. No alcanza con cambiar el .exe solo — si falta una columna de base, el servicio no arranca.

Pasos

  1. Parar el servicio / proceso UltraHost.
  2. Backup: base de datos + UltraHost.ini + UltraHost.exe actual.
  3. SQL (requerido). Correr en la base qa_ajustes_fiserv.sql (idempotente). Agrega columnas que el build nuevo consulta al arrancar — si faltan, UltraHost corta en la carga de tablas maestras y no levanta. Si la base no tiene la columna de protocolo de pinpad, correr también add_protocolo_pinpad_column.sql.
  4. .ini (requerido). En UltraHost.ini, sección [PINPAD]: MODELO=FISERV, ENCRIPTA (0 ó 2), WK_ORIGEN (HOST / INYECTADA). En [HOST]: verificar puertos (PORTBINARY_POS_PINPAD_EMV=20004, etc.) y MAXFAILOVER_RESTART=2 en producción. Ver la tabla completa en «UltraHost — configuración (.ini)».
  5. Reemplazar UltraHost.exe por el del release.
  6. Arrancar y verificar en UltraHost.log que cargó las tablas maestras sin error. Si corta ahí → falta una columna SQL (volver al paso 3).
  7. (V02/V04) Si se usa V04 en algún terminal, setear mTerminal.cProtocoloPinPad='V04' y reiniciar. Ver «Soporte V02 / V04».
Rollback: volver al .exe y .ini anteriores. Las columnas SQL agregadas son NULL-ables y no rompen el build viejo, así que pueden quedar.

Actualizar APIDRIVER (soporte técnico)

APIDRIVER NO requiere base de datos. Actualizar requiere: (1) el archivo .properties externo, (2) reemplazar el jar, y (3) la línea de arranque correcta.

Pasos

  1. Parar APIDRIVER.
  2. Backup: jar actual + el .properties externo si ya existía + r.bat.
  3. .properties (requerido). Crear / actualizar el archivo externo (ej. c:/Work/APIDRIVER/apidriver.properties) con la config completa (puerto, COM, URLs, timeouts). Ver la tabla «APIDRIVER — configuración». Recordar: spring.config.location reemplaza al embebido, así que el externo debe tener todo.
  4. Reemplazar el jar por APIDRIVER-20261003.jar.
  5. Arranque (requerido). Actualizar r.bat a la línea con -Dspring.config.location=file:c:/.../apidriver.properties antes del -jar (barras normales en la URI).
  6. Arrancar y verificar: Tomcat started on port(s): 50001 y Started ApidriverpinpadApplication.
Rollback: volver al jar anterior y a la línea de arranque previa. No hay cambios de base que revertir.

Inicio rápido (prueba E2E)

Topología de una prueba típica: Caja/POS → APIDRIVER (serie → pinpad) ↔ UltraHost (ISO 8583) → autorizador FISERV.

1) UltraHost (gateway)

cd C:\Work\AI\FISERV\ULTRAHOST
UltraHost.exe -d        REM consola, modo debug

Usa UltraHost.ini del mismo directorio. Verificá en el log UltraHost.log que arrancó y que las listas de base cargaron.

2) APIDRIVER (relay del pinpad)

cd C:\Work\AI\FISERV\APIDRIVER
r.bat
REM equivale a:
java -Dspring.config.location=file:c:/Work/APIDRIVER/apidriver.properties -jar target/APIDRIVER-20261003.jar

Al arrancar debe loguear Tomcat started on port(s): 50001 y Started ApidriverpinpadApplication.

Pinpad ya sincronizado: si el pinpad ya tiene las working keys cargadas, no hace falta repetir la sincronización para cada prueba.

Puertos y topología

ComponentePuertoUso
APIDRIVER50001HTTP REST (la Caja le pega acá)
APIDRIVERCOMx seriePinpad físico — por defecto 7E1 @ 115200 (ver .properties)
UltraHost20004Binario POS-PinPad EMV (el canal de las operaciones EMV)
UltraHost20003Binario POS-PinPad (no EMV)
UltraHost30003WebService
UltraHost50000WebService JSON (USA_CONTACTLESS=1)
Ojo con el puerto EMV: el canal binario EMV de UltraHost es 20004 en esta configuración. Si algún cliente está apuntando a otro puerto (p. ej. 30004), no va a encontrar listener.

Checklist de prueba E2E

  • ☐ UltraHost arrancó sin errores de carga de base (revisar UltraHost.log).
  • ☐ El procesador FISERV está habilitado y alcanzable en mProcesador (si no → error 263 al operar).
  • ☐ El terminal de prueba existe en mTerminal y resuelve a un POS/sucursal válido.
  • ☐ APIDRIVER levanta en 50001 y abre el COMx del pinpad.
  • ☐ Sincronización de pinpad OK (si aplica) — el pinpad acepta las working keys.
  • ☐ Operación de prueba (compra) → revisar código de respuesta y el dump ISO (x25.bin).

Errores comunes y qué significan

CódigoNombreQué pasó / dónde mirar
28COMUNICACIONUltraHost no pudo hablar con el autorizador FISERV. Falla al enviar (después de armar el mensaje). Revisar IP/puerto del procesador y conectividad.
126CONFORM_BITMAP (aparece como "FALTAN DATOS [BNC]")Falta un campo que el bitmap marca como requerido. Ocurre al armar el mensaje, antes de enviar. El "[BNC]" es la etiqueta genérica del error, no un campo puntual — mirar qué campo ISO reporta vacío en el log.
263FALTA_ID_PROCESADORNo se pudo resolver el procesador para esa operación (config), o el procesador FISERV no está habilitado/alcanzable. Revisar mProcesador.
264(sincro INYECTADA)En sincro con working keys inyectadas: el terminal no estaba resuelto antes de leer las WK. Corregido en este release.
266(sincro — WK rechazada)El pinpad rechazó las working keys (no validan contra su Master Key / SAM). Es un tema de provisión del pinpad, no de software.

APIDRIVER 20261003 — cambios

Correcciones HIGH

HIGH-1 · Concurrencia: el contenedor de respuesta (jsoncontainer) era un campo de instancia en el controller (singleton). Dos requests concurrentes se pisaban el estado y una respuesta podía salir con datos de otra. Fix: ahora es local por-llamada.
HIGH-2 · Lock de puerto serie: si la transmisión al pinpad tiraba una excepción, el lock del puerto quedaba tomado y el puerto abierto para siempre → toda operación siguiente respondía "Existe operacion previa" hasta reiniciar. Fix: el cierre del puerto y la liberación del lock van en finally, pase lo que pase.

Configuración externalizada

APIDRIVER ahora lee su configuración de un archivo externo (apidriver.properties) en vez del embebido en el jar. Criterio: externo siempre, interno nada.

  • Otros cambios recogidos desde 2022: manejo de ACK del pinpad y ajustes de modelo de host.

APIDRIVER — cómo correrlo

java -Dspring.config.location=file:c:/Work/APIDRIVER/apidriver.properties -jar target/APIDRIVER-20261003.jar
Dos reglas que importan:
  • Los -D... van ANTES del -jar. Lo que va después del -jar la JVM lo pasa como argumentos de programa y Spring los ignora.
  • En la URI usar barras normales: file:c:/Work/.... Con backslashes (c:\Work\...) el parser se los come y no encuentra el archivo.

spring.config.location reemplaza la ubicación por defecto (no la suma): el application.properties embebido deja de leerse, así que el externo tiene que estar completo.

APIDRIVER — configuración (apidriver.properties)

ClaveValor de pruebaDescripción
server.port50001Puerto HTTP del relay.
COMPORTCOM1Puerto serie del pinpad (ajustar por máquina).
COMPORT_VELOCIDAD115200Baudios.
COMPORT_DATOS7Bits de datos.
COMPORT_PARIDAD2Paridad (2 = EVEN / par).
COMPORT_STOP1Bits de stop. Combinado: 7E1 @ 115200.
COMPORT_TIMEOUT_COMANDO60Timeout por comando (seg).
ULTRAHOST_CONN_TIMEOUT10000Timeout de conexión a UltraHost (ms).
ULTRAHOST_READ_TIMEOUT180000Timeout de lectura (ms).
URL_IDENTIFICACION …http://127.0.0.1:50000/…Endpoints de identificación / autorización / anulación / consulta.
logging.level.com.tipreDEBUGNivel de log de la aplicación.
Caveat de serie: esta prueba usa 7E1 @ 115200. Verificar contra la configuración de producción (p. ej. 8N1 @ 19200) antes de llevar este build a producción.

UltraHost (FISERV) — cambios

  • Selección de protocolo PP-Caja V02/V04 por terminal (ver sección siguiente).
  • Sincronización de pinpad modelo FISERV: flujo Y00 → S00 → S01 → S02, con manejo de working keys.
  • Corrección de sincro con WK inyectadas: se resuelve el terminal antes de leer las working keys (antes daba error 264).
  • Reconciliación del bitmap de sincro (SINCROPP) para que el conform no falle.
  • Build dual VS2012 / VS2026 (toolset v145); ejecutable x86 self-contained.
  • Assets de despliegue QA: ajustes SQL + plantilla de .ini + runbook (RUNBOOK_QA.md).
Protocolo binario POS ↔ UltraHost: usar layout NSL21. El canal binario EMV (20004) es un volcado directo del struct en C (no hay campos con tag): el layout del cable ES el struct del build. Los clientes (Caja/POS) deben enviar con el layout NSL21 contra este build. Un layout viejo desalinea los campos (p. ej. cEPT queda vacío) → la operación cae en modo banda y el bitmap pide pista en claro → BNC 126. El CRC no detecta el desalineo. No requiere cambios de base (cNSL_NroSerieLogPP ya es varchar(30) en las tablas oTrx*).

Soporte V02 / V04 (por terminal)

UltraHost ahora soporta simultáneamente las versiones V02 y V04 del protocolo PP-Caja, elegidas por terminal. Esto permite tener terminales viejos y nuevos conviviendo contra el mismo gateway.

Dónde se configuraValorEfecto
mTerminal.cProtocoloPinPadV02Ese terminal usa protocolo V02.
mTerminal.cProtocoloPinPadV04Ese terminal usa protocolo V04.
mTerminal.cProtocoloPinPadNULL / vacíoDefault = V02 (comportamiento previo, sin cambios).

La columna se agrega con add_protocolo_pinpad_column.sql. Para testers: para probar V04 en un terminal, poner cProtocoloPinPad = 'V04' en su fila de mTerminal y reiniciar UltraHost (las listas se cargan al arranque).

-- Ejemplo: pasar un terminal a V04
UPDATE dbo.mTerminal SET cProtocoloPinPad = 'V04' WHERE cNro = '<terminal>';
-- Volver a V02 (o default): poner 'V02' o NULL
Reiniciar UltraHost después de tocar la base: las tablas maestras se cargan al arranque.

UltraHost — configuración (UltraHost.ini)

Solo los cambios: el release incluye UltraHost-changes.ini (asset) — solo las claves que cambian / se agregan en este release, no un .ini completo. Agregá o verificá esas claves en tu UltraHost.ini, en la sección indicada de cada una.

Sección [PINPAD] (clave para FISERV)

ClaveValoresDescripción
MODELOFISERV / PRISMAModelo de pinpad. Para este release: FISERV.
ENCRIPTA0 / 2Solo FISERV. 0 = sin encriptar (default). 2 = 3DES (requiere working keys ya sincronizadas en SQL).
WK_ORIGENHOST / INYECTADASolo FISERV. HOST (default) pide las WK nuevas al host FISERV durante la sincro. INYECTADA usa las WK ya cargadas en mTerminal para armar el S02 directo.

Otras claves relevantes

ClaveSecciónDescripción
PORTBINARY_POS_PINPAD_EMV[HOST]Puerto del canal binario EMV (20004).
PORTBINARY_POS_PINPAD[HOST]Puerto del canal binario no-EMV (20003).
SOFTNAME[HOST]Versión de software que viaja en el campo 60 (TIP12).
MAXFAILOVER_RESTART[HOST]Watchdog. Producción = 2. En pruebas sin autorizador levantado se puede poner 0 para desactivar el reinicio automático — revertir a 2 en producción.
SERVER[SQL]Cadena ODBC a la base (servidor / base / usuario).
RSAPRIVATEFILE[EMV]Clave privada RSA para desencriptar datos de pista del pinpad.
USA_CONTACTLESS[JSONWEBSERVICE]1 = habilita contactless en el WS JSON.

UltraHost — ajustes SQL de base

Para una base que venía de una versión anterior, el build actual consulta columnas nuevas al arrancar. Si faltan, UltraHost no arranca (corta en la carga de tablas maestras). Están consolidados en qa_ajustes_fiserv.sql (idempotente):

TablaColumnaPara qué
mEmisoriUsaWorkingKeyNro (smallint)Working key a usar (bloquea el arranque si falta).
mProcesadorcIP2 / iPort2IP / puerto de failover del procesador.
mTerminalcWorkingKeyNew2Segunda working key (si iUsaWorkingKeyNro=2).
mTerminalcNroSeriePinPad, cVersionAppPinPad, cProtocoloPinPadDatos de pinpad + versión de protocolo (V02/V04).
Bitmap de sincro: si la base ya tiene el bitmap SINCROPP, no volver a insertarlo. Revisar la nota en qa_ajustes_fiserv.sql antes de tocar bitmaps.

Guía completa de despliegue y prueba: RUNBOOK_QA.md (en el repo de UltraHost).

Caveats conocidos

  • APIDRIVER — serie: esta configuración usa 7E1 @ 115200. Verificar contra producción (posible 8N1 @ 19200) antes de desplegar.
  • APIDRIVER — jar: el artefacto del release es target/APIDRIVER-20261003.jar. Si se recompila, mantener la versión fechada.
  • UltraHost — sincro de WK: si el pinpad rechaza las working keys (error 266), es provisión del pinpad (su SAM / Master Key), no software.
  • UltraHost — watchdog: dejar MAXFAILOVER_RESTART=2 en producción.
  • UltraHost — ejecutable: el .exe no se distribuye en el release; se genera/despliega internamente.