Lectura de tarjetas
ℹ️
Este proceso es obligatorio
En esta fase se procede a la recuperación de datos de la tarjeta mediante la implementación del estándar EMV, haciendo uso del kernel del dispositivo.
Requisitos
- Inyección y configuración de llaves
- Listado de tags EMV
- Monto de la transacción
- Tipo de transacción
- Código de país
- Código de moneda
- Identificador de la adquirencia (Acquirer ID)
Resultado
- Después del proceso de lectura, se obtendrá un objeto con todos los datos de la tarjeta requeridos para procesar operaciones de pago, anulaciones o devoluciones.
Paso a paso
- Instanciar el objeto
CardProcessViewModel
y pasarle el contexto. - Invocar el método
findCardProcess
y pasarle como parámetro:- El monto de la transacción en formato ISO. Es decir, los 2 últimos dígitos representan los decimales, no lleva punto decimal. Ejemplo: $10.00 = 1000
- El objeto
OperationFlow
- El objeto
CardData
- Configurar un observador para recibir el resultado de la lectura.
Instanciar objeto OperationFlow
- Acquirer_name: Indicador del adquirente. Ver Tabla de adquirencias
- Amount: Objeto que contiene información del monto de la transacción en formato ISO. Es decir, los 2 últimos dígitos representan los decimales y no lleva punto decimal. Ejemplo: $10.00 = 1000
- Capture: Objeto que contiene información para la captura de los datos de la tarjeta. Se requieren llenar los valores:
- Input_mode:
- CONTACTLESS: Si requiere habilitar solo el lector contactless.
- EMV: Si requiere habilitar solo el lector contacto.
- STRIPE: Si requiere habilitar solo el lector de banda.
- ALL: Si requiere habilitar todos los lectores simultáneamente.
- Card: Instanciar el objeto. Así:
capture.setCard(new Card());
- Input_mode:
- TransactionType: Tipo de transacción. Este objeto es un enum con los siguientes valores:
enum class OperationType {
PAYMENT,
REFUND,
ANNULMENT,
REVERSE
}
- NewTransactionType: Usar siempre: ACQUIRER del objeto
enum TransactionType.ACQUIRER
- Terminal: Objeto terminal. Requiere el serial code, ejemplo:
El serial code se puede recuperar de 2 formas:
a. Usando el método del SDK:
Terminal terminal = new Terminal(); terminal.setSerialCode(serialCode); DeviceManagerImpl().getSerialNumber()
b. Usando el método de Android:
Terminal terminal = new Terminal(); terminal.setSerialCode(serialCode); android.os.Build.getSerial()
Instanciar objeto CardData
- countryCode: Código ISO de país. Ver Tabla de código de país. Ejemplo:
032
- acquirerId: Código del adquirente. Ver Tabla de adquirencias. Ejemplo:
GPS
- tagList: Lista de
String List<String>
que contiene el listado de tags EMV que se van a recuperar durante la lectura. Este listado depende de cada adquirencia.
Ejemplo:
List<String> tagList = new ArrayList<>();
tagList.add("9F26");
tagList.add("82");
tagList.add("9F36");
tagList.add("9F10");
tagList.add("9F33");
tagList.add("95");
tagList.add("9F37");
tagList.add("9A");
tagList.add("9C");
tagList.add("9F02");
tagList.add("9F03");
tagList.add("9F27");
tagList.add("9F34");
tagList.add("5F2A");
tagList.add("9F1A");
tagList.add("5F25");
tagList.add("84");
tagList.add("9F1E");
tagList.add("9F6E");
Instanciar objeto Amount
- Breakdown: Listado de desglose de montos. Está compuesta por monto y descripción. Listado de valores:
- OPERATION: si la transacción tiene propina, aquí va el valor base. Si la transacción no tiene propina, aquí va el valor total.
- TIP: (aplica cuando la transacción tiene propina, aquí solo va el valor de la propina).
Ejemplo:
Breakdown breakdown = new Breakdown();
breakdown.setAmount("2550");
breakdown.setDescription("OPERATION");
- Currency: Código de moneda. Posibles valores:
- ARS = Pesos Argentinos
- MX = Pesos Mexicanos
- Total: Monto total de la transacción en formato ISO. Ejemplo: $25.50 = 2550
Ejemplo de implementación
//Ejemplo para instanciar el objeto Breakdown
Breakdown breakdown = new Breakdown();
breakdown.setAmount("2550");
breakdown.setDescription("OPERATION");
//Ejemplo para instanciar el objeto Amount
Amount amount = new Amount();
amount.setBreakdown(breakdownList);
amount.setCurrency("ARS");
amount.setTotal("2550");
//Ejemplo para instanciar el objeto Capture
Capture capture = new Capture();
capture.setCard(new Card());
capture.setInput_mode("CONTACTLESS");
//Ejemplo para instanciar el objeto OperationFlow
OperationFlow operationFlow = new OperationFlow();
operationFlow.setAcquirer_name("GPS"); operationFlow.setAmount(amount); operationFlow.setCapture(capture);
CardProcessViewModel cardProcessViewModel = new CardProcessViewModel(getReactApplicationContext().getApplicationContext());
cardProcessViewModel.findCardProcess("2550", "", operationFlow, new CardData("032", "GPS", tagList));
CardObserver myObserver = new CardObserver();
LiveData<Capture> myLiveData = cardProcessViewModel.getNavigate();
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
myLiveData.observeForever(myObserver);
}
}
);
Listado de TAGs EMV por adquirencia
🇦🇷 Global Processing
- 9F26
- 82
- 9F36
- 9F10
- 9F33
- 95
- 9F37
- 9A
- 9C
- 9F02
- 9F03
- 9F27
- 9F34
- 5F2A
- 9F1A
- 5F25
- 84
- 9F1E
- 9F6E
🇲🇽 Banorte
- 4F
- 50
- 57
- 5A
- 82
- 84
- 8A
- 95
- 9A
- 9B
- 9C
- 5F20
- 5F24
- 5F25
- 5F28
- 5F2A
- 5F30
- 5F34
- 9F02
- 9F03
- 9F07
- 9F09
- 9F0D
- 9F0E
- 9F0F
- 9F10
- 9F12
- 9F15
- 9F1A
- 9F1C
- 9F1E
- 9F21
- 9F26
- 9F27
- 9F33
- 9F34
- 9F35
- 9F36
- 9F37
- 9F39
- 9F41
- 9F53
- 9F6E
Códigos de respuesta
El resultado se recibe mediante el observer configurado para la lectura. En la siguiente tabla se muestran los posibles objetos que se pueden recibir como respuesta:
Objeto | Descripción |
---|---|
ReaderStatus | Este objeto se devuelve en caso de fallo durante el proceso de lectura. |
CardBinesData | Este objeto se devuelve cuando el proceso de lectura es exitoso. |
Objeto ReaderStatus
- type: Campo de tipo MessageType, posibles valores:
- ERROR → El proceso de lectura terminó con errores.
- INFO → Se recomienda mostrar el mensaje informativo en la pantalla de la terminal.
- SUCCESS → El proceso de lectura terminó correctamente.
- code: Campo de tipo ReaderCode, posibles valores:
- SUCCESS → Indica que el proceso interno del kernel se ejecutó sin errores.
- FALLBACK → Indica que la lectura fue fallback.
- ERROR → Indica que el proceso interno del kernel se ejecutó con errores.
- description: Campo de tipo String, contiene una descripción del código de error.
Objeto CardBinesData
- last_digits: Campo de tipo String que contiene los últimos 4 dígitos recuperado de la tarjeta.
- track2: Campo de tipo String que contiene el track2 recuperado de la tarjeta.
- cardCountryCode: Campo de tipo String que contiene el código de país recuperado de la tarjeta. No aplica para lectura Banda.
- cardsequencenumber: Campo de tipo String que contiene el número de secuencia recuperado de la tarjeta. No aplica para lectura Banda.
- expirationdate: Campo de tipo String que contiene la fecha de expiración recuperada de la tarjeta.
- iccdata: Campo de tipo de String que contiene los valores de los TAGS EMV recuperados durante el proceso de lectura. No aplica para lectura Banda.
- holderName: Campo de tipo String que contiene
- cardaid: Campo de tipo String que contiene el Application ID recuperado de la tarjeta. No aplica para lectura Banda.
- cardInputMode: Campo de tipo String que contiene el modo por el que se leyó la tarjeta.
Lista de códigos de respuesta
Código | Descripción |
---|---|
TAP_CARD_DETECTED | Tarjeta contactless detectada. |
INSERTED_CARD | Tarjeta detectada en el lector chip. |
MULT_CARD | Se detectaron varias tarjetas contactless en el lector. |
USE_ICC_CARD | No se detectó el chip de la tarjeta, se permite deslizar la banda. |
NO_EMV_APPS | No se encontró configuración EMV para esta tarjeta, se permite deslizar la banda. |
TIMEOUT_ERROR | Se excedió el tiempo máximo de lectura. |
BAD_SWIPE_ERROR | La banda de la tarjeta está dañada. |