Comment fonctionne l’empreinte Verifactu
Ce que dit le document technique de l’AEAT, expliqué pour ceux qui doivent le programmer.
Quels champs entrent et dans quel ordre
L’empreinte d’un enregistrement d’émission se calcule sur huit champs du XML, dans cet ordre : IDEmisorFactura, NumSerieFactura, FechaExpedicionFactura, TipoFactura, CuotaTotal, ImporteTotal, Huella (celle de l’enregistrement précédent) et FechaHoraHusoGenRegistro.
L’enregistrement d’annulation en utilise cinq : IDEmisorFacturaAnulada, NumSerieFacturaAnulada, FechaExpedicionFacturaAnulada, Huella et FechaHoraHusoGenRegistro. L’enregistrement d’événement, qui n’existe que dans la modalité NO VERI*FACTU, en utilise neuf, en commençant par les données du système informatique.
Comment se construit la chaîne
Chaque champ s’écrit sous la forme nom=valeur et les champs sont joints par &. On retire les espaces au début et à la fin des valeurs. Si un champ n’a pas de valeur, on écrit seulement le nom et le signe égal : pour le premier enregistrement du système, l’empreinte précédente s’écrit Huella=. La chaîne est encodée en UTF-8 puis passée en SHA-256 ; le résultat s’exprime en hexadécimal et en majuscules, sur 64 caractères.
IDEmisorFactura=89890001K&NumSerieFactura=12345678/G33&FechaExpedicionFactura=01-01-2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=&FechaHoraHusoGenRegistro=2024-01-01T19:20:30+01:00
→ 3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60
Pourquoi le chaînage
Chaque enregistrement contient l’empreinte du précédent : modifier une ancienne facture casse donc toutes les empreintes suivantes. C’est pourquoi la chaîne est propre à chaque système et à chaque installation, et pourquoi deux processus qui facturent en même temps doivent sérialiser le calcul : si deux enregistrements prennent la même empreinte précédente, la chaîne bifurque.
Dans la modalité VERI*FACTU, l’AEAT recalcule l’empreinte de chaque enregistrement reçu. Si elle ne correspond pas à la vôtre, l’enregistrement passe au statut « Aceptado con errores » (accepté avec erreurs).
Et le QR code
Le QR code de la facture contient une URL du service de vérification de l’AEAT avec quatre paramètres : nif, numserie, fecha (JJ-MM-AAAA, avec des tirets) et importe (avec un point décimal). Les valeurs sont encodées pour l’URL en UTF-8 : un numéro de série comme 12345678&G33 doit voyager sous la forme 12345678%26G33.
Le chemin change selon la modalité : ValidarQR pour VERI*FACTU et ValidarQRNoVerifactu pour NO VERI*FACTU, sur www2.agenciatributaria.gob.es (production) ou prewww2.aeat.es (tests). Le paramètre facultatif formato=json sert aux intégrations, mais ne doit jamais figurer dans le QR code imprimé.
Nous l’avons vérifié le 7 octobre 2026 sur le service de vérification de l’environnement de tests de l’AEAT : l’URL que génère cet outil avec 12345678&G33 est acceptée et l’Agence lit correctement le numéro de série, et un montant avec une virgule renvoie la même erreur 2005 que celle signalée ici.