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
DeviceKeyStoragepara recuperar las llaves de cifrado. - Instanciar el objeto
LocalData. - Instanciar el objeto
Storage. - Instanciar el objeto
DoProcessAdquirerOperationData. - Invocar le método
doOperationy 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
DeviceKeyStoragepara recuperar las llaves de cifrado. - Instanciar el objeto
LocalData. - Instanciar el objeto
Storage. - Instanciar el objeto
DoProcessAdquirerOperationData. - Invocar le método
doOperationy 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. |