Tarjeta Presente
SDK SmartPOS
45min
d ispositivos soportados marca d ispositivo s istema operativo i ngenico d x8000 a ndroid 10 u rovo i 9000 a ndroid 8 1 tap on phone con nfc android > 10 versionado versión fecha observaciones 0 1 0 25/07/2022 creación de la clase cardreader métodos cardreader(context context) setcardreaderlistener(cardreaderlistener listener) getdeviceinfo() read() creación interfaz cardreaderlistener funciones onconnection(map event) onread(map event) onstatus(map event) logs genéricos creación de la documentación 0 2 0 06/08/2022 nuevos métodos en la clase cardreader isdeviceconnected() setmagstripe(boolean boolean) setchip(boolean boolean) setcontactless(boolean boolean) creación de la clase vectorprinter métodos vectorprinter(context context) addqrcode(string qrcode, map parameters) addtext(string text, map parameters) addbitmap(bitmap bitmap) startprint() creación interfaz aligments opciones left center right creación interfaz textsize opciones tiny small normal large huge agregado de más códigos aid agregado de logs formateo general de documentación 0 3 0 18/08/2022 nuevos métodos en la clase cardreader stoptasks() setreadretries(int retries) readv2() (beta) se unifica la clase vectorprinter dentro de cardreader agregando los siguientes métodos initprinter() setprinterimage(bitmap bitmap) setprinterbarcode(string barcode, map parameters) setprinterqr(string qrcode, map parameters) setprintertext(string text, map parameters) setprinterfeed(int feed) startprint() ejecución de evento de tipo connection al finalizar la inicialización de la instancia cardreader formateo del objeto data en la respuesta de la lectura lógica de reintentos automáticos de lectura 0 4 0 26/08/2022 se eliminan métodos en la clase cardreader readv2() creación de evento de tipo printer , con sus valores posibles ejecución de evento de tipo card sugiriendo cambio de método de lectura 0 4 1 01/09/2022 formateo del objeto data en la respuesta de la lectura se agrega explicación de respuesta de lectura 0 5 0 05/10/2022 se eliminan métodos en la clase cardreader read() nuevos métodos en la clase cardreader read(int amount, transaction type trxtype) readandprocess(int amount, transaction type trxtype, int intenttoken, int installments) processtrx(int intenttoken, int installments) getcardreadercontext() setdebugmode(boolean mode) actualización formato y documentación de eventos se agrega la tabla enmus se crear nuevos enums event type read type reader event transaction type alignment text size reader error se agrega apartado para instalar dependencia de librería se actualiza implementación general del sdk 0 6 0 19/10/2022 se eliminan métodos en la clase cardreader setmagstripe(boolean boolean) setchip(boolean boolean) setcontactless(boolean boolean) nuevos métodos en la clase cardreader se agrega la opción otheramount en los método read() y readandprocess() actualización enum reader event connection searching > searching devices connection success > reader connected card reading > reading card read success > read success card read restart > read restart card waiting pin > waiting pin card waiting aid > waiting aid card processing > processing card process success > process success printer connection success > printer connected printer printing > printing nuevos enum dentro de reader event read fail waiting chip to be removed process fail process security code required printer fail nuevo enum dentro de reader error emv chip removed se agregan ejemplos de lectura 0 6 1 20/10/2022 nuevos enum dentro de reader event cdcvm required cdcvm verification ready 0 7 0 27/01/2023 se convierte todo objeto de clase map en parámetro o respuesta, a objeto de clase jsonobject se actualiza el formato del objecto de respuesta exitosa de una lectura se eliminan los campos source sourcedata expirationmonth y source sourcedata expirationyear se elimina la importación explícita de la librería volley se agregan funcionalidades debug mode selección de múltiples aplicaciones método de verificación del tarjeta habiente (cvm) 0 8 0 13/06/2023 nuevos métodos en la clase cardreader init() getdeviceserialnumber() setprintermultiplecolumntext(jsonarray columns, jsonobject parameters) se eliminan métodos en la clase cardreader getcardreadercontext() initprinter() la inicialización del mismo se hace de manera automática nuevo enum dentro de reader event connection failed nuevo enum dentro de reader error unauthorized emv chip required se agrega el valor cvvrequired en la respuesta de la lectura se agrega documentación de los métodos selectapplication(string application) setprinteroppositetext(string lefttext, string righttext, jsonobject parameters) se actualiza nombre del método setcvmverificationmode(boolean mode) > setdebugcvmverificationmode(boolean mode) setprinterfeed(int feed) > setprinterseparator(int height) startprint() > print() se elimina el enum reader event printer connected se ofusca el código archivo arr se agrega el encendido automático de las luces en el proceso de pago se reemplaza objecto jsonobject por objecto mbbxjson requerimientos para la conexión con smartpos a) permisos de acceso en la aplicación android no será necesario agregar permisos en el androidmanifest xml de manera previa lo que sí será necesario, es agregar dentro del tag \<application siguiente atributo android\ requestlegacyexternalstorage="true" cardreaderlistener interfaz principal de comunicación entre la aplicación android y toda respuesta de información o notificación del sdk al interactuar con el sdk, las respuestas son devueltas a través de la emisión de eventos en distintas funciones estas funciones son onconnection , oncard , onstatus y onprinter onconnection la función onconnection , recibe todo evento event type de tipo connection se utiliza para indicar los cambios en el estado de la conexión con el dispositivo smartpos, ya sea que se haya realizado la conexión, se desconectó o se produjo algún error esta función recibe un objeto event de tipo sgwjson que tiene las siguientes propiedades nombre descripción valores posibles tipo type tipo de evento emitido searching devices reader connected connection failed error reader event (enum) message mensaje informativo sobre el evento emitido string error (opcional) objeto informativo sobre el evento de error emitido sgwjson valores posibles de type en el evento connection valor descripción searching devices el lector se encuentra buscando dispositivos bluetooth a enlazar reader connected el dispositivo finalizó su conexión con éxito connection failed se produjo un error en la inicialización, ya sea por no tener un dispositivo actualizado, habilitado o fuera de conexión error se produjo un error al procesar alguna solicitud, como por ejemplo, querer obtener la información del dispositivo mientras el mismo está ocupado o no conectado oncard la función oncard , recibe todo evento event type de tipo card se utiliza para indicar cuando el dispositivo está listo para leer la tarjeta o para cuando ha finalizado de leerla, ya sea que la lectura haya sido exitosa o errónea también indica si el procesamiento de la transacción está a la espera, en curso o finalizada esta función recibe un objeto event de tipo sgwjson que tiene las siguientes propiedades nombre descripción valores posibles tipo type tipo de evento emitido reading card detected read success read restart read fail waiting chip to be removed waiting pin waiting aid cdcvm required cdcvm verification ready processing process success process fail process security code required error reader event (enum) message mensaje informativo sobre el evento emitido string data información adicional necesaria en el evento para el caso de read success , ver "respuesta de lectura" sgwjson error (opcional) objeto informativo sobre el evento de error emitido sgwjson valores posibles de type en el evento card valor descripción reading el dispositivo está listo y a la espera para realizar la lectura de la tarjeta card detected se ha detectado una tarjeta read success la lectura de la tarjeta ha finalizado con éxito read restart reintento automático de lectura, por alguna falla en la misma read fail la lectura de la tarjeta ha finalizado con error waiting chip to be removed la lectura detectó un error en el chip, y debe ser retirado para continuar waiting pin lector a la espera de ingreso de pin waiting aid lector a la espera de selección de aplicación cdcvm required cardholder verification method el lector a la espera de que el cardholder verifique cdcvm verification ready el lector se encuentra nuevamente listo para leer la verificación del cardholder processing la transacción comenzó a procesarse process success el procesamiento de la transacción finalizó con éxito process fail el procesamiento de la transacción finalizó con error process security code required error en el procesamiento de la transacción indica la necesidad de enviar el código de seguridad (cvv) para procesar error se produjo algún error específico o excepción onstatus la función onstatus , recibe todo evento event type de tipo info se utiliza para retornar información del dispositivo esta función recibe un objeto event de tipo sgwjson que tiene las siguientes propiedades nombre descripción valores posibles tipo type tipo de evento emitido device info log report error reader event (enum) message mensaje informativo sobre el evento emitido string data objeto que contiene la información obtenida del dispositivo serialnumber, model, manufacture, imsi, imei, iccid, romversion, androidkernelversion, androidosversion, firmwareversion, hardwareversion, hardwareserialnumber, mode, isovsterm, csn, productname, processorinfo, basebandversion, bootversion, buildnumber, paycomponentversion, secfwversion, pn, terminaltype, extdeviceversion sgwjson error (opcional) objeto informativo sobre el evento de error emitido sgwjson valores posibles de type en el evento info valor descripción device info lectura de información del dispositivo exitosa log report el envío del reporte solicitado, ah sido enviado con éxito error se produjo algún error específico o excepción onprinter la función onprinter , recibe todo evento event type de tipo printer se utiliza para indicar resultados de inicialización del printer y cambios de estado en la ejecución de la impresión esta función recibe un objeto event de tipo mbbxjson que tiene las siguientes propiedades nombre descripción valores posibles tipo type indica el estado actual de la impresión printing printer success printer fail error reader event (enum) message mensaje informativo sobre el evento emitido string error (opcional) objeto informativo sobre el evento de error emitido mbbxjson valores posibles de type en el evento printer valor descripción printing el módulo printer dentro del sdk comenzó a imprimir printer success el módulo printer dentro del sdk finalizó la impresión con éxito printer fail el módulo printer dentro del sdk finalizó la impresión con error error se produjo algún error específico o excepción cardreader clase utilizada para toda lógica de conexión y funcionamiento del sdk en los smartpos métodos la siguiente tabla indica los distintos métodos de la clase metodos descripción tipo cardreader(context context) inicializador de una nueva instancia de la clase cardreader necesario el parámetro context ver onconnection void init() permite re inicializar la instancia cardreader si la instancia se encuentra ya inicializada correctamente, retornará automáticamente el evento de tipo reader connected void setcardreaderlistener(cardreaderlistener listener) permite configurar el listener necesario para obtener toda respuesta asíncrona del sdk necesario el parámetro listener void isdeviceconnected() retorna el estado de conexión actual de la instancia cardreader solo retorna true en caso de estar exitosamente conectado a algún smartpos posible boolean getdeviceinfo() comienza lógica para obtener toda información del smartpos ver onstatus void getdeviceserialnumber() retorna el serialnumber específico del smartpos actualmente conectado string read(int amount, int otheramount, transaction type trxtype) comienza lógica para lectura en el smartpos necesario el parámetro amount valores por defecto otheramount (0), trxtype (sale) ver oncard void readandprocess(int amount, int otheramount, transaction type trxtype, int intenttoken, int installments) comienza lógica para lectura y procesamiento de la transacción en el smartpos necesario los parámetros amount , intenttoken e installments valores por defecto otheramount (0), trxtype (sale) ver oncard void processtrx(int intenttoken, int installments, string securitycode) comienza lógica para el procesamiento de la transacción en el smartpos necesario los parámetros intenttoken e installments valores por defecto securitycode (null) ver oncard void processtrx(int intenttoken, string installmentsreference, string securitycode) comienza lógica para el procesamiento de la transacción en el smartpos necesario los parámetros intenttoken e installmentsreference valores por defecto securitycode (null) ver oncard void stoptasks() métodos como read() inicializan instancias nativas del lector que deben ser cerradas luego de cada lectura este método permite forzar el cierre de una lectura de manera segura, para los casos en donde el cliente tenga alguna falla externa o quiera finalizar una lectura antes de tiempo void release() método que permite desvincular la instancia cardreader existente de manera segura al desvincular, detiene toda funcionalidad que esté realizando y es posible su utilización hasta nueva inicialización void setreadretries(int retries) configura en el sdk la cantidad de reintentos que tiene el método read() necesario el parámetro retries de configurar retries en 0, el sdk no realizará reintentos previo a cada reintento, se ejecuta un evento de tipo card para informar a la aplicación el motivo del fallo de la lectura por defecto, el sdk se configura con un valor de 2 reintentos void setdebugmode(boolean mode) configura al sdk en modo debug genera logs extras para debugear funcionamiento por defecto, el sdk se configura con un valor de false void setdebugmultipleapplicationmode(boolean mode) fuerza en el sdk la ejecución del evento reader event waiting aid para simular su comportamiento esto es posible solo si el modo debug está en true y solo en lecturas chip void setdebugcvmverificationmode(boolean mode) fuerza en el sdk la ejecución del evento reader event cdcvm required y reader event cdcvm verification ready , para simular su comportamiento esto es posible solo si el modo debug está en true y solo en lecturas contactless void selectapplication(string application) confirma la aplicación seleccionada, del listado provisto por el sdk void setprinterimage(bitmap bitmap) agrega una imagen en la impresión del ticket necesario el parámetro bitmap void setprinterbarcode(string barcode, mbbxjson parameters) agrega una imagen configurable de código de barras en la impresión del ticket necesario el parámetro barcode opcional el parámetro parameters (ver parámetros del printer) void setprinterqr(string qrcode, mbbxjson parameters) agrega una imagen de código qr en la impresión del ticket necesario el parámetro qrcode opcional el parámetro parameters (ver parámetros del printer) void setprintertext(string text, mbbxjson parameters) agrega un texto en la impresión del ticket necesario el parámetro text opcional el parámetro parameters (ver parámetros del printer) void setprinteroppositetext(string lefttext, string righttext), mbbxjson parameters) agrega 2 textos en una misma lineas en la impresión del ticket necesario los parámetros lefttext y righttext opcional el parámetro parameters (ver parámetros del printer) void setprintermultiplecolumntext(jsonarray columns, mbbxjson parameters) agrega tantos textos en una misma linea como cantidad de items en columns necesario el parámetro columns opcional el parámetro parameters (ver parámetros del printer) en cada item del array, permite configurar text ( string obligatorio) texto a mostrar size (int opcional) tamaño de la columna a ocupar en el renglón de impresión valor por defecto 1 alignment ( alignment opcional) alineación del texto dentro de su propia columna valor por defecto left la línea no posee un tamaño de columna específico irá tomando un tamaño dinámico según la cantidad de columnas posea el texto de no exceder el ancho de la columna, se mostrará en dos o más renglones void setprinterseparator(int height) agrega un espacio en blanco en la impresión del ticket del tamaño indicado necesario el parámetro height void print() comienza lógica para comenzar la impresión del ticket, según lo configurado anteriormente luego de cada impresión, las distas configuraciones agregadas en el printer se borrarán void enums los siguientes enums existen en el sdk mobbex permiten verificar eventos o configurar distintos parámetros según corresponda enum descripción valores posibles event type tipos de eventos a ejecutarse desde el sdk mobbex a la app connection card info printer read type tipos de lecturas posibles en el smartpos magstripe emv chip emv contactless reader event tipos de eventos posibles a recibir desde el sdk mobbex a la app ver cardreaderlistener searching devices reader connected connection failed reading card detected read success read restart read fail waiting chip to be removed waiting pin waiting aid cdcvm required cdcvm check ready processing process success process fail process security code required device info printing printer success printer fail error transaction type tipos de lecturas y procesamientos soportados en el smarpos sale cashback refund alignment parámetro de alineamiento a configurar dentro del ticket, en texto, código qr, imagen left center right text size parámetro de tamaño de texto a utilizar tiny small normal large huge reader error tipos de errores identificados en los distintos procesos del smartpos unauthorized card reader disconnected emv contactless error emv chip fallback emv chip removed emv chip required low priority method show card again request timeout unknown parámetros del printer las distintas opciones que puede recibir el parámetro opcional paramaters de tipo mbbxjson dentro de los distintos método del printer , son los que se muestran a continuación toda key es de tipo string key constantes permitidas valor por defecto observacion tipo (valor) size valor mayor a 1, recomendando un rango entre (150 300) 150 solo aplicable para el tamaño del código qr int width valor mayor a 1 320 solo aplicable para el tamaño del código de barras int height valor mayor a 1 48 solo aplicable para el tamaño del código de barras int alignment alignment (ver enums ) textos left qr center permite alinear textos y código qr enum isbold true false false solo aplicable para un formato de fuente de texto boolean isitalic true false false solo aplicable para un formato de fuente de texto boolean isunderline true false false solo aplicable para un formato de fuente de texto boolean textsize text size (ver enums ) normal solo aplicable para un formato de fuente de texto enum respuesta de lectura la respuesta exitosa de una lectura, sea masgtripe , chip o contactless retorna dentro del objeto data del evento, el siguiente objeto source { type "", sourcedata { bin "", last4 "", length 16, cvvrequired false } } lo cual explicamos a continuación cada propiedad key descripción tipo type tipo de lectura finalmente detectado en el proceso string bin primeros 6 dígitos de la tarjeta detectada string last4 últimos 4 dígitos de la tarjeta detectada string length token generado para realizar la operacion int cvvrequired indica si es necesario solicitar el código de seguridad al tarjeta habiente boolean valores posibles de type valor descripcion magstripe tipo de lectura detectado banda magnética emv chip tipo de lectura detectado chip emv contactless tipo de lectura detectado contactless para ver un ejemplos de este objeto, ir a ejemplos de respuesta > evento lectura > read success implementaciones importación de la librería sdk mobbex todo sdk de mobbex será un archivo de extensión aar de nombre con formato mobbex card reader sdk v ${version} aar a este archivo será necesario agregarlo dentro de la carpeta /libs y luego agregarlo en las dependencias de la aplicación project structure > dependencies > add > jar/aar dependency verificar que en el archivo “build gradle” de la aplicación, se haya agregado la implementación implementación cardreader se realizará una explicación específica de cómo implementar las distintas clases, funciones y eventos que permitan una correcta inicialización del sdk mobbex importar la clase cardreader y cardreaderlistener import com mobbex cardreader cardreader; import com mobbex cardreader interfaces cardreaderlistener; crear un objeto de clase cardreader , inicializar una nueva instancia y configurar el objeto cardreaderlistener cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //el objeto jsonobject del evento de conexión debería ser //jsonobject { // "type" reader event reader connected, // "message" "cardreader is connected " //} } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); la conexión completa de la nueva instancia, se notificará mediante un evento de tipo connection (dentro de onconnection ), el cual tendrá un type de tipo reader connected luego de recibir este evento, la instancia cardreader estará lista para ejecutar los demás métodos de la clase información del lector para conocer y poder ejecutar el método getdeviceinfo() , será necesario inicializar la instancia de cardreader , esperar su conexión exitosa, ejecutar el método y esperar el evento con la respuesta cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader getdeviceinfo(); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { //el objeto jsonobject del evento de información debería ser //jsonobject { // "type" reader event device info, // "message" "returning device info " // "data" json with device data //} } @override public void onprinter(mbbxjson jsonobject) { } }); la respuesta de la información, se recibe en un evento de tipo info (dentro de onstatus ), el cual tendrá un type de tipo device info lectura y procesamiento de tarjeta el sdk mobbex posee dos métodos o flujos de lectura y procesamiento de tarjeta por un lado, la lectura y el procesamiento se pueden realizar de manera consecutiva, y por otro lado, la lectura y el procesamiento se realizan en métodos y lógicas separados para ambos casos, será necesario inicializar la instancia de cardreader , esperar su conexión exitosa, ejecutar el/los método/s y esperar el evento con la respuesta a continuación, explicamos ambos flujos lectura y procesamiento unificado este flujo permite realizar el procesamiento de una transacción automática y consecutivamente luego de la detección exitosa de una tarjeta para este flujo, es necesario poseer/crear la intención de pago ( intent token ) y cantidad de cuotas ( installment ) de manera previa el método utilizado para realizar este flujo, es readandprocess(int amount, int otheramount, transaction type trxtype, int intenttoken, int installments) cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método startreadprocess(); } @override public void oncard(mbbxjson jsonobject) { //aquí dentro se recibirá todo evento intermedio durante la //detección y lectura de la tarjeta, y el procesamiento de //la transacción } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); private void startreadprocess() { //(opcional) se configura la cantidad de reintentos automáticos setreadretries(1); //solo un reintento setreadretries(4); //4 reintentos setreadretries(0); //sin reintentos (manejo manual) int amount = getamount(); int otheramount = getotheramount(); //opcional transaction type trxtype = gettrxtype(); //opcional string intenttoken = createintenttoken(); int installments = getinstallments(); //comienza el proceso de lectura y procesamiento cardreader readandprocess(amount, otheramount, trxtype, intenttoken, installments); //otra manera de ejecutar el método, sin parámetros opcionales cardreader readandprocess(amount, intenttoken, installments); } en resumen, se debe inicializar instancia cardreader y esperar su conexión exitosa; configurar parámetros de lectura, obtener/crear intent token, monto a procesar, monto de retiro, tipo de transacción y cantidad de cuotas ejecutar método readandprocess toda respuesta de información, error, lectura y/o procesamiento de este último evento, se reciben en eventos de tipo card (dentro de la función oncard ) lectura y procesamiento en paralelo si la necesidad del caso de uso, es primero detectar y leer una tarjeta, luego realizar procesos como detección de bines, selección de cuotas personalizadas u otros procesos específicos, se pueden realizar de la siguiente manera los métodos utilizados para realizar este flujo, son read(int amount, int otheramount, transaction type trxtype) y processtrx(int amount, int intenttoken, int installments) o processtrx(int amount, int intenttoken, string installmentsreference) import com mobbex cardreader enums reader event; cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método startreadprocess(); } @override public void oncard(mbbxjson jsonobject) { reader event type = (reader event) jsonobject get("type"); if (type == reader event reading) { //el procesamiento de lectura ha comenzado y //espera tarjeta a detectar } else if (type == reader event card detected) { //la tarjeta fue detectada! podrás ver el tipo de método detectado //(read type) dentro del objeto del evento } else if (type == reader event read success) { //la lectura y detección finalizó con éxito //podrás ver los datos brindados en los datos del evento //todo aquí se deberá hacer los distintos procesos que el //flujo de la app requiera // detección de bin // selección de cuotas // interacción pertinente con el usuario // creación del intenttoken string intenttoken = createintenttoken(); int installments = getinstallments(); // una vez finalizados los procesos necesarios, comenzar el procesamiento // de ser necesario, se debe brindar el código de seguridad // de la tarjeta string cvv = getsecuritycode(); //cuando sea necesario cardreader processtrx(intenttoken, installments, cvv); } } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); private void startreadprocess() { //(opcional) se configura la cantidad de reintentos automáticos setreadretries(1); //solo un reintento setreadretries(4); //4 reintentos setreadretries(0); //sin reintentos (manejo manual) int amount = getamount(); int otheramount = getotheramount() //opcional //comienza el proceso de detección y lectura de la tarjeta cardreader read(amount, otheramount); //otra manera de ejecutar el método, sin parámetros opcionales cardreader read(amount); } impresión de ticket el sdk de mobbex permite realizar impresiones de tickets customizados, de manera simple y rápida será necesario inicializar la instancia de cardreader , esperar su conexión exitosa, configurar su contenido y ejecutar el método print() cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { //si lainicialización del printer fue exitosa, ejecutar el método //(acá debería haber un manejo/condición de eventos para evitar //reimpresiones involuntarias) createprinterticket(); cardreader print(); } }); private void createprinterticket() { //customizo y agrego texto a la memoria del printer mbbxjson textparams = new mbbxjson(); textparams put("textsize", text size large); textparams put("isbold", true); textparams put("alignment", alignment center); textparams put("isitalic", true); textparams put("isunderline", false); cardreader setprintertext("mobbex", textparams)); //agrego espacio en blanco en el printer cardreader setprinterfeed(10); //customizo y agrego imágen qr a la memoria del printer mbbxjson qrparams = new mbbxjson(); textparams put("alignment", alignemnt center); textparams put("qrsize", 300); cardreader setprinterqr(qrcode, qrparams); cardreader setprinterfeed(10); //agrego imágen de código de barras en la memoria del printer cardreader setprinterbarcode(barcode); } detener tareas del lector es recomendable utilizar la función stoptask() siempre que sea necesario tanto el proceso de lectura de tarjetas, como la obtención de datos del lector y la impresión del ticket, inicializan procesos internos entre el sdk de mobbex y el lector, que deben de finalizarse o cancelarse para su correcto uso y evitar mal funcionamiento modo debug el sdk de mobbex posee un modo de uso que permite imprimir por consola más información que faciliten su implementación y depuración además, esta sección permite simular ciertos escenarios como tarjetas dual o procesos de verificación del tarjeta habiente, para poder desarrollar y soportar los eventos sin la necesidad de contar con las tarjetas especiales activación modo debug este modo por defecto es false y podrá activarse únicamente luego de finalizada la inicialización del cardreader cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader setdebugmode(true); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); activación modo debug múltiple aplicaciones en detección de tarjetas por el método chip , es necesario dar soporte a tarjetas duales esto significa, que el sdk de mobbex identificará si la tarjeta posee múltiples aplicaciones, y solicitará la selección de alguna aplicaciones posibles este escenario, emite eventos de tipo reader event con type waiting aid puedes ver un ejemplo de respuesta de este evento que posee el array con las distintas aplicaciones posibles, en la sección de ejemplos de respuesta > evento lectura el modo debug de múltiples aplicaciones, permite forzar el lanzamiento de este evento, por más que la tarjeta posea una única aplicación habilitada para activarlo, es necesario haber activado el modo debug previamente la forma de activar el sdk de mobbex en modo debug de múltiples aplicaciones, es la siguiente cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader setdebugmode(true); cardreader setdebugmultipleapplicationmode(true); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); activación modo debug de método de verificación tarjeta habiente en detección de tarjetas por el método contactless , es necesario dar soporte a tarjetas en donde el tarjeta habiente requiera realizar una verificación requerida por el emisor esto significa, que el sdk de mobbex identificará si la tarjeta requiere de dicha verificación este escenario, emite eventos de tipo reader event con los types cdcvm required de y cdcvm verification ready el modo debug de método de verificación tarjeta habiente, permite forzar el lanzamiento de estos eventos, por más que la tarjeta no lo requiera para activarlo, es necesario haber activado el modo debug previamente la forma de activar el sdk de mobbex de método de verificación tarjeta habiente, es la siguiente cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader setdebugmode(true); cardreader setdebugcvmverificationmode(true); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); a tener en cuenta en la activación modo debug los modos múltiples aplicaciones y verificación tarjeta habiente, solo funcionan si el modo debug está activado al desactivar el modo debug, se desactivarán también cualquier otro modo debug activado sólo un modo debug especial podrá estar activo al mismo tiempo, es decir, al activar el modo múltiples aplicaciones, se desactivará el modo verificación tarjeta habiente, y viceversa estos modos estarán prohibidos en lectores productivos ejemplos de respuestas a modo de entender el formato y posibilidades, se presentan algunos ejemplos de respuesta en los distintos eventos evento connexión //reader event reader connected jsonobject = { type reader connected, message "card reader is connected " } //reader event reader error jsonobject = { type reader error, message "getdeviceinfo() function not able cardreader is disconnected or not fully connected " } evento lectura //reader event reading jsonobject = { type reading, message "card reader is ready to read card " } //reader event card detected jsonobject = { type card detected, message "card detected ", data { type "emv chip" //read type enum } } //reader event read restart jsonobject = { type read restart, message "restarting read process method use has low priority try using other card reader method ", error { type low priority method, //reader error enum message "try using other card reader method " } } //reader event read success jsonobject = { type read success, message "card reader is ready to read card " data { source { type "emv contactless", sourcedata { bin "123456", last4 "6789", length 16, cvvrequired false } } } } //reader event read fail jsonobject = { type read fail, message "reading card failed moving to fast or bad swipe, try again ", data {}, error { type show card again, //reader error enum message "moving to fast or bad swipe, try again " } } //reader event waiting aid jsonobject = { type waiting aid, message "waiting application to be selected ", data \["visa debito", "visa crédito"] } //reader event processing jsonobject = { type processing, message "start processing transaction ", } //reader event process success jsonobject = { type process success, message "process transaction finished successfully!", data { 	 view "default", 	 options {}, 	 id "cw2dxgptcvza3qqz5tcgg1", 	 status { 	 code "415", 	 text "denegada, método de pago inválido", 	 message "denegada ( cod 5 )", 	 data {}, 	 view "default", 	 }, 	 total 200, 	 currency { 	 value "ars", 	 label "peso argentino", 	 symbol "$", 	 locale "es ar", 	 hidden false, 	 }, 	 data \[ 	 { 	 type "item", 	 key "transactionid", 	 label "transacción nro", 	 value "cw2dxgptcvza3qqz5tcgg1", 	 priority 2, 	 visibility "visible", 	 }, 	 { 	 type "item", 	 key "cardnumber", 	 label "tarjeta", 	 value "466057 7851", 	 priority 99, 	 visibility "hidden", 	 }, 	 { 	 type "item", 	 key "authorizationcode", 	 label "código de autorización", 	 value "", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "batchno", 	 label "lote", 	 value "21", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "ticketno", 	 label "ticket", 	 value "80", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "resultcode", 	 label "resultado del emisor", 	 value "5", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "retrievalreferenceno", 	 label "referencia del emisor", 	 value "", 	 priority 99, 	 visibility "none", 	 }, 	 ], 	 actions \[ 	 { 	 label "imprimir", 	 key "print", 	 type "default", 	 action { 	 type "print", 	 data { 	 url "https //ms mobbex com/prod/reports", 	 path "/v2/coupon/", 	 id "cw2dxgptcvza3qqz5tcgg1", 	 schema "card", 	 }, 	 }, 	 }, 	 { 	 label "firmar", 	 key "sign", 	 type "primary", 	 action { 	 type "signature", 	 data { url "/p/pos/coupon/signature/cw2dxgptcvza3qqz5tcgg1" }, 	 }, 	 }, 	 { 	 label "enviar ticket", 	 key "send coupon", 	 type "primary", 	 action { 	 type "notification", 	 data { url "/p/pos/coupon/notification/cw2dxgptcvza3qqz5tcgg1" }, 	 }, 	 }, 	 { label "reintentar", key "retry", type "primary", action { type "reload" } }, 	 ], 	} } //reader event process fail (1) jsonobject = { type process fail, error { type request, // reader error enum error "execution failed please contact support with the case id id 221985c9 78b2 49b6 929c e39cc0d28b18", code "generic\ efcs" } } //reader event process fail (2) jsonobject = { type process fail, error { type request, // reader error enum error "no se encontraron datos para la entidad solicitada", code "dnefre" } } //reader event process security code required jsonobject = { type process security code required, message "security code in this transaction is required " } evento info //reader event device info jsonobject = { type device info, message "returning device info ", data { paycomponentversion "0", romversion "0 2 0rh", productname "dx8000", processorinfo "qualcomm technologies, inc qcm2150", hardwareserialnumber "s6dx800075 2q95b<214ucd815316000", androidkernelversion "4 9 217", bootversion "1 1 2 2021 04 15 18 10", imsi null, csn "", iccid null, secfwversion "01 04 01 00003", mode "3 mockup state", imei "868735050034844", basebandversion "19080 4000 00 03 01 59,19080 4000 00 03 01 59", hardwareversion "0", firmwareversion "and q4 alpha", extdeviceversion null, isovsterm true, buildnumber "0 2 0rh", terminaltype "dx8000", serialnumber "214ucd815316", model "dx8000", manufacture "landi", androidosversion "10", pn "twt52011869a" } } evento printer //reader event printing jsonobject = { type printing, message "printer start printing " } //reader event printer success jsonobject = { type printer success, message "printer print finished successfully!" } //reader event printer fail jsonobject = { type printer fail, message "printer print failed " }