ZealDeveloper Hub Beta
EN ES
ECR SDK · v1.0.4 · Android

Guía del Zeal ECR SDK

Lanza transacciones en terminales con Zeal integrado desde tu ECR Android. Eventos de Pusher en tiempo real y diálogos incluidos.

El Zeal ECR SDK ofrece una interfaz directa para integrar tu aplicación Android con el ecosistema e-POS de Zeal. Se encarga de la inicialización del dispositivo, la gestión de terminales y el procesamiento de transacciones mediante un diseño de API estructurado y asíncrono.

Para qué sirve. Cualquier ECR (caja registradora electrónica) integrada con Zeal puede usar el ECR SDK para lanzar transacciones en terminales de pago que tengan Zeal integrado y escuchar el estado de la transacción en tiempo real mediante Pusher.

Instalación

Paso 1 · Crea un token de acceso personal de GitHub

Necesitas un PAT con el permiso read:packages. Genera un token (clásico) desde los ajustes para desarrolladores de GitHub.

Paso 2 · Agrega el repositorio Maven

Agrega el repositorio Maven de GitHub Packages a tu settings.gradle.kts de nivel de proyecto:

dependencyResolutionManagement {
  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  repositories {
      google()
      mavenCentral()

      // Agrega el repositorio de GitHub Packages
      maven {
          name = "GitHubPackages"
          url = uri("https://maven.pkg.github.com/zeal-io/epos-sdk")
          credentials {
              username = "your-github-username"
              password = "your-github-pat-token"
          }
      }
  }
}

Paso 3 · Agrega la dependencia

En tu app/build.gradle.kts de nivel de módulo:

dependencies {
  implementation("com.zeal:epos_sdk:1.0.4")
  // Necesario para el EPOS SDK
  implementation("io.insert-koin:koin-core:4.1.1")
}

Paso 4 · Permisos

El SDK necesita acceso a internet. Agrega lo siguiente a tu AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Inicializa el SDK

suspend fun initialize(zealSdkConfig: SdkConfig): Boolean

Configura las dependencias internas (Koin), almacena la configuración esencial y ejecuta tareas de inicialización asíncronas, como llamadas a la API. Debe llamarse una vez antes de usar otras funciones del SDK.

Parameters

zealSdkConfig SdkConfig
Objeto de configuración que contiene applicationContext, ecrId, terminalsTokensList y appId.

Returns

Boolean
Devuelve true si la inicialización se realiza correctamente; de lo contrario, lanza una excepción.

Throws

Exception
Se lanza si la inicialización falla.
val config = SdkConfig(
  context = applicationContext,
  ecrId = "ECR12345",
  terminalsTokensList = listOf("token1", "token2"),
  appId = "app-id-example"
)

// debe llamarse desde una corrutina u otra función suspend
val initialized = ZealSDK.initialize(config)

Listar terminales

suspend fun listTerminals(): List<TerminalData>

Recupera la lista de terminales configurados asociados a la configuración del SDK ya inicializada.

Returns

List<TerminalData>
Cada elemento contiene terminalId, currencyCode, currencySymbol y tag.

Throws

Exception
Se lanza si falla la obtención de datos.
// debe llamarse desde una corrutina u otra función suspend
val terminals = ZealSDK.listTerminals()
terminals.forEach {
  println("Terminal ID: ${it.terminalId}")
}

Sincronizar catálogo

suspend fun syncCatalog(syncData: SyncData): Boolean

Sincroniza los elementos del catálogo con Zeal.

Parameters

syncData SyncData
Datos que se van a sincronizar; incluye tid y los elementos que se sincronizarán.

Returns

Boolean
Devuelve true si la sincronización se realiza correctamente; de lo contrario, lanza una excepción.

Throws

Exception
Se lanza si la sincronización falla.
// debe llamarse desde una corrutina u otra función suspend
val syncData = SyncData(tid = "2223223", items = listOf(CatalogItem()))
val success = ZealSDK.syncCatalog(syncData)

Iniciar una transacción

suspend fun startTrx(amount: Double, terminalId: String, items: List<OrderItems>): TrxResponse

Inicia una transacción en un terminal concreto. El SDK escucha eventos de Pusher en tiempo real que representan el progreso y la finalización de la transacción.

Parameters

