Ir al contenido
FINORA Academy
SistemaFINORA Merchant

FINORA Merchant · Tutorial

Integra el SDK de FINORA Pago en una app Android en 10 minutos

PilotoVerificadoIntermedio15 min

Que tu app Android cobre un pedido con FINORA Pago instalado en el mismo teléfono, sin tocar datos de tarjeta, y que lo compruebes con un cobro de demostración.

  • Android Studio y un proyecto Kotlin con minSdk 23 o superior.
  • Un teléfono Android con FINORA Pago 0.16.0 o superior, variante de demostración, enrolado en un comercio de pruebas (lo entrega FINORA bajo acuerdo).
  • Tu app autorizada en la lista de integradores del comercio. Si todavía no lo está, haz primero el paso 1 de la lección 5 y vuelve.
  1. Agrega el repositorio Maven de FINORA en settings.gradle.kts. Su URL está en la guía «Inicio rápido» del SDK de cobro Android, en el portal de desarrolladores de FINORA:

    dependencyResolutionManagement {
    repositories {
    google()
    mavenCentral()
    maven("<URL_DEL_REPOSITORIO_MAVEN>") // la publica el portal de desarrolladores de FINORA
    }
    }
  2. Agrega la dependencia en app/build.gradle.kts y sincroniza Gradle:

    dependencies {
    implementation("com.dcgeeks.finora:pago-sdk:1.0.0-beta.3")
    }

    El SDK declara por ti las <queries> de Android 11 y trae sus reglas de R8. Solo depende de androidx.activity.

  3. Registra el contrato de cobro en tu Activity (o en Compose con rememberLauncherForActivityResult). Para la prueba apunta a la variante de demostración, que no mueve dinero:

    private val cobrar = registerForActivityResult(FinoraPago.Cobrar(Contrato.PAQUETE_DEMO)) { r ->
    when {
    r.aprobada -> entregarPedido(r.referenciaExterna, r.autorizacion, r.ultimos4, r.marca)
    r.estado.requiereConsulta -> marcarParaConsultar(r) // EN_DUDA: nunca cobres otra vez
    else -> mostrar(r.mensaje)
    }
    }
  4. Lanza el cobro desde el botón «Cobrar» del pedido:

    fun alPulsarCobrar(p: Pedido) = cobrar.launch(
    SolicitudCobro.Builder()
    .montoCentavos(p.montoCentavos) // 12_500 = 125,00
    .moneda("VES")
    .referenciaExterna(p.referencia) // PED-1001: tu clave de idempotencia
    .sucursalCodigo(p.tienda) // obligatoria: la tienda de origen
    .build() // valida igual que FINORA Pago
    )
  5. Comprueba el estado antes de mostrar el botón (opcional, recomendado). Hazlo fuera del hilo principal:

    val e = FinoraPago.estado(context)
    when {
    !e.instalado -> pedirInstalarFinoraPago()
    !e.autorizado -> mostrar("Pide al comercio que autorice esta app")
    !e.listo -> mostrar(e.motivo)
    else -> habilitarCobro()
    }
  6. Prepara el lector al abrir el pedido para que el cliente no espere la conexión Bluetooth (detalle en la lección 8):

    lifecycleScope.launch { withContext(Dispatchers.IO) { FinoraPago.prepararLector(context) } }

La app Reparto de ejemplo de FINORA hace exactamente esto con varios pedidos de distintas tiendas: botones «Cobrar», «Cobrar con Tarjeta FINORA», «Anular» y «Preparar lector», y en la cabecera la huella de su propio certificado para darla de alta. Fíjate en tres decisiones suyas:

  • El botón «Cobrar» se deshabilita con el pedido aprobado o en duda.
  • Tras un RECHAZADA genera una referencia nueva (PED-1001-2).
  • La anulación usa una clave propia y estable (PED-1001-ANU).
  1. FinoraPago.estado(context) devuelve instalado = true, autorizado = true y listo = true.
  2. Cobra PED-1001 por 125,00: FINORA Pago abre su pantalla encima de tu app, aprueba y vuelve con APROBADA, simulado = true, últimos 4, marca, referenciaFinora y sucursalCodigo.
  3. Repite el mismo PED-1001: recibes la misma APROBADA sin que se vuelva a leer la tarjeta.
  4. Repite PED-1001 con otro monto: CONFLICTO con CONFLICTO_IDEMPOTENCIA.

Si los cuatro resultados coinciden, tu integración básica está lista.

Siguiente: Lección 3 · Cobro en la nube por API y webhooks