SDK SmartPOS
Marca | Dispositivo | Sistema Operativo |
Ingenico | DX8000 | Android 10 |
Urovo | i9000 | Android 8.1 |
Tap on Phone | Con NFC | Android > 10 |
Versión | Fecha | Observaciones |
0.1.0 | 25/07/2022 |
|
0.2.0 | 06/08/2022 |
|
0.3.0 | 18/08/2022 |
|
0.4.0 | 26/08/2022 |
|
0.4.1 | 01/09/2022 |
|
0.5.0 | 05/10/2022 |
|
0.6.0 | 19/10/2022 |
|
0.6.1 | 20/10/2022 |
|
0.7.0 | 27/01/2023 |
|
0.8.0 | 13/06/2023 |
|
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"
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.
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 |
| READER_EVENT(enum) |
message | Mensaje informativo sobre el evento emitido. | | String |
error (opcional) | Objeto informativo sobre el evento de error emitido. | | SGWJson |
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. |
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 |
| 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 |
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. |
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 |
| 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 |
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. |
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. |
| READER_EVENT (enum) |
message | Mensaje informativo sobre el evento emitido. | | String |
error (opcional) | Objeto informativo sobre el evento de error emitido. | | MBBXJson |
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. |
Clase utilizada para toda lógica de conexión y funcionamiento del SDK en los SmartPOS.
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:
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 |
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. |
|
READ_TYPE | Tipos de lecturas posibles en el SmartPOS. |
|
READER_EVENT | Tipos de eventos posibles a recibir desde el SDK Mobbex a la App. Ver CardReaderListener. |
|
TRANSACTION_TYPE | Tipos de lecturas y procesamientos soportados en el SmarPOS. |
|
ALIGNMENT | Parámetro de alineamiento a configurar dentro del ticket, en: Texto, código QR, Imagen. |
|
TEXT_SIZE | Parámetro de tamaño de Texto a utilizar. |
|
READER_ERROR | Tipos de errores identificados en los distintos procesos del SmartPOS. |
|
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 |
| false | Solo aplicable para un formato de fuente de Texto. | boolean |
isItalic |
| false | Solo aplicable para un formato de fuente de Texto. | boolean |
isUnderline |
| 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 |
La respuesta exitosa de una lectura, sea Masgtripe, Chip o Contactless retorna dentro del objeto data del evento, el siguiente objeto:
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 |
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
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.
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:
- Crear un objeto de clase CardReader, inicializar una nueva instancia y configurar el objeto CardReaderListener:
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.
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:
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.
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:
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):
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).
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)
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():
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.
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.
Este modo por defecto es false y podrá activarse únicamente luego de finalizada la inicialización del CardReader.
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:
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_REQUIREDde 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:
- 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.
A modo de entender el formato y posibilidades, se presentan algunos ejemplos de respuesta en los distintos eventos: