Este código produce una aceptación con errores: la AEAT registra el registro de facturación, pero queda marcado como «Aceptado con errores» y debe subsanarse mediante la operativa de subsanación (un nuevo registro con Subsanacion). Es el estado más traicionero del sistema: como el envío "entra", muchos SIF lo dan por bueno y acumulan registros defectuosos que constan así en la AEAT. No lo ignores.
La huella se calculó sin aplicar el trim de espacios a cada valor, o con URL-encoding — el documento oficial exige trim y prohíbe el encoding.
El registro no encadena: la huella del registro anterior que declaras no es la del último registro real de tu sistema.
Los valores hasheados no son los literales del XML (fechas o importes reformateados entre el cálculo y la serialización).
Salida en minúsculas o con longitud distinta de 64 caracteres hexadecimales.
Reproduce los tres vectores de ejemplo del documento oficial de la huella: si tu implementación no los clava bit a bit, ahí está el fallo.
Verifica la cadena completa de tu serie (no solo el último registro): una rotura antigua contamina todo lo posterior.
Calcula la huella sobre los mismos bytes que serializas — nunca desde objetos que reformatean fechas o números.