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.propertiesexterno. - Script de arranque
r.batcorregido.
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.
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)
| Área | Antes | Ahora | Acción al actualizar |
|---|---|---|---|
| Protocolo PP-Caja | Solo V02 (implícito) | V02 / V04 por terminal | Correr add_protocolo_pinpad_column.sql; setear mTerminal.cProtocoloPinPad='V04' en los terminales que usen V04. |
| Esquema de base | Sin columnas nuevas | El build consulta columnas nuevas al arrancar | Correr qa_ajustes_fiserv.sql — si faltan, UltraHost no arranca. |
| Protocolo binario POS↔UH | Layout de struct anterior | Layout NSL21 | El 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 264 | Resuelve el terminal primero | Ninguna (código). |
| Bitmap de sincro (SINCROPP) | Campo 11 marcado requerido → conform 126 | Layout validado | Revisar la nota de bitmap en qa_ajustes_fiserv.sql. |
| Build / toolchain | VS2012 | VS2012 / VS2026 (v145), x86 self-contained | Reemplazar UltraHost.exe. |
APIDRIVER vs 20231017
| Área | Antes | Ahora | Acción al actualizar |
|---|---|---|---|
| Concurrencia (HIGH) | jsoncontainer compartido (campo de instancia) → respuestas cruzadas bajo carga | Local por-llamada | Ninguna (código). |
| Puerto serie (HIGH) | El lock no se liberaba ante excepción → "Existe operacion previa" hasta reiniciar | Liberación del puerto + lock en finally | Ninguna (código). |
| Configuración | Embebida en el jar | Archivo .properties externo | Crear el apidriver.properties externo + usar la línea de arranque con -Dspring.config.location antes del -jar. |
| Artefacto | APIDRIVER-20231017.jar | APIDRIVER-20261003.jar | Reemplazar el jar. |
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)
Pasos
- Parar el servicio / proceso UltraHost.
- Backup: base de datos +
UltraHost.ini+UltraHost.exeactual. - 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énadd_protocolo_pinpad_column.sql. - .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.) yMAXFAILOVER_RESTART=2en producción. Ver la tabla completa en «UltraHost — configuración (.ini)». - Reemplazar
UltraHost.exepor el del release. - Arrancar y verificar en
UltraHost.logque cargó las tablas maestras sin error. Si corta ahí → falta una columna SQL (volver al paso 3). - (V02/V04) Si se usa V04 en algún terminal, setear
mTerminal.cProtocoloPinPad='V04'y reiniciar. Ver «Soporte V02 / V04».
.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)
Pasos
- Parar APIDRIVER.
- Backup: jar actual + el
.propertiesexterno si ya existía +r.bat. - .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.locationreemplaza al embebido, así que el externo debe tener todo. - Reemplazar el jar por
APIDRIVER-20261003.jar. - Arranque (requerido). Actualizar
r.bata la línea con-Dspring.config.location=file:c:/.../apidriver.propertiesantes del-jar(barras normales en la URI). - Arrancar y verificar:
Tomcat started on port(s): 50001yStarted ApidriverpinpadApplication.
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.
Puertos y topología
| Componente | Puerto | Uso |
|---|---|---|
| APIDRIVER | 50001 | HTTP REST (la Caja le pega acá) |
| APIDRIVER | COMx serie | Pinpad físico — por defecto 7E1 @ 115200 (ver .properties) |
| UltraHost | 20004 | Binario POS-PinPad EMV (el canal de las operaciones EMV) |
| UltraHost | 20003 | Binario POS-PinPad (no EMV) |
| UltraHost | 30003 | WebService |
| UltraHost | 50000 | WebService JSON (USA_CONTACTLESS=1) |
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 → error263al operar). - ☐ El terminal de prueba existe en
mTerminaly resuelve a un POS/sucursal válido. - ☐ APIDRIVER levanta en
50001y abre elCOMxdel 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ódigo | Nombre | Qué pasó / dónde mirar |
|---|---|---|
28 | COMUNICACION | UltraHost no pudo hablar con el autorizador FISERV. Falla al enviar (después de armar el mensaje). Revisar IP/puerto del procesador y conectividad. |
126 | CONFORM_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. |
263 | FALTA_ID_PROCESADOR | No 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
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.
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
- Los
-D...van ANTES del-jar. Lo que va después del-jarla 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)
| Clave | Valor de prueba | Descripción |
|---|---|---|
server.port | 50001 | Puerto HTTP del relay. |
COMPORT | COM1 | Puerto serie del pinpad (ajustar por máquina). |
COMPORT_VELOCIDAD | 115200 | Baudios. |
COMPORT_DATOS | 7 | Bits de datos. |
COMPORT_PARIDAD | 2 | Paridad (2 = EVEN / par). |
COMPORT_STOP | 1 | Bits de stop. Combinado: 7E1 @ 115200. |
COMPORT_TIMEOUT_COMANDO | 60 | Timeout por comando (seg). |
ULTRAHOST_CONN_TIMEOUT | 10000 | Timeout de conexión a UltraHost (ms). |
ULTRAHOST_READ_TIMEOUT | 180000 | Timeout de lectura (ms). |
URL_IDENTIFICACION … | http://127.0.0.1:50000/… | Endpoints de identificación / autorización / anulación / consulta. |
logging.level.com.tipre | DEBUG | Nivel de log de la aplicación. |
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).
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 configura | Valor | Efecto |
|---|---|---|
mTerminal.cProtocoloPinPad | V02 | Ese terminal usa protocolo V02. |
mTerminal.cProtocoloPinPad | V04 | Ese terminal usa protocolo V04. |
mTerminal.cProtocoloPinPad | NULL / vacío | Default = 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
UltraHost — configuración (UltraHost.ini)
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)
| Clave | Valores | Descripción |
|---|---|---|
MODELO | FISERV / PRISMA | Modelo de pinpad. Para este release: FISERV. |
ENCRIPTA | 0 / 2 | Solo FISERV. 0 = sin encriptar (default). 2 = 3DES (requiere working keys ya sincronizadas en SQL). |
WK_ORIGEN | HOST / INYECTADA | Solo 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
| Clave | Sección | Descripció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):
| Tabla | Columna | Para qué |
|---|---|---|
mEmisor | iUsaWorkingKeyNro (smallint) | Working key a usar (bloquea el arranque si falta). |
mProcesador | cIP2 / iPort2 | IP / puerto de failover del procesador. |
mTerminal | cWorkingKeyNew2 | Segunda working key (si iUsaWorkingKeyNro=2). |
mTerminal | cNroSeriePinPad, cVersionAppPinPad, cProtocoloPinPad | Datos de pinpad + versión de protocolo (V02/V04). |
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 (posible8N1 @ 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=2en producción. - UltraHost — ejecutable: el
.exeno se distribuye en el release; se genera/despliega internamente.