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
- Datos de la tarjeta, recuperados del objeto
CardBinesData
. - Llave y componentes de cifrado de datos sensibles recuperados en el proceso de inyección de llaves.
Paso a paso
- Instanciar el objeto DoProcessAdquirerOperationData y pasarle los parámetros:
- Objeto
OperationFlow
- Contexto
- Instancia del objeto
EMVImpl
. - Objeto
LocalData
- Versión de la App
- Objeto
- Invocar el método
doOperation
y pasarle como parámetro elOperationType
. - 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ódigo | Descripción |
---|---|
MESSAGE_PAUSED_ERROR | El merchant o customer que se están usando, están temporalmente pausados. |
MESSAGE_PAUSED_DELETED | El merchant o customer que se están usando, han sido eliminados. |
REJECT | Transacción declinada. |
APPROVED | Transacción aprobada. |
MESSAGE_GENERAL_ERROR | Error default no determinado. |
MESSAGE_NOT_ALLOWED | No tiene permisos para realizar la transacción. |
MESSAGE_EXPIRED_SESSION | El 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;
}
}
}