El problema de los duplicados
Cuando tu sistema emite una factura y la conexión se cae antes de recibir la respuesta, ¿debes reintentar? Si lo haces sin precauciones, podrías generar dos facturas idénticas ante el SAT. La idempotencia es la propiedad que garantiza que enviar la misma solicitud más de una vez produce el mismo resultado: una sola factura, no varias.La base técnica: cadena original y sello
Cadena Original
El SAT define un formato de concatenación (mediante un XSLT) que convierte todos los campos del CFDI en una sola cadena de texto plano. Esa cadena es la Cadena Original. Incluye, entre otros campos:- Versión
- Fecha
- Sello
- FormaPago
- NoCertificado
- Certificado
- Subtotal
- Moneda
- Total
- Tipo de Comprobante
- Exportación
- Método de Pago
- LugarExpedición
- Datos del Emisor
- Datos del Receptor
- Conceptos y sus detalles (descripción, cantidad, valor unitario, importe, etc.)
- Impuestos (transferidos y retenidos).
Sello Digital del Emisor
La Cadena Original se procesa con SHA-256 y el resultado se firma con la llave privada del CSD del emisor usando RSA:Validación del PAC
Antes de certificar el CFDI, el PAC verifica:- La estructura XML es válida (esquemas XSD del SAT)
- El SelloDigital corresponde al CSD del emisor
- El CFDI no fue timbrado previamente (unicidad)
El UUID como identificador único
El PAC genera un UUID (Folio Fiscal) al timbrar. Este UUID es único a nivel nacional y queda registrado en el SAT:Cómo funciona la idempotencia en la API Web
La API Web de Facturama (un RFC emisor) tiene tres campos que si no se especifican, son generados automáticamente en cada llamada:
Si omites estos campos y haces dos llamadas con el mismo JSON, Facturama genera dos CFDIs distintos porque
Date y Folio cambian. Esto rompe la idempotencia.
Cómo implementar idempotencia en API Web
Especifica explícitamente los tres campos antes de enviar:Folio, Date y para Carta Porte IdCCP
Date y Folio fijos, el XML resultante es idéntico en todos los reintentos. El PAC detectará el duplicado y rechazará el segundo intento y la API mostrará la factura que ya había sido timbrada previamente con los mismos datos.
Puedes usar el
Folio como clave de idempotencia en tu base de datos. Si ya existe un CFDI con ese folio, no vuelvas a enviarlo.El campo IdCCP
Para CFDIs con complemento Carta Porte, existe un campo adicionalIdCCP que identifica la carta porte:
Cuándo usar la idempotencia
Aplica la estrategia de idempotencia cuando el error es recuperable por reintento:Flujo recomendado
type = issedLite