Saltar al contenido principal

Rendimiento y lector listo

Beta

Requiere FINORA Pago 0.16.0 y el SDK 1.0.0-beta.3. Las cifras de esta página son las medidas el 2026-10-21 en un teléfono real con lector Bluetooth y FINORA Pago 0.15.3, antes del lector precalentado. La medición en caliente con la 0.16.0 en el mismo equipo está en curso; esta página se actualizará con sus cifras.

Dónde se va el tiempo​

En un teléfono con lector de tarjetas por Bluetooth, el tramo lento no es la red ni la autorización: es conectar el lector y dejarlo listo. Medido el 2026-10-21 (teléfono Android de gama media, lector Bluetooth, FINORA Pago 0.15.3):

TramoPrimer cobro (lector frío)Cobro con el lector ya conectado
Conexión Bluetooth del lector≈ 2,3 s0 s
Lector listo para leer (tablas EMV)≈ 8 s másInmediato
Autorización ida y vuelta≈ 0,5 s≈ 0,5 s

Antes de la 0.16.0, cada conexión volvía a escribir las tablas EMV en el lector. Desde la 0.16.0, FINORA Pago recuerda qué tablas tiene cada lector y al reconectar solo las confirma (una consulta); las escribe de nuevo únicamente si cambiaron. La primera conexión de cada lector tras instalar la 0.16.0 todavía las escribe una vez.

Prepara el lector antes del cobro​

Llama a FinoraPago.prepararLector(context) en cuanto sepas que viene un cobro: al abrir el pedido, al llegar a la entrega, al mostrar el total. FINORA Pago conecta el lector y confirma sus tablas en segundo plano y sin efectos de cobro: no abre pantalla, no crea órdenes, no lee tarjetas.

// Al abrir la pantalla del pedido, fuera del hilo principal:
lifecycleScope.launch {
val e = withContext(Dispatchers.IO) { FinoraPago.prepararLector(context) }
if (e.lectorEstado == Contrato.EstadoLector.ERROR) avisar(e.motivo) // p. ej., lector apagado
}

La llamada vuelve enseguida con el estado de ese momento; la preparación sigue en FINORA Pago. Si quieres esperarla (por ejemplo, para habilitar el botón «Cobrar» con el lector listo), vuelve a mirar FinoraPago.estado(context) cada medio segundo hasta lectorListo, con un tope:

var e = FinoraPago.prepararLector(context)
val inicio = SystemClock.elapsedRealtime()
while (!e.lectorListo && e.lectorEstado != null && e.lectorEstado != Contrato.EstadoLector.ERROR &&
SystemClock.elapsedRealtime() - inicio < 30_000) {
delay(500)
e = FinoraPago.estado(context)
}

No es obligatorio esperar. lectorListo no condiciona listo: con el lector frío FINORA Pago cobra igual, solo tarda más. Y si el cobro llega mientras el lector se prepara, espera a esa preparación y la encuentra hecha.

Estado del lector​

lectorEstadoSignificado
LISTOConectado y con las tablas confirmadas: el cobro empieza sin esperar al lector (lectorListo = true)
CONECTANDO / PREPARANDOFINORA Pago lo está dejando listo
DESCONECTADOSin enlace: se conectará al preparar o al cobrar
ERRORNo se pudo conectar (apagado, fuera de alcance, sin vincular). motivo lo explica
NO_APLICAEl equipo tiene un lector interno o simulado: siempre listo para esto
nullFINORA Pago anterior a 0.16.0, que no lo informa

Con un FINORA Pago anterior a 0.16.0, prepararLector devuelve lo mismo que estado() y no prepara nada: tu app no se rompe, el lector se conecta al cobrar como siempre.

prepararLector solo surte efecto para apps autorizadas por el comercio (ver Seguridad y alta); a las demás FINORA Pago no les prepara nada. Tampoco toca nunca un cobro en curso.

Cuánto tiempo se mantiene listo​

FINORA Pago también prepara el lector por su cuenta cuando se abre, cuando llega una orden y cuando tu app consulta estado(). Mientras haya actividad reciente, lo mantiene conectado: cada 30 segundos comprueba el enlace y lo reconecta si se cayó. Pasados 15 minutos sin actividad suelta el enlace para ahorrar batería del teléfono y del lector.

El comercio puede cambiar esa ventana para cada terminal en su consola (parámetro «Lector listo (minutos)», de 0 a 240; 0 apaga el precalentado y el lector se conecta al cobrar).

Mide tus cobros​

Desde la 0.16.0, FINORA Pago escribe en el registro del sistema (etiqueta FinoraTiempos) una línea por tramo de cada cobro y un resumen al cerrarlo. No contiene datos de la tarjeta ni del cliente: solo la referencia de la orden, el tramo, los milisegundos y si el lector estaba frío o caliente.

I/FinoraTiempos: id=3 ref=FNR123 origen=SDK tramo=LECTOR_LISTO t=<ms> d=<ms> arranque=CALIENTE
I/FinoraTiempos: resumen id=3 ref=FNR123 origen=SDK arranque=CALIENTE desenlace=Aprobado total=<ms> marcas=SOLICITUD:0,…
TramoQué marca
SOLICITUDLlegó tu petición
ESPERANDO_TARJETALa pantalla pide la tarjeta
LECTOR_LISTOEl lector está listo (arranque=FRIO si hubo que conectarlo, CALIENTE si estaba preparado)
TARJETA_PRESENTADA / DATOS_LEIDOSEl cliente presentó la tarjeta / la lectura terminó
ENVIO_AUTORIZACION / VEREDICTOSale la autorización / llega la respuesta
FIRMA / RECIBOFirma (solo si aplica) / recibo en pantalla
RESPUESTA_INTEGRADORTu app ya tiene el resultado

t son los milisegundos desde la solicitud y d desde la marca anterior. Con el equipo conectado por USB puedes leerlo con adb logcat -s FinoraTiempos.