API
36 min
referencia completa de la clase principal sdconn y los modelos de datos del sdk paquete com mobbex sdconn clase sdconn fachada principal del sdk punto de entrada único para todas las operaciones constructor sdconn(context context, config sdconnconfig = sdconnconfig()) parámetro tipo descripción context context contexto de android (activity o application) config sdconnconfig configuración opcional propiedades connectionstate stateflow\<connectionstate> estado reactivo de la conexión se puede observar con collect o collectlatest sdconn connectionstate collect { state > } isconnected boolean true si hay un dispositivo conectado credentialsconfigured boolean true si las credenciales de mobbex están guardadas credenciales setcredentials(apikey string, accesstoken string) guarda las credenciales de mobbex de forma cifrada persisten entre sesiones clearcredentials() elimina las credenciales almacenadas conexión serial suspend fun connectserial() busca y conecta un dispositivo pos por usb serial escanea todos los drivers usb serial disponibles envía hello a cada puerto y conecta al primero que responda lanza sdconnexception si no encuentra dispositivo actualiza connectionstate a connected(mode="serial", detail=portname) conexión http suspend fun connecthttp(ip string, port int = 5000) conecta directamente a un dispositivo por http (sin emparejamiento) parámetro tipo descripción ip string dirección ip del dispositivo port int puerto http del dispositivo (defecto 5000) lanza sdconnexception si el dispositivo no es alcanzable emparejamiento suspend fun requestpairing(ip string, port int = 5000) boolean solicita emparejamiento con un dispositivo el dispositivo muestra un pin de 6 dígitos en su pantalla retorna true si el dispositivo aceptó la solicitud lanza sdconnexception si el dispositivo no es alcanzable suspend fun confirmpairing(ip string, port int = 5000, pin string) discovereddevice confirma el emparejamiento con el pin mostrado en el dispositivo parámetro tipo descripción ip string ip del dispositivo port int puerto (defecto 5000) pin string pin de 6 dígitos del dispositivo retorna discovereddevice con los datos del dispositivo emparejado efectos guarda el dispositivo y token de confianza para reconexión establece la conexión http pone el dispositivo en modo pinpad lanza sdconnexception si el pin es incorrecto o el dispositivo no responde suspend fun reconnect() discovereddevice reconecta al último dispositivo emparejado usando el token de confianza guardado no requiere pin retorna discovereddevice reconectado lanza sdconnexception si no hay dispositivo guardado, no es alcanzable, o el token fue rechazado fun hassaveddevice() boolean indica si hay un dispositivo guardado disponible para reconexión desconexión fun disconnect() desconecta el dispositivo actual no borra el dispositivo guardado ni el token de confianza fun forgetdevice() desconecta y borra el dispositivo guardado y su token de confianza la próxima conexión requerirá emparejamiento completo lectura de tarjeta / qr suspend fun read(request readrequest) readresult operación completa de lectura de tarjeta o pago por qr flujo tarjeta estándar (sin intenttoken, sin source) obtiene información del dispositivo (cacheada) obtiene ubicación gps del dispositivo crea una operación en la api de mobbex (/p/pos/operation) envía el token al dispositivo para lectura de tarjeta retorna los datos leídos junto con el intenttoken generado flujo tarjeta con token externo (con intenttoken) si se proporciona un intenttoken en el readrequest, se omite la llamada a la api de mobbex y se usa ese token directamente en este caso no se requieren credenciales configuradas y la respuesta incluye la geolocation del dispositivo flujo qr (con source) si se proporciona un source (ej "arg qr"), el sdk crea el intent token (o usa el intenttoken externo si fue proporcionado) llama al endpoint de operación (/p/operations/{token}) con la fuente descarga la imagen qr del resultado y la codifica en base64 envía la imagen al dispositivo pos para que la muestre en pantalla retorna readresult con operationid, source y status (sin sourcedata) el flujo qr siempre requiere credenciales configuradas (para llamar al endpoint de operación) retorna readresult con el resultado de la operación requiere dispositivo conectado credenciales configuradas (solo si no se envía intenttoken, o si se envía source) total > 0 no lanza excepciones — los errores se devuelven en readresult error suspend fun cancelread() cancela una lectura de tarjeta en progreso el dispositivo deja de esperar y la operación read() retorna con error cancelled pantalla del dispositivo mostrar resultado — suspend fun display(request displayrequest) displayresult? muestra una pantalla de resultado con animación en el dispositivo pos es fire and forget retorna null inmediatamente tras enviar el comando sdconn display(displayrequest( status = "success", title = "pago aprobado", subtitle = "visa 1234", total = 15 00, currency = "ars", timeout = 10 )) se puede enviar el status code del procesador directamente (ej 200, 400) y el dispositivo resuelve la animación automáticamente lanza sdconnexception si no hay dispositivo conectado mostrar carga — suspend fun display(request displayrequest) displayresult? muestra una pantalla de carga con spinner es fire and forget retorna null se usa para indicar que se está procesando una operación sdconn display(displayrequest( view = "loading", title = "procesando pago ", subtitle = "no retire la tarjeta", timeout = 30 )) para quitar la pantalla de carga, llamar a dismissdisplay() o mostrar otra vista lanza sdconnexception si no hay dispositivo conectado mostrar selección — suspend fun display(request displayrequest) displayresult? muestra una pantalla con opciones seleccionables es bloqueante espera a que el usuario seleccione una opción o se agote el timeout retorna displayresult val result = sdconn display(displayrequest( view = "choose", title = "seleccione cuotas", subtitle = "visa 1234", values = listof( displayoption("1 pago $15 00", "1"), displayoption("3 cuotas $5 75 c/u", "3"), displayoption("6 cuotas $3 08 c/u", "6") ), timeout = 60 )) if (result != null && result result) { val selected = result selected // displayoption("3 cuotas ", "3") } lanza sdconnexception si no hay dispositivo conectado ocultar pantalla — suspend fun dismissdisplay() oculta la pantalla del dispositivo antes de que expire el timeout el dispositivo vuelve a la pantalla de espera modo del dispositivo suspend fun setmode(mode string) map\<string, any?> cambia el modo de operación del dispositivo modo descripción "normal" modo pos estándar con pantalla de ingreso de monto "slave" modo cola — recibe trabajos de pago desde una cola "transit" lectura continua de tarjetas para peajes/transporte "pinpad" espera comandos de lectura del controlador retorna respuesta del dispositivo como mapa información del dispositivo suspend fun getdeviceinfo() deviceinfo obtiene información del hardware y software del dispositivo se cachea tras la primera consulta; el caché se limpia al cambiar de conexión suspend fun getdevicelocation() devicelocation obtiene la ubicación gps del dispositivo en tiempo real (sin caché) lanza sdconnexception si la ubicación no está disponible modelos de datos sdconnconfig data class sdconnconfig( val serialbaudrate int = 115200, val mobbexapibase string = "https //api mobbex com", val debug boolean = false ) campo tipo defecto descripción serialbaudrate int 115200 velocidad de la conexión serial mobbexapibase string "https //api mobbex com" url base de la api de mobbex debug boolean false activa logs detallados en consola readrequest data class readrequest( val total double, val otheramount double = 0 0, val intent string? = null, val currency string? = null, val hideamount boolean = false, val test boolean = false, val intenttoken string? = null, val timeout int = 120, val source string? = null, val description string? = null, val reference string? = null ) campo tipo requerido descripción total double sí monto total (ej 15 00) otheramount double no monto adicional (propina, etc ) intent string? no tipo de intento (defecto "payment v2") currency string? no código de moneda (defecto "ars") hideamount boolean no ocultar monto en la pantalla del dispositivo test boolean no enviar operación en modo test a mobbex intenttoken string? no token externo si se envía, omite la llamada a la api de mobbex timeout int no timeout de lectura en segundos (defecto 120) source string? no fuente de pago (ej "arg qr") si se envía, activa el flujo qr description string? no descripción de la operación (se envía a la api de mobbex) reference string? no referencia externa de la operación readresult data class readresult( val result boolean, val sourcedata map\<string, any?>? = null, val intenttoken string? = null, val geolocation list\<double>? = null, val operationid string? = null, val source string? = null, val status map\<string, any?>? = null, val error string? = null ) campo tipo descripción result boolean true si la operación fue exitosa sourcedata map? datos de la tarjeta (pin, emvdata, cryptogram, ksn, track2 ) solo en flujo tarjeta intenttoken string? token de intento utilizado (generado por mobbex o el externo proporcionado) geolocation list\<double>? \[latitude, longitude] del dispositivo se incluye con token externo y en flujo qr operationid string? id de la operación solo en flujo qr source string? fuente utilizada (ej "arg qr") solo en flujo qr status map? estado de la operación (ej { "code" "100", "text" "pendiente" }) solo en flujo qr error string? mensaje de error si result es false posibles errores error descripción total is required and must be > 0 falta el monto o es inválido mobbex credentials not configured no se configuraron credenciales credentials required for source operations se envió source pero no hay credenciales configuradas no device connected no hay dispositivo conectado card read failed el dispositivo no pudo leer la tarjeta timeout se agotó el tiempo de lectura (120s) cancelled la lectura fue cancelada not in pinpad mode el dispositivo no está en modo pinpad operate response did not contain a qr barcode la respuesta del endpoint de operación no contiene el qr esperado displayrequest data class displayrequest( val view string = "result", val status any? = null, val title string? = null, val subtitle string? = null, val total double? = null, val currency string? = null, val text string? = null, val values list\<displayoption>? = null, val timeout int? = null ) campo tipo requerido descripción view string no tipo de vista "result" (defecto), "loading", "choose" status any? no estado string ("success", "error", "neutral", "none") o int (código) solo aplica para vista "result" title string? no título en pantalla subtitle string? no subtítulo debajo del título total double? no monto (ej 15 00) currency string? no código de moneda text string? no texto adicional debajo del monto values list\<displayoption>? sí lista de opciones seleccionables requerido para "choose" timeout int? no segundos de espera defecto 10 para result/loading, 60 para choose usar 0 para desactivar displayoption data class displayoption( val label string, val value string ) campo tipo descripción label string texto visible en la pantalla del dispositivo value string valor que se retorna al seleccionar esta opción displayresult data class displayresult( val result boolean, val selected displayoption? = null, val error string? = null ) campo tipo descripción result boolean true si el usuario seleccionó una opción selected displayoption? opción seleccionada (solo si result es true) error string? error (ej "timeout") si result es false solo se retorna displayresult cuando view es "choose" para "result" y "loading", display() retorna null deviceinfo data class deviceinfo( val type string = "", val serialnumber string = "", val deviceextras map\<string, string> = emptymap() ) campo tipo descripción type string tipo de dispositivo (ej "pos") serialnumber string número de serie deviceextras map información adicional (os, modelo, versión, etc ) ejemplo de deviceextras { "os" "android", "osversion" "11", "manufacturer" "nexgo", "model" "n62", "serialnumber" "sn12345", "bundleid" "com sugaway pos", "buildnumber" "42", "appversion" "1 2 3" } devicelocation data class devicelocation( val latitude double, val longitude double, val accuracy double? = null, val provider string? = null, val timestamp long? = null ) campo tipo descripción latitude double latitud longitude double longitud accuracy double? precisión en metros provider string? proveedor de ubicación ("gps", "network") timestamp long? timestamp en milisegundos discovereddevice data class discovereddevice( val ip string, val port int = 5000, val name string = "dispositivo pos" ) representa un dispositivo encontrado o emparejado por red connectionstate sealed class connectionstate { data object disconnected connectionstate() data object searching connectionstate() data class connected(val mode string, val detail string) connectionstate() data class error(val message string) connectionstate() } estado descripción disconnected sin conexión activa searching buscando dispositivo (serial o http) connected conectado mode = "serial" o "http" detail = nombre del puerto o "ip\ port" error error de conexión message con la descripción sdconnexception class sdconnexception(message string, cause throwable? = null) exception(message, cause) excepción general del sdk lanzada por operaciones que fallan (conexión, emparejamiento, etc ) flujo completo sin token externo (flujo estándar) app android sdconn sdk dispositivo pos │ │ │ │ setcredentials(key, token) │ │ │ ────────────────────────────>│ │ │ │ │ │ requestpairing(ip, port) │ │ │ ────────────────────────────>│ (solicita emparejamiento) │ │ │ ───────────────────────────────>│ │ │ (muestra pin)│ │ true │ │ │<────────────────────────────│ │ │ │ │ │ confirmpairing(ip, port, pin)│ │ │ ────────────────────────────>│ (confirma con pin) │ │ │ ───────────────────────────────>│ │ │<─────────── { trusttoken } │ │ │ │ │ │ (cambia a modo pinpad) │ │ │ ───────────────────────────────>│ │ discovereddevice │ │ │<────────────────────────────│ │ │ │ │ │ read(readrequest) │ │ │ ────────────────────────────>│ │ │ │ (obtiene info del dispositivo) │ │ │ ───────────────────────────────>│ │ │<──────────────────────────────│ │ │ │ │ │ (crea operación en mobbex) │ │ │ ──────────> mobbex api │ │ │<────────── { token } │ │ │ │ │ │ (lectura de tarjeta) │ │ │ ───────────────────────────────>│ │ │ (usuario pasa tarjeta) │ │ │<────────── { sourcedata } │ │ │ │ │ readresult(true, │ │ │ sourcedata, intenttoken) │ │ │<────────────────────────────│ │ │ │ │ │ display(displayrequest) │ │ │ ────────────────────────────>│ │ │ │ ───────────────────────────────>│ │ │ (pantalla de resultado) │ con token externo app android sdconn sdk dispositivo pos │ │ │ │ read(readrequest( │ │ │ intenttoken="ext token")) │ │ │ ────────────────────────────>│ │ │ │ (obtiene info del dispositivo) │ │ │ ───────────────────────────────>│ │ │<──────────────────────────────│ │ │ │ │ │ (omite llamada a mobbex api) │ │ │ │ │ │ (lectura de tarjeta) │ │ │ ───────────────────────────────>│ │ │ (usuario pasa tarjeta) │ │ │<────────── { sourcedata } │ │ │ │ │ readresult(true, │ │ │ sourcedata, intenttoken, │ │ │ geolocation=\[lat, lng]) │ │ │<────────────────────────────│ │ flujo qr (con source) app android sdconn sdk dispositivo pos │ │ │ │ read(readrequest( │ │ │ total=15 0, │ │ │ source="arg qr")) │ │ │ ────────────────────────────>│ │ │ │ (obtiene info del dispositivo) │ │ │ ───────────────────────────────>│ │ │<──────────────────────────────│ │ │ │ │ │ (crea operación en mobbex) │ │ │ ──────────> mobbex api │ │ │<────────── { token } │ │ │ │ │ │ (obtiene qr de mobbex) │ │ │ ──────────> mobbex api │ │ │<────────── { barcode } │ │ │ │ │ │ (muestra qr en dispositivo) │ │ │ ───────────────────────────────>│ │ │ (qr visible en pantalla) │ │ │ │ │ readresult(true, │ │ │ intenttoken, operationid, │ │ │ source="arg qr", │ │ │ status={code, text}) │ │ │<────────────────────────────│ │ │ │ │ │ (espera a que el usuario │ │ │ escanee el qr) │ │ │ │ │ │ cancelread() │ │ │ (cuando quiera cancelar) │ │ │ ────────────────────────────>│ ───────────────────────────────>│ │ │ (quita qr) │ flujo con vista choose (cuotas) app android sdconn sdk dispositivo pos │ │ │ │ display(displayrequest( │ │ │ view="choose", │ │ │ title="cuotas", │ │ │ values=\[ ])) │ │ │ ────────────────────────────>│ │ │ │ ───────────────────────────────>│ │ │ (usuario toca una opción) │ │ │<────────────────────────────── │ │ │ │ │ displayresult(true, │ │ │ selected=displayoption( │ │ │ "3 cuotas", "3")) │ │ │<────────────────────────────│ │