Realizar un pago

Realizar un pago

ℹ️

Este proceso es obligatorio

Una vez se han recuperado los datos de la tarjeta durante el proceso de lectura, es posible dar inicio al proceso de pago.

Requisitos

Paso a paso

  1. Instanciar el objeto DoProcessAdquirerOperationData y pasarle los parámetros:
    1. Objeto OperationFlow
    2. Contexto
    3. Instancia del objeto EMVImpl.
    4. Objeto LocalData
    5. Versión de la App
  2. Invocar el método doOperation y pasarle como parámetro el OperationType.
  3. Configurar un observer para recibir la respuesta de la transacción.

Instanciar objeto OperationFlow

  • Acquirer_name: Indicador del adquirente. Mismo valores mencionados en la tabla códigos de adquirentes.
  • Amount: Objeto que contiene información del monto de la transacción.
  • Capture: Objeto recuperado de la lectura de tarjeta.
  • Installments: Número de cuotas de la transacción.
  • TransactionType: Tipo de transacción = PAYMENT
  • NewTransactionType: Default: ACQUIRER del objeto enum TransactionType
  • Terminal: Objeto terminal. Requiere el serial code.

Ejemplo:

Terminal terminal = new Terminal();
terminal.setSerialCode(serialCode);

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

Instanciar objeto LocalData

  • batch: Número de batch de transacciones. Número autoincremental, empieza en 1 y se reinicia cada vez que llega a 999.
  • ticket: Número de ticket. Número autoincremental, empieza en 1 y se reinicia cada vez que llega a 9999.
  • trace: Número de transacción. Número autoincremental, empieza en 1 y se reinicia cada vez que llega a 999999.
  • terminalId: Identificador de terminal retornado en el alta de terminales. Formato UUID.
  • acquirerId: Identificador de adquirencia. Ejemplo: GPS
  • merchantId: Identificador de merchant retornado en el alta de terminales. Formato UUID.
  • aesKey: Se recupera del storage local de SDK Full.
  • ivKey: Se recupera del storage local de SDK Full.

Ejemplo para instanciar LocalData

String aesKey = runBlocking(
    new Function1<CoroutineScope, Object>() {
        @Override
        public Object invoke(CoroutineScope coroutineScope) {
            return deviceKeyStorage.getAesKey(); //recuperamos el dato del storage local
        }
    }
);
 
String ivKey = runBlocking(
    new Function1<CoroutineScope, Object>() {
        @Override
        public Object invoke(CoroutineScope coroutineScope) {
            return deviceKeyStorage.getIvKey(); //recuperamos el dato del storage local
        }
    }
);
 
LocalData localData = new LocalData(2, 5, 5, "7c190085-eada-45f4-85a8-b8ab1d7d6300",
    "GPS", "c2192cf8-e221-4ccc-83d4-1c2105d46b9a",
    aesKey,
    ivKey);

Ejemplo de implementación

DoProcessAdquirerOperationData doProcessAdquirerOperationData = new DoProcessAdquirerOperationData(operationFlow,
    getReactApplicationContext().getApplicationContext(), new EMVImpl(), localData, "1.0.0");
 
PaymentObserver paymentObserver = new PaymentObserver();
doProcessAdquirerOperationData.doOperation(OperationType.PAYMENT);
LiveData<OperationResponseModel> myLiveData = doProcessAdquirerOperationData.getOperationResponse();
 
Handler handler = new Handler(Looper.getMainLooper()); 
handler.post(new Runnable() { 
        @Override
        public void run() {
            myLiveData.observeForever(paymentObserver);
        }
    }
);
myLiveData.observeForever(paymentObserver);

Códigos de respuesta

El resultado de la transacción se recibe mediante el objeto OperationResponseModel. En la siguiente tabla se muestran los diferentes códigos de error, estos se recuperan desde operationResponseModel.status.message

CódigoDescripción
MESSAGE_PAUSED_ERROREl merchant o customer que se están usando, están temporalmente pausados.
MESSAGE_PAUSED_DELETEDEl merchant o customer que se están usando, han sido eliminados.
REJECTTransacción declinada.
APPROVEDTransacción aprobada.
MESSAGE_GENERAL_ERRORError default no determinado.
MESSAGE_NOT_ALLOWEDNo tiene permisos para realizar la transacción.
MESSAGE_EXPIRED_SESSIONEl token de sesión ha expirado.

Para el caso de transacción aprobada, es decir, operationResponseModel.status.message = APPROVED, el objeto con los datos de respuesta de la transacción se encuentran en: operationResponseModel.data. Para cualquier otro caso, este campo llegará en null.

Ejemplo de implementación

public class PaymentObserver implements Observer<OperationResponseModel> {
    @Override
    public void onChanged(OperationResponseModel unitStatusResultResource) {
 
        switch (unitStatusResultResource.getStatus().getMessage()) {
            case TransactionUtils.MESSAGE_PAUSED_ERROR:
                break;
            case TransactionUtils.REJECT:
                break;
            case TransactionUtils.APPROVED:
                break;
        }
    }
}