Skip to content

Manejo de errores ​

La API de Genius Checkout usa códigos de estado HTTP estándar. Los cuerpos de error son siempre JSON con un único campo error.

Códigos de estado ​

Código HTTPSignificado
200Éxito
201Creado (reembolso, suscripción, etc.)
401Clave API inválida o ausente
403Operación cross-mode — una clave gc_test_ intentó tocar datos live, o viceversa
404Recurso no encontrado
409Conflicto de idempotencia — ver abajo
422Error de validación o pago rechazado
429Límite de tasa excedido — ver Límites de tasa
500Error del servidor — reintenta con backoff, contacta soporte si persiste

Cuerpo del error ​

El envoltorio estándar es un único string error:

json
{ "error": "Mensaje de error legible" }

Para fallos de pago, el mensaje incluye el motivo de rechazo del gateway cuando está disponible.

Errores de validación (422) ​

Para validación a nivel de controller (p. ej. amount ausente, moneda no soportada, token no encontrado, token de suscripción inactivo), el cuerpo es el envelope estándar { "error": ... }.

Para la validación field-level por defecto de Laravel (la ruta estándar validate()), el cuerpo es la forma estructurada del framework:

json
{
  "message": "The given data was invalid.",
  "errors": {
    "amount": ["The amount field is required."],
    "currency": ["The currency must be 3 characters."]
  }
}

Siempre revisa ambas formas. Si errors está presente, expone los mensajes por campo en tu UI; si no, usa error.

Causas comunes de 422:

  • amount no es entero o falta
  • currency no está en la lista soportada (ver Monedas)
  • success_url / failure_url no son URLs absolutas
  • tax_amount no concilia con subtotal y amount
  • El token no está active
  • Un pago rechazado (ver abajo)

Pagos rechazados (422) ​

Un pago rechazado devuelve 422 con un mensaje seguro para mostrar al cliente. La respuesta completa del gateway (código ISO, AVS, CVV) se registra en el panel del comerciante para inspección — nunca se devuelve a la llamada API. Ver Códigos de rechazo para el mapeo al mensaje del comprador.

Conflictos de idempotencia (409) ​

Cuando reenvías una solicitud con el mismo Idempotency-Key pero un cuerpo distinto, la plataforma se niega a sobrescribir la original — ese es el sentido de la idempotencia. Dos sabores de 409:

json
{ "error": "Idempotency key already used with different request parameters." }
json
{ "error": "Request is still being processed. Please retry later." }

El primero significa: la clave ya se usó para otro cuerpo — usa una nueva clave o envía el cuerpo original. El segundo: la solicitud original sigue en vuelo (ventana de lock de 30 segundos) — espera brevemente y reintenta. Tras completarse, los reintentos con el mismo cuerpo devuelven la respuesta cacheada.

Cross-mode (403) ​

Las claves gc_test_ y gc_live_ están estrictamente aisladas en el servidor. Una clave test no puede leer, cobrar, reembolsar, suscribir ni revocar un token / transacción / cliente live (y viceversa). Solicitudes mixtas devuelven:

json
{ "error": "Cross-mode operation not permitted." }

Elegir la clave equivocada para el entorno es la causa habitual — revisa tu encabezado Authorization.

Límites de tasa (429) ​

Los límites por defecto son generosos y por clave. Ver Límites de tasa para la tabla completa, encabezados de respuesta y guía de backoff.

Reintentos ​

  • 5xx y 429 son seguros de reintentar. Usa backoff exponencial — 1s, 2s, 4s, 8s, etc.
  • 4xx (excepto 429) no es seguro reintentar tal cual. Corrige la solicitud primero.
  • Para solicitudes mutadoras (crear sesión, cobrar token, reembolsar), incluye un encabezado Idempotency-Key. Los reintentos devuelven la respuesta original — sin doble cobro. Mira Autenticación → Idempotencia.

Released under the proprietary Genius Checkout license.