Integración API: Mejores Prácticas
Volver al blog
Técnico

Integración API: Mejores Prácticas

Equipo Técnico QuickDTE5 de diciembre de 20243 min read

Idempotencia, manejo de errores, webhooks y patrones recomendados para integrar QuickDTE en tu sistema.

Integración API: Mejores Prácticas

Integrar QuickDTE en tu sistema es sencillo, pero seguir las mejores prácticas garantiza una implementación robusta y escalable.

1. Idempotencia

¿Qué es?

La idempotencia garantiza que ejecutar la misma operación múltiples veces produce el mismo resultado. Esto es crítico para evitar DTEs duplicados.

Cómo Implementarla

Incluye un header X-Idempotency-Key en cada request:

const response = await fetch('https://api.quickdte.com/v1/dte/process', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
    'X-Idempotency-Key': `order-${orderId}-${timestamp}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(dtePayload)
});

Tips:

  • Usa IDs únicos de tu sistema (orderId, transactionId)
  • Incluye timestamp para diferenciar reintentos legítimos
  • Guarda la key usada para debugging

2. Manejo de Errores

Tipos de Error

| Código | Tipo | Acción | |--------|------|--------| | 400 | Validación | Corregir payload | | 401 | Autenticación | Renovar token | | 409 | Duplicado | Usar idempotency key | | 429 | Rate limit | Esperar, retry con backoff | | 500+ | Servidor | Retry con backoff |

Retry con Backoff Exponencial

async function processWithRetry(payload: DtePayload, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      const response = await processDTE(payload);
      return response;
    } catch (error) {
      if (attempt === maxRetries - 1) throw error;
      if (!isRetryable(error)) throw error;
      
      const delay = Math.pow(2, attempt) * 1000;
      await sleep(delay);
    }
  }
}

3. Webhooks

Configuración

Registra tu endpoint en el dashboard de QuickDTE:

https://tu-sistema.com/webhooks/quickdte

Validar Firma

Siempre valida la firma HMAC del webhook:

import crypto from 'crypto';

function validateWebhook(payload: string, signature: string): boolean {
  const expected = crypto
    .createHmac('sha256', process.env.WEBHOOK_SECRET!)
    .update(payload)
    .digest('hex');
  
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

Eventos Disponibles

| Evento | Descripción | |--------|-------------| | dte.processed | DTE procesado exitosamente | | dte.rejected | DTE rechazado por MH | | dte.contingency | Entró en modo contingencia | | dte.recovered | Recuperado de contingencia |


4. Rate Limiting

Límites por Plan

| Plan | Requests/min | DTEs/día | |------|-------------|----------| | Starter | 60 | 1,000 | | Pro | 300 | 10,000 | | Enterprise | Ilimitado | Ilimitado |

Manejo de 429

if (response.status === 429) {
  const retryAfter = response.headers.get('Retry-After');
  await sleep(parseInt(retryAfter || '60') * 1000);
  return retry();
}

5. Modo Contingencia

Detección

QuickDTE retorna status 202 Accepted cuando entra en contingencia:

if (response.status === 202) {
  // DTE encolado para transmisión posterior
  const { queueId } = await response.json();
  saveForLaterVerification(queueId);
}

Verificación Posterior

const status = await fetch(
  `https://api.quickdte.com/v1/dte/status/${queueId}`
);

Checklist de Integración

  • [ ] Idempotency keys implementadas
  • [ ] Retry con backoff exponencial
  • [ ] Validación de webhooks
  • [ ] Manejo de rate limiting
  • [ ] Logs detallados de cada request
  • [ ] Monitoreo de errores

¿Necesitas ayuda con tu integración? Contacta a nuestro equipo técnico.

¿Te resultó útil? Compártelo

¿Listo para simplificar tu facturación?

Únete a cientos de empresas que ya usan QuickDTE para cumplir con sus obligaciones fiscales.