Devoluciones, anulaciones y reembolsos

Aprende cómo anular un pago o solicitar un reembolso para tus clientes

Con Kushki puedes procesar devoluciones de pagos con tarjeta débito y crédito en estado aprobado. Una vez aprobada una devolución, los fondos se retornarán a la tarjeta de tu cliente.

Las devoluciones pueden ser de dos clases, según el día y la hora en que se procese la transacción original y la solicitud de anulación:

1. Anulación en línea o automática (Void)

Se da cuando la solicitud de devolución se procesa durante el mismo día de la transacción, antes de las 20:59. Realizaremos hasta tres intentos de devolución con el procesador y si es exitosa, la compra se eliminará del extracto de movimientos de tu cliente y se devolverá el monto de la compra a su cuenta.

Anulación en línea ES

2. Reembolso manual (Refund)

Cuando no sea posible realizar una anulación en línea, será necesario realizar un reembolso manual. El reembolso manual se puede dar en los siguientes escenarios:

  • Cuando la solicitud de devolución se procesa luego de las 20:59 del día de aprobación de la transacción.
  • Cuando fallan los tres intentos de anulación en línea.
  • Cuando la solicitud de anulación se realiza en un día diferente al de la transacción original.

Este tipo de reembolsos pueden tardar hasta 7 días hábiles en procesarse y hasta 45 días hábiles en reflejarse en el extracto de tu cliente, dependiendo del banco emisor de la tarjeta. A continuación una ilustración del proceso de reembolso manual:

Reembolso manual ES

¿Cómo procesar una devolución?

Puedes procesar devoluciones desde tu Consola según lo explicado aquí o integrar en tu aplicación nuestro método de API de solicitud de cancelación para que tus compradores puedan solicitar desde tu sitio la devolución de una compra.

Para solicitar la anulación de un pago es necesario utilizar el ticketNumber de la transacción original como path parameter y enviar tu credencial privada, tal y como se muestra en el siguiente ejemplo:

  • Javascript
  • Python
  • PHP
var request = require("request");
var options = {
method: 'DELETE',
headers: {
'Private-Merchant-Id': 'your-private-merchat-id', // Reemplaza con tu Private merchant id
'Content-Type': 'application/json' },
url: 'https://api-uat.kushkipagos.com/v1/charges/ticket number ', // Ambiente de prueba
body: {
fullResponse: true
},
json:true
};
request(options, function(error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
url = "https://api-uat.kushkipagos.com/v1/charges/ticket number"
payload = '{"fullResponse":true}'
headers = {
"Private-Merchant-Id": "your-private-merchat-id",
"Content-Type": "application/json",
}
response = requests.request("DELETE", url, headers=headers, data=payload)
print(response.text)
$client = new http\Client;
$request = new http\Client\Request;
$body = new http\Message\Body;
$body->append('{\"fullResponse\":true}');
$request->setRequestUrl('https://api-uat.kushkipagos.com/v1/charges/6383937262783');
$request->setRequestMethod('DELETE');
$request->setBody($body);
$request->setHeaders(array(
'Private-Merchant-Id: 'your-private-merchat-id',// Reemplaza esto por tu Private Key
'Content-Type: application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody()

¿Cómo procesar una devolución parcial?

Puedes permitirle a tus clientes solicitar devoluciones parciales usando el mismo endpoint de anulación de transacciones, por lo tanto es posible que un solo cargo tenga varias solicitudes de devolución asociadas, siempre y cuando la suma de estas no sobrepase el monto total de la transacción original.

Las devoluciones parciales pueden solicitarse manualmente, a través de la Consola o vía API, según lo explicado a continuación.

Devoluciones parciales vía API

Para solicitar una devolución parcial, puedes usar el endpoint de solicitud de anulaciones. Debes enviar el ticketNumber como path parameter, tu credencial privada y el desglose de monto e impuestos en el objeto amount. Asegúrate que el cálculo de los impuestos y montos sea el correcto.

  • Javascript
  • Python
  • PHP
var request = require("request");
var options = {
method: 'DELETE',
headers: {
'Private-Merchant-Id': 'your-private-merchat-id', // Reemplaza con tu Private merchant id
'Content-Type': 'application/json'
},
url: 'https://api-uat.kushkipagos.com/v1/charges/ticket number ', // Ambiente de prueba
body: {
fullResponse: true,
amount: {
subtotalIva: 100,
subtotalIva0: 0,
ice: 0,
iva: 0,
currency: 'PEN'
}
},
json: true
};
request(options, function(error, response, body) {
if (error) throw new Error(error);
console.log(body);
});
import requests
url = "https://api-uat.kushkipagos.com/v1/charges/ticket number"
payload = '{\"fullResponse\":true,\"amount\":{\"subtotalIva\":100,\"subtotalIva0\":0,\"ice\":0,\"iva\":0,\"currency\":\"PEN\"}}'
headers = {
"Private-Merchant-Id": "your-private-merchat-id",
"Content-Type": "application/json",
}
response = requests.request("DELETE", url, headers=headers, data=payload)
print(response.text)
$client = new http\Client;
$request = new http\Client\Request;
$body = new http\Message\Body;
$body->append('{"fullResponse":true,"amount":{"subtotalIva":100,"subtotalIva0":0,"ice":0,"iva":0,"currency":"PEN"}}');
$request->setRequestUrl('https://api-uat.kushkipagos.com/v1/charges/6383937262783');
$request->setRequestMethod('DELETE');
$request->setBody($body);
$request->setHeaders(array(
'Private-Merchant-Id: 'your-private-merchat-id',// Reemplaza esto por tu Private Key
'Content-Type: application/json'
));
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody()

¿Cómo conocer el estado de una devolución?

Puedes conocer el estado de una anulación desde tu Consola según lo explicado aquí o configurar un Webhook de devoluciones, en el cual Kushki te notificará cuando se complete exitosamente una solicitud de devolución, ya sea anulación (void) o reembolso (refund).


Recomendado

Consulta el estado de tus devoluciones