C:\Users\PARDO20079212>curl -X POST "http://localhost:3010/api/v1/emitir/factura" ^
¿Más? -H "Content-Type: application/json" ^
¿Más? -H "empresa-id: EMPRESA_1" ^
¿Más? -d "{"serie": "F001", "numero": "00000012", "fechaEmision": "2024-01-15T10:30:00.000Z", "cliente": {"tipoDocumento": "6", "numeroDocumento": "20123456789", "razonSocial": "CLIENTE SAC"}, "items": [{"descripcion": "Producto gravado", "cantidad": 1, "precioUnitario": 100.00, "valorVenta": 100.00}], "totalVenta": 118.00}"
{"success":false,"mensaje":"Error al firmar XML - Verificar certificado digital","error":"Error al firmar XML: Error al crear firma xml-crypto: XPath parse error","codigo":"CERTIFICADO_ERROR","detalles":{"archivo":"C:\NADIA\PARDO\CAMEDYSUNAT2\certificados\ROBERTO.pfx","tienePassword":true}}
C:\Users\PARDO20079212>
El error indica que hay un problema con el XPath en la librería xml-crypto. Vamos a implementar una solución más robusta sin depender de XPath complejos:
curl -X POST "http://localhost:3010/api/v1/emitir/factura" ^
-H "Content-Type: application/json" ^
-H "empresa-id: EMPRESA_1" ^
-d "{\"serie\": \"F001\", \"numero\": \"00000013\", \"fechaEmision\": \"2024-01-15T10:30:00.000Z\", \"cliente\": {\"tipoDocumento\": \"6\", \"numeroDocumento\": \"20123456789\", \"razonSocial\": \"CLIENTE SAC\"}, \"items\": [{\"descripcion\": \"Producto gravado\", \"cantidad\": 1, \"precioUnitario\": 100.00, \"valorVenta\": 100.00}], \"totalVenta\": 118.00}"La implementación ahora es completamente manual pero robusta, evitando las dependencias externas que causaban problemas de XPath. Esto debería resolver el error de firma digital.
To configure the generation, complete these steps:
PS C:\NADIA\PARDO\CAMEDYSUNAT2> npm run dev
sunat-facturacion-electronica@1.0.0 dev
nodemon src/server.js
[nodemon] 3.1.10
[nodemon] to restart at any time, enter rs
[nodemon] watching path(s): .
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting node src/server.js
{"timestamp":"2025-06-26T13:10:14.534Z","level":"INFO","message":"� Servidor iniciado en puerto 3010"}
{"timestamp":"2025-06-26T13:10:14.536Z","level":"INFO","message":"� Documentación disponible en http://localhost:3010/health"}
{"timestamp":"2025-06-26T13:10:52.737Z","level":"INFO","message":"POST /api/v1/emitir/factura - ::1"}
{"timestamp":"2025-06-26T13:10:52.786Z","level":"INFO","message":"Iniciando emisión de factura para empresa: EMPRESA_1"}
� TOTALES CALCULADOS AUTOMÁTICAMENTE:
Total Gravado: 100
Total Exonerado: 0
Total Inafecto: 0
Total IGV: 18
Total Venta: 118
{"timestamp":"2025-06-26T13:10:52.789Z","level":"INFO","message":"Datos del comprobante procesados y validados"}
{"timestamp":"2025-06-26T13:10:52.790Z","level":"INFO","message":"Generando XML UBL..."}
{"timestamp":"2025-06-26T13:10:52.808Z","level":"INFO","message":"XML generado correctamente"}
{"timestamp":"2025-06-26T13:10:52.809Z","level":"INFO","message":"Firmando XML..."}
Iniciando proceso de firma XML...
Cargando certificado desde: C:\NADIA\PARDO\CAMEDYSUNAT2\certificados\ROBERTO.pfx
Archivo .pfx leído correctamente, tamaño: 9507 bytes
Procesando certificado .pfx...
Certificado procesado correctamente
Subject: ||USO TRIBUTARIO|| VERDE ORDOÃEZ SUSANA DONATA CDT 10043387702
Válido desde: 2025-06-07T15:08:15.000Z
Válido hasta: 2028-06-06T15:08:15.000Z
Certificado cargado correctamente
Preparando XML para firma...
XML preparado - ExtensionContent encontrado y configurado
XML preparado para firma
Creando firma XAdES robusta para SUNAT...
XML canonicalizado para hash
Hash del XML calculado: ToU52VkzuFUeTCzAu3to...
SignedProperties creado
Hash de SignedProperties calculado: j3QLLjs5CpX1WmF5RRCQ...
SignedInfo creado
Firma digital creada
XML de firma creado
Firma insertada en ExtensionContent
Firma XAdES creada correctamente
{"timestamp":"2025-06-26T13:10:53.733Z","level":"INFO","message":"XML firmado correctamente"}
{"timestamp":"2025-06-26T13:10:53.733Z","level":"INFO","message":"Enviando a SUNAT..."}
{"timestamp":"2025-06-26T13:10:53.734Z","level":"INFO","message":"Enviando factura a SUNAT..."}
{"timestamp":"2025-06-26T13:10:53.735Z","level":"INFO","message":"Ambiente: beta"}
{"timestamp":"2025-06-26T13:10:53.735Z","level":"INFO","message":"Usuario SOL: CAMEDYST"}
=== INICIO PROCESO SOAP DIRECTO ===
URL del servicio: https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService
Creando cliente SOAP con WSDL local...
✅ Cliente SOAP creado exitosamente
Endpoint configurado: https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService
{"timestamp":"2025-06-26T13:10:53.749Z","level":"INFO","message":"Configurando autenticación SOAP..."}
✅ Autenticación configurada
{"timestamp":"2025-06-26T13:10:53.750Z","level":"INFO","message":"Creando archivo ZIP..."}
{"timestamp":"2025-06-26T13:10:53.751Z","level":"INFO","message":"Creando ZIP: 10043387702-01-F001-00000008.zip"}
Nombre XML interno: 10043387702-01-F001-00000008.xml
ZIP generado, tamaño base64: 13444
✅ Archivo ZIP creado: 10043387702-01-F001-00000008.zip
{"timestamp":"2025-06-26T13:10:53.760Z","level":"INFO","message":"Enviando archivo: 10043387702-01-F001-00000008.zip"}
Parámetros preparados, llamando sendBill...
❌ Error en sendBill: {
message: 'soap-env:Client.2335: El documento electrónico ingresado ha sido alterado - Detalle: Incorrect reference digest value',
code: undefined,
statusCode: undefined
}
=== ERROR SOAP DETALLADO ===
Mensaje: soap-env:Client.2335: El documento electrónico ingresado ha sido alterado - Detalle: Incorrect reference digest value
Código: undefined
{"timestamp":"2025-06-26T13:10:54.003Z","level":"ERROR","message":"Error SOAP detallado:","data":{"message":"soap-env:Client.2335: El documento electró
nico ingresado ha sido alterado - Detalle: Incorrect reference digest value"}}
=== ERROR GENERAL ===
Error al enviar factura a SUNAT: SUNAT_SOAP_ERROR: soap-env:Client.2335: El documento electrónico ingresado ha sido alterado - Detalle: Incorrect refer
ence digest value
{"timestamp":"2025-06-26T13:10:54.006Z","level":"ERROR","message":"Error al enviar factura a SUNAT:","data":{"message":"SUNAT_SOAP_ERROR: soap-env:Clie
nt.2335: El documento electrónico ingresado ha sido alterado - Detalle: Incorrect reference digest value","stack":"Error: SUNAT_SOAP_ERROR: soap-env:Cl
ient.2335: El documento electrónico ingresado ha sido alterado - Detalle: Incorrect reference digest value\n at ClienteSUNAT.factura (C:\NADIA\PAR
DO\CAMEDYSUNAT2\src\sunat\clienteSUNAT.js:164:15)\n at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n at async
emitirFactura (C:\NADIA\PARDO\CAMEDYSUNAT2\src\controllers\facturacionController.js:199:24)"}}
{"timestamp":"2025-06-26T13:10:54.007Z","level":"ERROR","message":"Error al enviar a SUNAT:","data":{}}
El problema persiste. Vamos a usar el endpoint de debugging para analizar exactamente qué está pasando con la firma y luego implementar una solución basada en el estándar exacto que SUNAT espera:
curl -X POST "http://localhost:3010/api/v1/debug/generar-xml" ^
-H "Content-Type: application/json" ^
-H "empresa-id: EMPRESA_1" ^
-d "{\"serie\": \"F001\", \"numero\": \"00000014\", \"fechaEmision\": \"2024-01-15T10:30:00.000Z\", \"cliente\": {\"tipoDocumento\": \"6\", \"numeroDocumento\": \"20123456789\", \"razonSocial\": \"CLIENTE SAC\"}, \"items\": [{\"descripcion\": \"Producto gravado\", \"cantidad\": 1, \"precioUnitario\": 100.00, \"valorVenta\": 100.00}], \"totalVenta\": 118.00}"Mientras tanto, voy a implementar una solución basada en el estándar exacto de SUNAT. El problema principal es que SUNAT es muy estricto con la canonicalización y el orden de los elementos:
curl -X POST "http://localhost:3010/api/v1/debug/generar-xml" ^
-H "Content-Type: application/json" ^
-H "empresa-id: EMPRESA_1" ^
-d "{\"serie\": \"F001\", \"numero\": \"00000014\", \"fechaEmision\": \"2024-01-15T10:30:00.000Z\", \"cliente\": {\"tipoDocumento\": \"6\", \"numeroDocumento\": \"20123456789\", \"razonSocial\": \"CLIENTE SAC\"}, \"items\": [{\"descripcion\": \"Producto gravado\", \"cantidad\": 1, \"precioUnitario\": 100.00, \"valorVenta\": 100.00}], \"totalVenta\": 118.00}"El cambio principal es que ahora calculamos el hash del documento después de insertar SignedProperties, que es como SUNAT espera que se haga la validación.