Gestión de errores
Las respuestas fallidas de la API lanzan RequiplyError:
import { RequiplyError } from '@requiply/api-sdk';
try {
await requiply.sales.create({ lines: [{ saleItemId, quantity: 1 }], paymentMethod: 'liqpay' });
} catch (error) {
if (error instanceof RequiplyError && error.reason === 'client_email_required') {
console.error('LiqPay needs a client with an email');
} else {
throw error;
}
}
Propiedades del error
| Propiedad | Qué contiene |
|---|---|
status | El estado HTTP de la respuesta, por ejemplo 400, 403, 404, 409 o 429. |
message | El mensaje legible de la API, con el estado HTTP como alternativa. Muéstraselo a las personas, pero no tomes decisiones según su texto. |
reason | El motivo legible por máquina, cuando la API lo da, por ejemplo feature_disabled. Toma las decisiones según este valor. |
data | Los campos adicionales que la API envió con el error, incluido reason. |
details | El cuerpo de la respuesta ya interpretado, o el texto sin procesar de la respuesta cuando no es JSON. |
retryAfter | Los segundos que hay que esperar, según la cabecera Retry-After de un 429. |
Motivos de error
reason lo devuelven las solicitudes de reserva hechas con claves publicables, los endpoints de Ventas y las líneas de venta de los presupuestos y las reservas:
reason | Estado | Significado |
|---|---|---|
request_only | 403 | Una clave publicable ha llamado a bookings.create() sin asRequest: true. |
feature_disabled | 403 | Enable sales (activar ventas) está desactivado, o la organización no tiene el plan Advanced. |
selling_disabled | 403 | Una clave publicable ha pedido productos en venta cuando la organización no vende a los clientes. |
out_of_stock | 409 | Una clave publicable ha pedido más unidades de las que hay en el almacén. data.saleItemId indica el producto y data.availableQuantity, cuántas quedan. |
invalid_lines | 400 | Una línea no tiene producto o tiene una cantidad que no es un número entero mayor que cero. |
duplicate_line | 400 | El mismo producto aparece en dos líneas. |
sale_item_not_found | 404 | Un producto no existe en esta organización. |
sale_item_archived | 409 | Un producto está archivado y no se puede vender. |
invalid_payment | 400 | paymentMethod no es un método conocido. |
payment_method_unavailable | 400 | La organización no tiene ninguna integración activa para ese método de pago. |
client_email_required | 400 | LiqPay envía la factura por email, así que la venta necesita un cliente con email. |
sale_not_found | 404 | La venta no existe. |
Pueden aparecer motivos nuevos, así que mantén siempre una rama alternativa. La mayoría de los demás errores, como un campo que falta o una reserva desconocida, solo llevan status y message.
Límites de peticiones
Cada clave puede hacer 100 peticiones por minuto. Las peticiones que superan ese límite lanzan un RequiplyError con status 429 y retryAfter en segundos. En los navegadores falta retryAfter, porque la API no expone la cabecera entre orígenes distintos; espera unos segundos antes de reintentar.
Las reservas rechazadas no son errores
bookings.create() no lanza una excepción cuando la organización no puede aceptar una reserva, por ejemplo porque los artículos están ocupados en esas fechas o la recogida queda fuera del horario. Se resuelve con success: false, un message y, a veces, un reason. Consulta Reservas.
Errores que no son RequiplyError
La validación del constructor y las API del entorno que faltan lanzan TypeError: un apiKey que falta o está vacío, que no haya fetch disponible, o una clave secreta usada en el navegador. Los fallos de red y las peticiones canceladas se rechazan con el error que lance tu implementación de fetch.
Uso en el navegador y en el servidor
Qué métodos del SDK puede llamar una tienda online desde el navegador con una clave publicable, cuáles van en un servidor con una clave secreta y cómo conectar ambos en Next.js o Nuxt.
Opciones de petición
Cancela peticiones y añade cabeceras de metadatos a las llamadas del SDK.