Erros
Tratamento de Erros
Entenda os codigos de erro e como trata-los em sua aplicacao.
Formato de Erro
A API Rayo segue o padrao RFC 7807 (Problem Details for HTTP APIs) para retornar erros de forma estruturada e consistente:
error-response.json
json
{ "type": "https://rayopay.com.br/errors/validation-error", "title": "Validation Error", "status": 400, "detail": "Os dados fornecidos são inválidos.", "errors": { "amount": ["O campo amount é obrigatório"], "customer.email": ["O email informado é inválido"] }}Campos do Erro
| Campo | Descricao |
|---|---|
type | URI que identifica o tipo do erro |
title | Titulo curto do erro |
status | Codigo HTTP do erro |
detail | Descricao detalhada do erro |
errors | Objeto com erros de validacao por campo (opcional) |
Codigos HTTP
| Codigo | Nome | Descricao |
|---|---|---|
200 | OK | Requisicao bem sucedida |
201 | Created | Recurso criado com sucesso |
400 | Bad Request | Dados invalidos ou malformados |
401 | Unauthorized | Credenciais invalidas ou ausentes |
403 | Forbidden | Sem permissao para acessar o recurso |
404 | Not Found | Recurso nao encontrado |
409 | Conflict | Conflito com estado atual do recurso |
422 | Unprocessable Entity | Erro de validacao de negocios |
429 | Too Many Requests | Limite de requisicoes excedido |
500 | Internal Server Error | Erro interno do servidor |
503 | Service Unavailable | Servico temporariamente indisponivel |
Erros Comuns
Erro de Autenticacao (401)
401-unauthorized.json
json
{ "type": "https://rayopay.com.br/errors/unauthorized", "title": "Unauthorized", "status": 401, "detail": "Credenciais inválidas ou ausentes."}Erro de Validacao (400)
400-validation.json
json
{ "type": "https://rayopay.com.br/errors/validation-error", "title": "Validation Error", "status": 400, "detail": "Os dados fornecidos são inválidos.", "errors": { "amount": ["O campo amount deve ser maior que zero"], "customer.cpfCnpj": ["CPF/CNPJ inválido"] }}Saldo Insuficiente (422)
422-insufficient-balance.json
json
{ "type": "https://rayopay.com.br/errors/insufficient-balance", "title": "Insufficient Balance", "status": 422, "detail": "Saldo insuficiente para realizar esta operação.", "currentBalance": 5000, "requiredAmount": 10000}Rate Limit (429)
429-rate-limit.json
json
{ "type": "https://rayopay.com.br/errors/rate-limit-exceeded", "title": "Rate Limit Exceeded", "status": 429, "detail": "Você excedeu o limite de requisições. Tente novamente em alguns segundos.", "retryAfter": 60}Tratamento de Erros
Exemplo de como tratar erros de forma adequada em sua aplicacao:
error-handling.js
javascript
async function createTransaction(data) { try { const response = await fetch('https://rayopay.com.br/api/v1/transactions', { method: 'POST', headers: { 'X-Client-Id': process.env.RAYO_CLIENT_ID, 'X-API-Key': process.env.RAYO_API_KEY, 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); const result = await response.json(); if (!response.ok) { // Tratar erros específicos switch (response.status) { case 400: // Erro de validação - mostrar erros ao usuário console.error('Erros de validação:', result.errors); throw new ValidationError(result.detail, result.errors); case 401: // Credenciais inválidas - verificar configuração console.error('Erro de autenticação'); throw new AuthError('Credenciais inválidas'); case 429: // Rate limit - aguardar e tentar novamente const retryAfter = result.retryAfter || 60; console.warn(`Rate limit. Retry after ${retryAfter}s`); await sleep(retryAfter * 1000); return createTransaction(data); // Retry case 500: case 503: // Erro do servidor - tentar novamente com backoff console.error('Erro do servidor'); throw new ServerError(result.detail); default: throw new APIError(result.detail, response.status); } } return result.data; } catch (error) { if (error.name === 'TypeError') { // Erro de rede console.error('Erro de conexão'); throw new NetworkError('Falha na conexão com a API'); } throw error; }} // Classes de erro customizadasclass ValidationError extends Error { constructor(message, errors) { super(message); this.name = 'ValidationError'; this.errors = errors; }} class AuthError extends Error { constructor(message) { super(message); this.name = 'AuthError'; }} class ServerError extends Error { constructor(message) { super(message); this.name = 'ServerError'; }}Retry com Backoff
Para erros 429 (Rate Limit) e 5xx (Server Error), implemente retry com exponential backoff para evitar sobrecarregar a API e melhorar a resiliencia da sua aplicacao.