Realizar una anulación o devolución

Realizar una anulación o devolución

ℹ️

Este proceso es obligatorio

Antes de llevar a cabo una anulación o devolución, es necesario realizar una consulta de transacciones, ya que se necesitan datos específicos obtenidos durante esta consulta para llevar a cabo dichas operaciones.

Requisitos

  • Identificador de la transacción original: payment_id
  • Identificador de la adquirencia: acquirer_id

Paso a paso

Son los mismos pasos que se aplican para realizar un pago, la diferencia está en la instancia del objeto OperationFlow(), en este caso se agregan los siguientes campos:

CampoDescripción
TransactionTypeTipo de transacción = ANNULMENT/REFUND
payment_idIdentificador del pago original.
acquirer_idNúmero de referencia del pago original. Retornado en el campo de respuesta retrieval_reference_number
ℹ️

En México 🇲🇽 solo aplica el concepto de REFUND. En Argentina 🇦🇷, una anulación se realiza el mismo día del pago y la devolución, en días posteriores.

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.
APPROVED
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;
        }
    }
}