Guía técnica
Cómo integrar Verifactu en Python paso a paso
Verifactu exige que tu software genere, por cada factura, una huella encadenada, un QR tributario y un registro en XML, y que pueda remitirlo a la AEAT. Aquí ves cómo hacerlo en Python con la librería open source Traazza.
1. Instala la librería
El núcleo no tiene dependencias; los extras (imagen del QR, envío, firma) se instalan aparte.
# núcleo pip install traazza # con extras opcionales pip install "traazza[qr]" # imagen del QR pip install "traazza[envio]" # envío a la AEAT (mTLS)
2. Genera la huella, el QR y el XML
Creas una cadena y das de alta la factura. Cada registro incorpora automáticamente la huella del anterior.
from traazza.modelos import Emisor, Cadena, SistemaInformatico, LineaDesglose from traazza import qr, xml emisor = Emisor("89890001K", "EMPRESA EJEMPLO SL") sistema = SistemaInformatico("EMPRESA EJEMPLO SL", "89890001K", "MiFacturador", "01", "1.0.0", "INST-001") cadena = Cadena(emisor) factura = cadena.alta( num_serie="2026/A-1", fecha_expedicion="01-01-2026", tipo_factura="F1", cuota_total="21.00", importe_total="121.00", descripcion_operacion="Venta", desglose=[LineaDesglose("100.00", "21.00", "21.00")]) print(factura.huella) # huella SHA-256 encadenada print(qr.url_desde_registro(factura)) # URL del QR tributario print(xml.registro_alta_xml(factura, sistema)) # XML del registro
3. Valida contra el XSD oficial
Traazza incluye los esquemas oficiales de la AEAT, así que puedes validar el XML sin buscarlos.
from traazza import validacion esquema = validacion.esquema_registros() validacion.validar_alta(factura, sistema, esquema) # True o lanza con el detalle
4. Envía a la AEAT (modalidad Verifactu)
El envío usa tu certificado electrónico por mTLS. En modalidad Verifactu, la remisión con certificado cualificado cuenta como firma básica: no hace falta firmar los registros.
from traazza.cliente import Cliente, Entorno cli = Cliente(entorno=Entorno.PRUEBAS, cert=("cert.pem", "clave.pem")) resp = cli.enviar(emisor, [factura], sistema) print(resp.estado_envio, resp.csv) # "Correcto" + CSV = aceptado
Cuando envíes de verdad te encontrarás con los errores de validación de la AEAT. Los más comunes, explicados: base de errores de Verifactu.
Consejos que evitan dolores
- Fecha de generación: debe ser la actual, sin microsegundos y con huso (errores 2004 y 1244).
- Encadenamiento: persiste la huella del último registro entre ejecuciones o verás el error 2007.
- Nombre del emisor: tal cual consta en el censo de la AEAT (error 4104).
