Lectura de tarjetas

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

  1. Instanciar el objeto CardProcessViewModel y pasarle el contexto.
  2. Invocar el método findCardProcess y pasarle como parámetro:
    1. 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
    2. El objeto OperationFlow
    3. El objeto CardData
  3. 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());
  • 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:

ObjetoDescripción
ReaderStatusEste objeto se devuelve en caso de fallo durante el proceso de lectura.
CardBinesDataEste 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ódigoDescripción
TAP_CARD_DETECTEDTarjeta contactless detectada.
INSERTED_CARDTarjeta detectada en el lector chip.
MULT_CARDSe detectaron varias tarjetas contactless en el lector.
USE_ICC_CARDNo se detectó el chip de la tarjeta, se permite deslizar la banda.
NO_EMV_APPSNo se encontró configuración EMV para esta tarjeta, se permite deslizar la banda.
TIMEOUT_ERRORSe excedió el tiempo máximo de lectura.
BAD_SWIPE_ERRORLa banda de la tarjeta está dañada.