App de ejemplo
La app de ejemplo acompaña al SDK 1.0.0-beta.3 y FINORA la entrega bajo acuerdo, firmada con una llave de desarrollo como la de cualquier integrador. No se publica en el marketplace ni en una página de descarga.
Reparto de ejemplo (com.dcgeeks.finora.pago.ejemplo) es una app Jetpack Compose que usa solo la API pública del SDK. Muestra varios pedidos, cada uno de una sucursal, con los botones «Cobrar», «Cobrar con Tarjeta FINORA» y «Anular», y en la cabecera la huella SHA-256 de su propio certificado para copiarla en la lista de integradores y el botón «Preparar lector», que llama a prepararLector y muestra cuántos milisegundos tardó el lector en quedar listo.
Lo esencial
@Composable
fun Pedidos(pedidos: List<Pedido>, paquete: String = Contrato.PAQUETE_DEMO) { // la DEMO no mueve dinero
val cobrar = rememberLauncherForActivityResult(FinoraPago.Cobrar(paquete)) { r ->
when {
r.aprobada -> marcarPagado(r.referenciaExterna, r.autorizacion, r.ultimos4, r.marca)
r.estado.requiereConsulta -> marcarEnDuda(r.referenciaExterna, r.referenciaFinora)
else -> mostrar(r.mensaje)
}
}
val anular = rememberLauncherForActivityResult(FinoraPago.Reversar(paquete)) { r ->
if (r.anulada) marcarAnulado(r.referenciaExterna) else mostrar(r.mensaje)
}
pedidos.forEach { p ->
Row {
Text("Pedido ${p.numero} · ${p.sucursal}")
Button(onClick = {
cobrar.launch(
SolicitudCobro.Builder()
.montoCentavos(p.montoCentavos).moneda("VES")
.referenciaExterna(p.referencia) // nueva tras un rechazo
.sucursalCodigo(p.sucursal)
.pedido(p.numero)
.build()
)
}, enabled = !p.pagado && !p.enDuda) { Text("Cobrar") }
OutlinedButton(onClick = {
anular.launch(
SolicitudReverso.Builder()
.referenciaExterna(p.referencia)
.montoCentavos(p.montoCentavos)
.claveIdempotencia("${p.referencia}-ANU")
.build()
)
}, enabled = p.pagado) { Text("Anular") }
}
}
}
Fíjate en tres decisiones de la app de ejemplo:
- El botón «Cobrar» se deshabilita con el pedido aprobado o en duda: así nadie cobra dos veces.
- Tras un
RECHAZADAgenera una referencia nueva para el siguiente intento. - La anulación usa una clave propia y estable (
PED-1001-ANU), de modo que repetirla trasPENDIENTEno genera un segundo reverso.
Probarla
-
Instala FINORA Pago en su variante de demostración y enrola el equipo en un comercio de pruebas.
-
Instala la app de ejemplo y copia la huella que muestra en la cabecera.
-
Pide a FINORA (o al comercio de pruebas) una entrada en la lista de integradores:
[{"paquete": "com.dcgeeks.finora.pago.ejemplo", "huellas": ["<la huella copiada>"], "acciones": ["*"]}] -
En FINORA Pago, pulsa «Revisar de nuevo». La app de ejemplo debe mostrar «Autorizado».
-
Cobra un pedido, anúlalo y vuelve a cobrarlo: verás
APROBADA,ANULADAyCONFLICTO(REFERENCIA_USADA) si repites la misma referencia. Si repites la referencia de un cobro aprobado, recibes el mismo resultado sin leer la tarjeta, y una sucursal que no es del comercio respondePETICION_INVALIDA(SUCURSAL_INVALIDA).
Los cobros de la variante de demostración llegan con simulado = true y no mueven dinero.