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:
Campo | Descripción |
---|---|
TransactionType | Tipo de transacción = ANNULMENT/REFUND |
payment_id | Identificador del pago original. |
acquirer_id | Nú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ó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 | |
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;
}
}
}