amount Double
Monto de la transacción en la unidad monetaria más pequeña.
terminalId String
El ID del terminal donde se procesará la transacción.
items List<OrderItems>
Lista de los artículos del pedido incluidos en la transacción.

Returns

TrxResponse
Contiene el estado de la transacción, el monto total y las marcas de tiempo.

Throws

TimeoutException
Se lanza si la transacción no se completa en 60 segundos.
Exception
Se lanza ante errores de red o de Pusher.
val orderItems = listOf(
  OrderItems("Coffee", 2, 25.0),
  OrderItems("Cake", 1, 40.0)
)

// consulta «Mostrar los diálogos de transacción» más abajo
ZealSDK.showDialogs(context as ComponentActivity)

try {
  val trxResponse = ZealSDK.startTrx(
      amount = 20.0,
      terminalId = "T12345",
      items = orderItems
  )
  println("Transaction completed: ${trxResponse.state}")
} catch (e: TimeoutException) {
  println("Transaction timed out.")
} catch (e: Exception) {
  println("Transaction failed: ${e.message}")
}

Tiempo de espera máximo de 60 segundos. Si el terminal no devuelve un estado final en 60 segundos, startTrx() lanza TimeoutException. Envuelve siempre la llamada en try/catch y muestra al cajero un estado del que pueda recuperarse.

Mostrar los diálogos de transacción

fun showDialogs(activity: Activity)

Muestra diálogos visuales para los estados de la transacción, como en proceso, correcta y rechazada. Mejora la experiencia de usuario al ofrecer información de la transacción a través de la interfaz. Llámala una vez por Activity, antes de la primera transacción.

Parameters

activity Activity
La referencia a la activity que se usa para mostrar los diálogos.
ZealSDK.showDialogs(this)

Componentes internos

KoinApplication
Gestiona las dependencias y los módulos del SDK.
KtorModule
Proporciona los módulos de red, almacenamiento, repositorio y casos de uso.
Pusher
Gestiona la comunicación en tiempo real y la escucha de eventos para las actualizaciones de transacciones.
DialogsHelper
Gestiona todos los diálogos de cara al usuario para el progreso de la transacción.
OrderListener
Escucha los eventos de Pusher relacionados con transacciones.
TrxData
Representa los datos internos de la solicitud de transacción.

Gestión de errores

El SDK usa un envoltorio Result estructurado para gestionar los estados de éxito y error en todos los casos de uso. Las causas de error habituales son:

  • Tokens de terminal no válidos o caducados.
  • Fallos de comunicación de red.
  • Terminales que no responden.
  • Tiempos de espera agotados o respuestas de transacción ausentes.

Envuelve siempre las llamadas al SDK en bloques try/catch para gestionar los errores de forma fiable.

try {
  val success = ZealSDK.initialize(config)
} catch (e: Exception) {
  Log.e("ZealSDK", "Initialization failed: ${e.message}")
}

Recomendaciones sobre el ciclo de vida

  1. Inicializa una sola vez: al arrancar tu aplicación o en tu activity principal.
  2. Llama a showDialogs() antes de iniciar cualquier transacción para habilitar los diálogos de la interfaz.
  3. Usa corrutinas para todas las funciones suspend (initialize, listTerminals, startTrx).
  4. Gestiona las excepciones correctamente con try/catch.
  5. Ten en cuenta los tiempos de espera: las transacciones fallan automáticamente a los 60 segundos con una TimeoutException.

Ejemplo completo

Flujo de transacción completo dentro de una Activity:

lifecycleScope.launch {
  try {
      // Paso 1: inicializa el SDK
      val initialized = ZealSDK.initialize(config)

      // Paso 2: habilita los diálogos
      ZealSDK.showDialogs(this@MainActivity)

      // Paso 3: obtén los terminales
      val terminals = ZealSDK.listTerminals()
      val terminal = terminals.first()

      // Paso 4: inicia la transacción
      val trxResponse = ZealSDK.startTrx(
          amount = 5000L,
          terminalId = terminal.id,
          items = listOf(OrderItems("Latte", 1, 50.0))
      )

      Log.d("ZealSDK", "Transaction success: ${trxResponse.state}")
  } catch (e: TimeoutException) {
      Log.e("ZealSDK", "Transaction timed out.")
  } catch (e: Exception) {
      Log.e("ZealSDK", "Error: ${e.message}")
  }
}