7. API local - HTTP: el endpoint /blocked

GET /blocked indica al ECR qué endpoints de la API local todavía tienen un intercambio HTTP sin finalizar, para que un resultado iniciado antes de un bloqueo o una pérdida de conexión pueda leerse antes de enviar una nueva solicitud. En este artículo se explica qué informa el endpoint, qué no informa y cómo usarlo en una rutina de recuperación.

Qué informa

El servidor HTTP del terminal ejecuta un intercambio por cada endpoint asíncrono (/payment, /acquisition, /reversal, /update, /balanceinquiry, /giftcard). Un intercambio se abre cuando se acepta el POST (202) y se cierra cuando el ECR lee su respuesta final con GET: la respuesta final (200) o, cuando la aplicación de pago no respondió dentro del tiempo de espera del endpoint, un 408. Hasta esa lectura, el endpoint aparece en GET /blocked y se rechaza un nuevo POST en él con 403. Una respuesta final espera hasta que se lee; no caduca y sobrevive al reinicio del terminal. Un pago interrumpido por un reinicio antes de producir un resultado no deja nada en el endpoint (GET → 423): vuelva a iniciar sesión y use /status.

GET http://<terminal-ip>:8080/blocked

200 {"blocked":[]}
200 {"blocked":["/payment"]}
200 {"blocked":["/payment","/update"]}

La solicitud no tiene cuerpo y la respuesta es JSON simple, sin una envoltura Nexo. En una LAN, la dirección del terminal es la asignada por la red (por ejemplo, 192.168.1.24); mediante tethering USB es 192.168.42.129.

Nota

/blocked describe el servidor HTTP del terminal, no la aplicación de pago. Es una vista de solo lectura: llamarlo no activa ni libera nada y no cambia el estado de ningún intercambio.

Cuándo llamarlo

  • Al iniciar el ECR, antes de la primera venta: la sesión anterior puede haber terminado en mitad de un pago.
  • Después de un error de transporte o un tiempo de espera agotado mientras se sondea una operación.
  • Cuando un POST responde 403 Forbidden: todavía hay un intercambio abierto en ese endpoint.

Para cada endpoint incluido en la lista, envíe un GET sin cuerpo a esa ruta hasta que responda 200. Ese 200 contiene la respuesta final de la operación interrumpida (por ejemplo, el PaymentResponse): procésela exactamente como si hubiera llegado normalmente. El siguiente GET /blocked ya no incluirá el endpoint.

GET en el endpoint incluido en la lista responde Significado Acción del ECR
200 Respuesta final Procésela; el intercambio está cerrado.
201 Mensaje intermedio; por ahora no hay nada más que leer Muéstrelo al cajero si es un DisplayRequest; continúe sondeando.
204 Operación en curso; todavía no hay nada que leer Continúe sondeando.
206 Se devuelve un mensaje y hay más mensajes pendientes Procéselo y vuelva a llamar a GET inmediatamente.
408 La aplicación de pago no respondió dentro del tiempo de espera del endpoint La lectura del 408 cierra el intercambio; la operación continúa en el terminal. /status responde InProgress hasta que finaliza y después devuelve su resultado. Un nuevo POST enviado mientras tanto se acepta (202), pero se responde inmediatamente con Failure, ErrorCondition: Busy, TransactionInProgress.
423 No hay ningún intercambio abierto en este endpoint No hay nada que leer. Compruebe /status si todavía necesita un resultado.

Solo 200 cierra el intercambio. Detenerse en 204 o 206 deja el endpoint bloqueado y el siguiente POST se rechaza con 403.

Qué no informa

Pregunta Dónde está la respuesta
¿El terminal está libre para aceptar un nuevo pago? POST /diagnosis: POIStatus.GlobalStatus es OK o Busy. Funciona sin una sesión.
¿Cuál fue el resultado de un intercambio que ya está cerrado? POST /status: devuelve el último Payment, CardAcquisition o Reversal completado.
¿Puedo forzar el terminal para que vuelva al estado inactivo? Ningún endpoint hace eso. Un pago en curso solo se puede cancelar con /abort; una aplicación de pago bloqueada requiere reiniciar el terminal.

Por lo tanto, hay dos situaciones diferentes de «bloqueo», y /blocked solo detecta la primera:

Situación GET /blocked POST /diagnosis Acción del ECR
Hay un intercambio HTTP abierto (el resultado aún no se ha leído) Incluye el endpoint en la lista Busy mientras la operación está en curso, OK cuando el resultado está listo Haga GET en el endpoint hasta obtener 200.
La aplicación de pago está ocupada sin un intercambio abierto (se leyó un 408 mientras la operación estaba en curso o la aplicación está bloqueada) Lista vacía Busy (y /status responde InProgress) Espere y vuelva a comprobar; una vez superado el tiempo de pago, envíe un /abort; si sigue en Busy, considere la venta no resuelta y reinicie el terminal.

Tiempo de espera del endpoint

Cada endpoint tiene su propio tiempo de espera en la configuración del servidor HTTP del terminal (<Endpoint Name="/payment" TimeoutMillis="180000"/>): 180 s para /payment, el mismo en todos los terminales. Es el tiempo que el servidor HTTP espera la respuesta final de la aplicación de pago. Una vez transcurrido, la respuesta final del intercambio se convierte en 408; el endpoint permanece en /blocked y rechaza nuevos POST hasta que se lea ese 408. Mantenga el tiempo de pago del ECR por debajo de este valor (se recomiendan 120 s) para que un pago normal nunca llegue a ese límite.

Los endpoints síncronos (/login, /logout, /diagnosis, /status, /abort) tienen tiempos de espera más cortos y responden 408 en el propio POST cuando la aplicación de pago no responde a tiempo, normalmente justo después de encender el dispositivo, mientras la aplicación todavía se está iniciando. Vuelva a intentarlo unos segundos después. Mientras dicho POST está pendiente, el endpoint aparece en /blocked y un segundo POST responde 403; no hay nada que leer en él con GET (405).

Errores comunes

  • Usar /blocked como comprobación de disponibilidad del terminal. Una lista vacía solo significa que no hay ningún resultado esperando para ser leído. Use /diagnosis.
  • Llamar a /status mientras un endpoint aparece en la lista. /status devuelve la transacción completada anteriormente, no la que sigue abierta. Vacíe primero el endpoint.
  • Sondear /blocked en lugar del endpoint de la operación durante un pago. Durante un pago, sondee GET /payment; /blocked es para la recuperación.

Para consultar la lógica completa de recuperación (diario de transacciones, reglas de ServiceID, comprobación de coherencia en /status), consulte el artículo «Evitar pagos duplicados desde el ECR». ¿Necesita ayuda? Póngase en contacto con el servicio de asistencia de Market Pay en assist.market-pay.com.

¿Fue útil este artículo?

Usuarios a los que les pareció útil: 0 de 0