Timbrar
Reintentos sin doble timbre
Una red se corta, un servidor se reinicia, el PAC tarda. Con estas reglas una factura nunca se timbra dos veces, pase lo que pase.
La regla
Si la respuesta es HTTP 503, no sabes si se timbró
Reintenta con exactamente el mismo comprobante: la misma Fecha, el mismo folio, los mismos datos. Nunca generes uno nuevo para «intentar otra vez».
Si la factura sí se había timbrado, el reintento responde 506 con el mismo UUID y el mismo XML. Si no, se timbra ahora. En los dos casos terminas con un solo folio fiscal.
Qué hacer con cada respuesta
| Código | HTTP | Qué significa |
|---|---|---|
| 100 | 200 | Timbrado. Guarda el XML. |
| 506 | 200 | Ya estaba timbrado: es el mismo UUID de antes. Guárdalo como si fuera 100. |
| 500 | 503 | En duda o no se pudo enviar. Reintenta igual, o pregunta con seguimientoCFDI. |
| 102 | 429 | Freno de intentos: espera los segundos de Retry-After y reintenta. |
| cualquier otro | 200 | Rechazo: NO se timbró. Corrige lo que dice el mensaje; el corregido ya es otro comprobante. |
Cómo funciona por dentro
- Cada comprobante tiene su huella: el sha256 de su cadena original. Se anota antes de mandarlo al PAC, junto con el comprobante sellado.
- Si el PAC no contesta, se busca el timbre por esa huella. Si aparece, te llega el 100; si no, el 503.
- Un reintento de algo que quedó en duda va sólo al PAC que lo recibió: mandarlo a otro sí podría timbrarlo dos veces.
- Si después de una duda el PAC rechaza (por ejemplo, porque ya pasaron 72 horas), sólo se cree el rechazo si la huella confirma que la primera vez no se timbró.
- Si renuevas tu CSD entre dos intentos, la huella cambia: antes de mandar el nuevo, se resuelve el intento anterior.
- La misma factura dos veces a la vez (un doble clic): una va al PAC y la otra espera su folio.
Preguntar sin reenviar
Cada respuesta trae IdSeguimiento. Con seguimientoCFDI preguntas por el desenlace sin mandar el comprobante otra vez. Nunca reenvía nada al PAC.
seguimientoCFDI · HTTP 200
{
"Codigo": "100",
"Mensaje": "Comprobante timbrado exitosamente",
"UUID": "988B5F3A-889E-4C9C-BAC7-0FEE99589858",
"XMLBase64": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxj…",
"PDFBase64": null,
"IdSeguimiento": "8ce2fefe4ebfae89987a6b49d2f4acbf09542845e2be24e0091cb3aa9ad00d43"
}Un cliente que reintenta bien
Python
import time
import requests
HOST = "https://pruebas.timbrado.idea15.com"
ESPERAS = [5, 30, 120, 600] # y después, cada media hora
def timbrar(comprobante, auth):
"""Timbra una vez. Si no se sabe si se timbró, reintenta con EL MISMO comprobante."""
for espera in ESPERAS + [1800] * 140: # hasta 72 horas
r = requests.post(f"{HOST}/api/TimbrarCfdiObj", auth=auth,
json={"comprobante": comprobante}, timeout=70)
datos = r.json()
if r.status_code == 200:
return datos # 100, 506 o un rechazo con su código
if r.status_code not in (429, 503):
raise RuntimeError(datos["Mensaje"])
time.sleep(espera) # 503: en duda; 429: freno de intentos
raise RuntimeError("Sin desenlace en 72 horas: revísalo en el SAT antes de emitir otra")Lo que no hay que hacer
- Cambiar la Fecha o el folio al reintentar: es otro comprobante, y si el primero sí se timbró, tendrás dos.
- Timbrarlo con otro proveedor mientras está en duda.
- Dar por cancelada o borrar la factura en tu sistema porque no llegó la respuesta.
Después de 72 horas
El PAC sólo busca por huella durante 72 horas. Si una duda pasa de ese plazo, la respuesta te pide revisarla en los CFDI emitidos del SAT antes de volver a emitirla.
