Realizar un pago
Una vez se han recuperado los datos de la tarjeta durante el proceso de lectura, es posible dar inicio al proceso de pago.
Requisitos
- Llave y componentes de cifrado de datos sensibles recuperados en el proceso de inyección de llaves.
Paso a paso
- Instanciar el objeto
DeviceKeyStorage
para recuperar las llaves de cifrado. - Instanciar el objeto
LocalData
. - Instanciar el objeto
Storage
. - Instanciar el objeto
DoProcessAdquirerOperationData
. - Invocar le método
doOperation
y pasarle como parámetro el tipo de operación. - Configurar un observer para recibir el resultado.
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 de la instancia del objeto
DeviceKeyStorage
. - ivKey: Se recupera de la instancia del objeto
DeviceKeyStorage
.
Ejemplo de implementación
private val operationFlow: OperationFlow?
get() = OperationFlowHolder.operationFlow
val deviceKeyStorage = DeviceKeyStorage(context = this)
val localData = LocalData(
batch = 1,
ticket = 1,
trace = 1,
terminalId = terminalId,
acquirerId = Acquirer.GPS.name,
merchantId = merchantId,
aesKey = deviceKeyStorage.getAesKeyExecute(),
ivKey = deviceKeyStorage.getIvKeyExecute(),
banorteKey = "",
customerId = customerId
)
val emvImpl = EMVImpl()
val storage = Storage(context = this)
val doPayment = DoProcessAdquirerOperationData(
context = this,
localData = localData,
version = "",
device = emvImpl,
storage = storage,
transactionDate = DateUtil.getLocalDateTimeWithOffset(),
dataFlow = operationFlow!!
)
doPayment.doOperation(operationType = OperationType.PAYMENT)
doPayment.operationResponse.observe(this) {
it.data?.let { response ->
val operationResponse = response as Adquirer
if (operationResponse.status?.code == OperationResponseCode.APPROVED) {
Log.i(TAG, "Pago aprobado!")
Log.i(TAG, "PaymentId: ${operationResponse.id}")
} else {
Log.i(TAG, "Pago declinado!")
}
} ?: run {
Log.i(TAG, "Pago no procesado!")
}
}
Códigos de respuesta
El resultado de la transacción se recibe mediante el objeto Adquirer
.
En la siguiente tabla se muestran los diferentes códigos de error, estos se recuperan desde Adquirer.status.code
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. |
Realizar una Preautorización
- Instanciar el objeto
DeviceKeyStorage
para recuperar las llaves de cifrado. - Instanciar el objeto
LocalData
. - Instanciar el objeto
Storage
. - Instanciar el objeto
DoProcessAdquirerOperationData
. - Invocar le método
doOperation
y pasarle como parámetro el tipo de operación. - Configurar un observer para recibir el resultado.
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: BANORTE
- merchantId: Identificador de merchant retornado en el alta de terminales. Formato UUID.
- aesKey: Se recupera de la instancia del objeto
DeviceKeyStorage
. - ivKey: Se recupera de la instancia del objeto
DeviceKeyStorage
.
Ejemplo de implementación
private val operationFlow: OperationFlow?
get() = OperationFlowHolder.operationFlow
val deviceKeyStorage = DeviceKeyStorage(context = this)
val localData = LocalData(
batch = 1,
ticket = 1,
trace = 1,
terminalId = terminalId,
acquirerId = Acquirer.GPS.name,
merchantId = merchantId,
aesKey = deviceKeyStorage.getAesKeyExecute(),
ivKey = deviceKeyStorage.getIvKeyExecute(),
banorteKey = deviceKeyStorage.getKeyExecute(),
customerId = customerId
)
val emvImpl = EMVImpl()
val storage = Storage(context = this)
val doPayment = DoProcessAdquirerOperationData(
context = this,
localData = localData,
version = "",
device = emvImpl,
storage = storage,
transactionDate = DateUtil.getLocalDateTimeWithOffset(),
dataFlow = operationFlow!!
)
doPayment.doOperation(operationType = OperationType.PREAUTHORIZATION)
doPayment.operationResponse.observe(this) {
it.data?.let { response ->
val operationResponse = response as Adquirer
if (operationResponse.status?.code == OperationResponseCode.APPROVED) {
Log.i(TAG, "Pago aprobado!")
Log.i(TAG, "PaymentId: ${operationResponse.id}")
} else {
Log.i(TAG, "Pago declinado!")
}
} ?: run {
Log.i(TAG, "Pago no procesado!")
}
}
Códigos de respuesta
El resultado de la transacción se recibe mediante el objeto Adquirer
.
En la siguiente tabla se muestran los diferentes códigos de error, estos se recuperan desde Adquirer.status.code
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. |