De cero a tu primer cobro
SDK 1.0.0-beta.3 y FINORA Pago 0.16.0 en su variante de demostración. Los cobros de este tutorial son simulados (simulado = true) y no mueven dinero. No uses el SDK con dinero real hasta que esta sección diga «Disponible».
En este tutorial pasas de nada a un cobro aprobado y anulado, en este orden: primero con la app de ejemplo de FINORA (para comprobar que el equipo y la lista de integradores están bien) y después con tu propia app. Calcula unos 30 minutos.
Lo que necesitas
| Pieza | Quién la da |
|---|---|
| Un teléfono Android 6.0 o superior | Tú |
FINORA Pago 0.16.0, variante de demostración (com.dcgeeks.finora.pago.demo) | FINORA, bajo acuerdo |
Un comercio de pruebas con un terminal y al menos una sucursal (por ejemplo CENTRO) | FINORA |
La app de ejemplo Reparto de ejemplo (com.dcgeeks.finora.pago.ejemplo) | FINORA, bajo acuerdo |
Android Studio y un proyecto Kotlin con minSdk 23 o superior | Tú |
| Alguien con acceso a la consola del comercio para editar la lista de integradores | El comercio (o FINORA en el comercio de pruebas) |
Paso 1. Enrola FINORA Pago
- Instala FINORA Pago (variante de demostración) en el teléfono.
- Ábrelo y enrólalo en el comercio de pruebas con el código que te entregue FINORA.
- Comprueba que la pantalla principal dice que está en línea. Si usas un lector Bluetooth, vincúlalo desde FINORA Pago; con el lector simulado no hace falta.
Paso 2. Prueba con la app de ejemplo
La app de ejemplo usa solo la API pública del SDK. Si ella cobra, el equipo, el servidor y la lista están bien, y cualquier fallo posterior estará en tu app.
-
Instala Reparto de ejemplo. En su cabecera verás la huella SHA-256 de su certificado y el estado «No autorizado».
-
Pide al comercio (en el de pruebas, a FINORA) que agregue esta entrada a la lista de integradores. La edita en la consola: Parámetros de aplicación › FINORA Pago para Android › Apps integradoras autorizadas (SDK), grupo Integración (ver Seguridad y alta):
[{"paquete": "com.dcgeeks.finora.pago.ejemplo", "huellas": ["<la huella que muestra la app>"], "acciones": ["*"]}] -
En FINORA Pago pulsa «Revisar de nuevo». La app de ejemplo debe pasar a «Autorizado».
-
Pulsa «Preparar lector» (opcional): la app muestra cuántos milisegundos tardó el lector en quedar listo.
-
Pulsa «Cobrar» en un pedido. FINORA Pago abre su pantalla, cobra y vuelve: el pedido queda pagado con últimos 4, marca y autorización.
-
Pulsa «Anular»: el pedido queda anulado.
Si algo falla aquí, mira la tabla de problemas frecuentes antes de seguir.
Paso 3. Agrega el SDK a tu app
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven("https://developers.finoracore.com/maven/") // FINORA Pago SDK
}
}
dependencies {
implementation("com.dcgeeks.finora:pago-sdk:1.0.0-beta.3")
}
Sincroniza Gradle. El SDK trae sus <queries> de Android 11 y sus reglas de R8.
Paso 4. Da de alta tu app
-
Saca la huella del certificado con que firmas lo que vas a instalar:
./gradlew :app:signingReport # para la variante debug, la llave de depuración de tu equipo# o, sobre el APK firmado:apksigner verify --print-certs app-release.apk | grep SHA-256 -
Pide al comercio una entrada nueva en la lista, al lado de la de la app de ejemplo, con tu
applicationId, tu huella, las acciones y las sucursales:{"paquete": "com.tuempresa.reparto", "huellas": ["<tu huella>"], "acciones": ["COBRAR", "REVERSAR", "ESTADO"], "sucursales": ["CENTRO"]} -
En FINORA Pago, «Revisar de nuevo».
Paso 5. Escribe el cobro
class PedidoActivity : ComponentActivity() {
// Variante de demostración: no mueve dinero. Quita el argumento para la variante de producción.
private val cobrar = registerForActivityResult(FinoraPago.Cobrar(Contrato.PAQUETE_DEMO)) { r ->
when {
r.aprobada -> marcarPagado(r.referenciaExterna, r.referenciaFinora, r.autorizacion, r.ultimos4, r.marca)
r.estado.requiereConsulta -> marcarEnDuda(r.referenciaExterna, r.referenciaFinora) // nunca cobres otra vez
else -> mostrar("${r.estado}: ${r.mensaje}")
}
}
private val anular = registerForActivityResult(FinoraPago.Reversar(Contrato.PAQUETE_DEMO)) { r ->
if (r.anulada) marcarAnulado(r.referenciaExterna) else mostrar("${r.estado}: ${r.mensaje}")
}
fun alPulsarCobrar() = cobrar.launch(
SolicitudCobro.Builder()
.montoCentavos(12_500).moneda("VES")
.referenciaExterna("PED-1001")
.sucursalCodigo("CENTRO")
.build()
)
fun alPulsarAnular() = anular.launch(
SolicitudReverso.Builder()
.referenciaExterna("PED-1001").montoCentavos(12_500)
.claveIdempotencia("PED-1001-ANU")
.build()
)
}
Antes de mostrar el botón «Cobrar», puedes comprobar el estado (fuera del hilo principal):
val e = FinoraPago.estado(context) // instalado, autorizado, listo, motivo, medios, lectorListo
Paso 6. Comprueba los cinco resultados
| Haces | Debes ver |
|---|---|
FinoraPago.estado(context) | instalado, autorizado y listo en true |
Cobrar PED-1001 | APROBADA con simulado = true, referenciaFinora y sucursalCodigo = CENTRO |
Cobrar otra vez PED-1001 | La misma APROBADA, sin que se lea la tarjeta |
Anular con PED-1001-ANU | ANULADA |
Cobrar otra vez PED-1001 | CONFLICTO con REFERENCIA_USADA: el siguiente intento lleva PED-1001-2 |
Si los cinco coinciden, tu integración funciona. Antes de salir a producción lee Estados y errores (el caso EN_DUDA) y Sucursal y conciliación.
Problemas frecuentes
| Ves | Causa probable | Solución |
|---|---|---|
NO_INSTALADO | Apuntas a la variante equivocada | Con la variante de demostración usa FinoraPago.Cobrar(Contrato.PAQUETE_DEMO) |
autorizado = false o NO_AUTORIZADO | La huella no es la del certificado instalado, tiene espacios, o falta «Revisar de nuevo» | Copia la huella de signingReport o apksigner, sin espacios, y revisa de nuevo |
NO_AUTORIZADO solo en estado() | Tu entrada no tiene la acción ESTADO | Pide ESTADO o usa ["*"] |
PETICION_INVALIDA con SUCURSAL_INVALIDA | La sucursal no existe o no es del comercio; los códigos distinguen mayúsculas | Usa el código exacto de la tienda en FINORA |
NO_LISTO con MERCHANT_SIN_SOPORTE | El servidor del entorno no admite cobros del SDK | Avisa a FINORA |
NO_AUTORIZADO al llamar con un Intent propio | Lo lanzaste con startActivity | Usa startActivityForResult o el contrato del SDK |
Siguiente paso
- Tarjeta FINORA: añade
.medio(Contrato.Medio.TARJETA_FINORA). - Rendimiento: llama a
prepararLectoral abrir el pedido. - ¿El cobro lo decide tu servidor y no la app? Usa el cobro en la nube.