Modificaciones de Pago
Las modificaciones permiten operar sobre pagos ya completados (tanto online como POS). Todos los endpoints de modificacion devuelven HTTP 202 Accepted porque la operacion se procesa de forma asincrona por el procesador de pagos.
Sesion vs Pago: recordatorio importante
Las modificaciones no operan sobre la sesion (sessionId), sino sobre el pago (paymentReference). La sesion es el contenedor que se crea al llamar a POST /payment/session; el pago es la transaccion real que se crea cuando el cliente paga con exito. Una vez completada la sesion, esta no cambia mas: lo que importa a partir de ese momento es el pago.
Para mas detalle sobre esta distincion, ver Sesion vs Pago.
Como obtener el paymentReference
Todas las modificaciones requieren un paymentReference que identifica el pago real:
- Para pagos online: consulta la sesion con
GET /payment/session/{sessionId}. Cuando la sesion estacompleted, el campopaymentReferencecontiene la referencia del pago autorizado - Para pagos POS: es el
paymentReferenceque se devuelve directamente en la respuesta dePOST /pos/payment(coincide con elposPaymentId)
Ambos tipos de referencia funcionan indistintamente en todos los endpoints de modificacion.
---
Reembolso (Refund)
Devuelve total o parcialmente el importe de un pago completado.
Live: POST https://aviratopayments.com/external/v1/payment/refund
Test: POST https://aviratopayments.com/external/v1/test/payment/refundParametros del body
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
webcode | string | Si | Identificador de tu negocio |
paymentReference | string | Si | Referencia del pago a reembolsar |
amount.value | integer | Si | Importe a reembolsar en centimos (ej: 5000 = 50.00 EUR) |
amount.currency | string | Si | Codigo ISO 4217, 3 letras mayusculas (ej: EUR) |
reason | string | Si | Motivo del reembolso. Debe ser uno de los valores exactos de la tabla |
Valores permitidos para reason
| Valor | Descripcion |
|---|---|
FRAUD | Transaccion fraudulenta |
CUSTOMER REQUEST | Solicitud del cliente |
RETURN | Devolucion de producto/servicio |
DUPLICATE | Cobro duplicado |
OTHER | Otro motivo |
Importante: Los valores son case-sensitive e incluyen espacio en
CUSTOMER REQUEST. Enviarcustomer requestoCustomer Requestproducira un error 400.
Ejemplo
curl -X POST https://aviratopayments.com/external/v1/payment/refund \
-H "X-API-KEY: tu_api_key_live" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: refund-order-12345" \
-d '{
"webcode": "SHOP01",
"paymentReference": "SHOP01-PXT-17195123456789",
"amount": {
"value": 5000,
"currency": "EUR"
},
"reason": "CUSTOMER REQUEST"
}'Respuesta (202)
{
"success": true,
"data": {
"refundReference": "SHOP01-RFX-17195234567890",
"paymentReference": "SHOP01-PXT-17195123456789",
"amount": {
"value": 5000,
"currency": "EUR"
},
"status": "pending",
"createdAt": "2026-06-29 14:00:00"
}
}El refundReference (formato {webcode}-RFX-{timestamp} en Live, {webcode}-RFXT-{timestamp} en Test) identifica esta operacion de reembolso. Usalo para seguimiento en el listado de modificaciones.
Reembolso parcial vs total
Puedes reembolsar cualquier importe menor o igual al importe original del pago. Si necesitas hacer multiples reembolsos parciales sobre el mismo pago, puedes hacerlo siempre que la suma total no supere el importe original.
---
Captura (Capture)
Captura total o parcialmente una preautorizacion (pago creado con isPreAuth: true).
Live: POST https://aviratopayments.com/external/v1/payment/capture
Test: POST https://aviratopayments.com/external/v1/test/payment/captureParametros del body
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
webcode | string | Si | Identificador de tu negocio |
paymentReference | string | Si | Referencia del pago preautorizado |
amount.value | integer | Si | Importe a capturar en centimos (puede ser menor al preautorizado) |
amount.currency | string | Si | Codigo ISO 4217 |
Ejemplo
curl -X POST https://aviratopayments.com/external/v1/payment/capture \
-H "X-API-KEY: tu_api_key_live" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: capture-preauth-67890" \
-d '{
"webcode": "SHOP01",
"paymentReference": "SHOP01-PXT-17195123456789",
"amount": {
"value": 15000,
"currency": "EUR"
}
}'Respuesta (202)
{
"success": true,
"data": {
"captureReference": "SHOP01-CTX-17195345678901",
"paymentReference": "SHOP01-PXT-17195123456789",
"amount": {
"value": 15000,
"currency": "EUR"
},
"status": "received",
"createdAt": "2026-06-29 15:00:00"
}
}El captureReference (formato {webcode}-CTX-{timestamp} en Live, {webcode}-CTXT-{timestamp} en Test) identifica esta operacion de captura.
Captura parcial
Si preautorizaste 500 EUR pero el importe final del servicio fue 450 EUR, puedes capturar solo 45000 centimos. La diferencia se libera automaticamente.
Captura excedente
Si intentas capturar un importe superior al preautorizado, la peticion se acepta (HTTP 202) pero el procesador rechazara la operacion. Recibiras un webhook con result: "failure" indicando que el importe excede el autorizado.
---
Cancelacion (Cancel)
Cancela una preautorizacion antes de que se capture. Libera los fondos retenidos en la tarjeta del cliente.
Live: POST https://aviratopayments.com/external/v1/payment/cancel
Test: POST https://aviratopayments.com/external/v1/test/payment/cancelParametros del body
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
webcode | string | Si | Identificador de tu negocio |
paymentReference | string | Si | Referencia del pago preautorizado a cancelar |
Ejemplo
curl -X POST https://aviratopayments.com/external/v1/payment/cancel \
-H "X-API-KEY: tu_api_key_live" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: cancel-preauth-11111" \
-d '{
"webcode": "SHOP01",
"paymentReference": "SHOP01-PXT-17195123456789"
}'Respuesta (202)
{
"success": true,
"data": {
"cancelReference": "SHOP01-CAX-17195456789012",
"paymentReference": "SHOP01-PXT-17195123456789",
"status": "received",
"createdAt": "2026-06-29 16:00:00"
}
}El cancelReference (formato {webcode}-CAX-{timestamp} en Live, {webcode}-CAXT-{timestamp} en Test) identifica esta operacion de cancelacion.
---
Extension (Extend)
Extiende el plazo de una preautorizacion antes de que expire. Las preautorizaciones tienen una validez limitada (normalmente 7-28 dias segun el banco emisor). Si necesitas mas tiempo, puedes extenderla. La extension amplia el plazo 28 dias adicionales contando desde el momento en que se solicita.
Live: POST https://aviratopayments.com/external/v1/payment/extend
Test: POST https://aviratopayments.com/external/v1/test/payment/extendParametros del body
| Campo | Tipo | Requerido | Descripcion |
|---|---|---|---|
webcode | string | Si | Identificador de tu negocio |
paymentReference | string | Si | Referencia del pago preautorizado a extender |
No se necesita enviar importe ni divisa: la extension mantiene el importe original.
Ejemplo
curl -X POST https://aviratopayments.com/external/v1/payment/extend \
-H "X-API-KEY: tu_api_key_live" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: extend-preauth-22222" \
-d '{
"webcode": "SHOP01",
"paymentReference": "SHOP01-PXT-17195123456789"
}'Respuesta (202)
{
"success": true,
"data": {
"updateReference": "SHOP01-UPX-17195567890123",
"paymentReference": "SHOP01-PXT-17195123456789",
"amount": {
"value": 15000,
"currency": "EUR"
},
"status": "received",
"createdAt": "2026-06-29 17:00:00"
}
}El updateReference (formato {webcode}-UPX-{timestamp} en Live, {webcode}-UPXT-{timestamp} en Test) identifica esta operacion de extension. El amount devuelto es el importe original del pago.
---
Estado de las modificaciones
Las modificaciones se procesan de forma asincrona. El estado devuelto en la respuesta inicial depende de la operacion y evoluciona conforme el procesador confirma:
| Estado | Descripcion |
|---|---|
pending | Estado inicial de refund. Operacion enviada al procesador, pendiente de confirmacion |
received | Estado inicial de capture, cancel y extend. El procesador ha recibido la peticion |
success | Operacion completada con exito por el procesador |
failed | Operacion rechazada por el procesador |
Nota sobre los estados iniciales: Las operaciones de refund devuelven
pendingporque el reembolso puede tardar en procesarse. Capture, cancel y extend devuelvenreceivedporque la confirmacion del procesador es mas rapida. En ambos casos, el estado final serasuccessofailed.
Como saber cuando se completa una modificacion:
- Webhooks (recomendado): Recibiras un webhook automatico cuando el procesador confirme la operacion. Ver Webhooks para detalles del formato y ejemplos
- Consulta: Puedes consultar el estado actualizado con Listar modificaciones
---
Modificaciones en entorno Test
En el entorno Test, las modificaciones se procesan de forma simulada e inmediata. No se contacta con ningun procesador real. El backend genera un webhook simulado con el resultado (success o failed) que se envia a tu URL de webhook en segundos.
Comportamiento simulado por tipo
| Operacion | Comportamiento en Test |
|---|---|
| Refund | Exito inmediato. El backend verifica que el importe no exceda el saldo disponible |
| Capture | Exito si el importe es menor o igual al autorizado. Fallo (webhook con result: "failure") si excede |
| Cancel | Exito inmediato |
| Extend | Exito inmediato |
Importante: En Test, el webhook de confirmacion se genera automaticamente en el momento de la peticion. En Live, el webhook llega cuando el procesador real confirma la operacion (segundos a minutos).
---
Referencia rapida de marcadores
Cada tipo de modificacion genera una referencia con un prefijo identificativo:
| Operacion | Prefijo Live | Prefijo Test | Ejemplo (Live) |
|---|---|---|---|
| Reembolso | -RFX- | -RFXT- | SHOP01-RFX-17195234567890 |
| Captura | -CTX- | -CTXT- | SHOP01-CTX-17195345678901 |
| Cancelacion | -CAX- | -CAXT- | SHOP01-CAX-17195456789012 |
| Extension | -UPX- | -UPXT- | SHOP01-UPX-17195567890123 |
Errores comunes en modificaciones
| Codigo | HTTP | Causa | Accion |
|---|---|---|---|
| 12001 | 400 | Parametros invalidos (falta paymentReference, amount incorrecto, reason no valido) | Revisa los campos requeridos y sus formatos |
| 11008 | 403 | El pago no fue creado via la External API, o el webcode no coincide | Verifica que usas el paymentReference correcto y que pertenece a tu webcode |
| 10404 | 404 | Pago no encontrado con esa referencia | Verifica el paymentReference |