Realizar un pago

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

  1. Instanciar el objeto DeviceKeyStorage para recuperar las llaves de cifrado.
  2. Instanciar el objeto LocalData.
  3. Instanciar el objeto Storage.
  4. Instanciar el objeto DoProcessAdquirerOperationData.
  5. Invocar le método doOperation y pasarle como parámetro el tipo de operación.
  6. 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ó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.