Validar firma de factura electrónica (formato Facturae)
Hola a todos,
Estoy buscando información sobre el tratamiento del formato de facturas electrónicas de la AEAT: facturae. En cuanto al formato del documento, todo bien. El problema me surge al localizar información de como validar la firma de uno de estos documentos. Lo que estoy intentando hacer es que mi aplicación pueda validar la firma de estos documentos. ¿Sabeis algo sobre este tema? Gracias. Un Saludo. |
Para validar y firmar, puedes utilizar el componente que provee el ministerio de hacienda. Es un ActiveX (AEATFACT.DLL) gratuíto que puedes incluir en tus aplicaciones Delphi.
Hacienda también posee un Web service que te permite validar y firmar documentos de forma individual, pero si deseas integrarlo en tu aplicación prueba con el ActiveX Este ActiveX se conecta a internet y vía la Agencia tributaria te permite firmar y validar documentos utilizando un certificado válido que tengas instalado. Yo lo he probado y funciona perfectamente, lo que ya tengo dudas es si hay limitaciones de utilización (por si estás pensando utilizarlo en una aplicación comercial). A parte de esta solución hay otras opciones "de pago" que también te permiten firmar documentos digitales. Puedes revisar: * Aloha Signator * Chilkat * Neevia * SecureBlackBox (los mejores, en mi opinión) * ... Como última opción queda "pelearse" con la CAPICOM o con OpenSSL para implementar una solución. Puedes encontrar una explicación muy buena sobre la utilización del ActiveX de Hacienda y ejemplos en Delphi aquí. Si tienes dudas sobre el proceso o el código delphi ya dirás, aunque está bastante claro. |
Gracias Neftali.
Ya conocía (y tambien había probado) la el activeX AEATFACT.DLL. El problema es que esta librería valida documentos en "BASE 64 y firma PKKCS#7". Si embargo, el formato oficial de facturae utiliza una firma "XADES". En la propia página de la AEAT, donde explican como funciona "Facturación Telemática en formato BASE64 y firma PKCS#7" y el uso de AEATFACT.DLL (aquí),aconsejan utilizar el nuevo formato de Factura electrónica: Facturae, basado en XML con firma XADES, que es el que yo necesito interpretar. Aeatfact.dll no está implementado para reconocer el formato facturae. No obstante (por supueto) muchas gracias por tu ayuda. |
Entonces revisa SecureBlackBox. Soporta ese formato.
|
Muchas gracias Neftali.
Le echo un vistazo. Gracias. Un Saludo. |
Faactura electronica SecureBlackBox vs. Openssl
Yo les recomiendo OPESSL para generar el PKCS7.
Yo desarrolle una DLL para factura electronica de la AFIP de argentina y lo intente con secureblackbox pero la verdad era muy lenta la firma del mensaje. Con OpenSSL la DLL anduvo 10 puntos y la factura electronica vuela, se puede decir. Si quieren probar tienen un ejemplo aca: bitingenieria y descarguen FEAFIP. Espero que les sea util la informacion |
Hola Maro,
Me gustaría consultarte qué solución aplicaste a este tema. Estoy implementando el proceso de firma de XML con Xadex y te estaría muy agradecido si me comentaras un poco qué solución diste a este tema. El problema de SecureBlackBox es que mi proyecto no soporta un gasto de 800€ en estos componentes, ya que necesitaría por un lado la firma Xadex para XML y Pades para PDF. Te agradecería tu comentarios. Un saludo. Manuel. |
Cita:
Saludos |
Muchas gracias Egostar!
He estado ojeado el código y inicialmente sólo necesitaría la parte donde se realiza la firma del fichero XML, ya que el resto del proceso ya lo tengo implementado en base a la normativa vigente en España. Es de mucha utilidad y te lo agradezco sinceramente, pero creo que me resultaría complicado (según mis conocimientos) extraer la parte donde se realiza la firma del fichero. También, creo haber visto que se utiliza el certificado exportado y necesitaría acceder directamente al almacén de certificados, para obtener el certificado correcto. Te quedo muy agradecido por tu ayuda. Un saludo. manuel. |
Hola Manuel...
estoy en la misma situación que tu... genero el xml de la Facturae, pero me falta firmarlo... ¿Lo resolviste? ¿nos puedes guiar un poco? gracias. |
Hola iMia,
Claro; Al final contraté unos componentes de Eldos: SecureBlackBox. Es una suite de componentes para hacer encriptados y nosecuantascosas mas; Un punto importante, que me encontré en mi caso, es que el método para la firma del XML es totalmente diferente a la firma del PDF. Si exportáis la factura también en formato PDF y queréis firmarla, es necesario una licencia un poco superior. Si sólo vais a firmar el XML, creo que hay un paquete más pequeño (más económico). Creo recordar que es este: https://www.eldos.com/sbb/, pero si decidís comprarlo, comprobarlo y preguntar antes, que hablo de memoria. Pensaba sacar una API, para facilitar precisamente esta tarea a otros programadores, con intención de abaratar el coste y simplificar el proceso. De momento la dejé un poco en el tintero. Es un tema que tienen su cierta complejidad, pregúntame lo que vayas necesitando. Saludos; Manuel. |
Manuel, muchas gracias por tu rapidisima respuesta...
Estoy intentando mirar de firmar unicamente el XML con Xades (nada de PDFs), y voy a buscar primero si lo puedo hacer sin componentes. Mirare a traves de alguna dll o algo asi. Ya que puedo generar el xml y en las plataformas de envio del xml a las administraciones publicas, dentro hay la opción de firmar gratuitamente con sus applets... por eso mirar de no pagar y repercutir el gasto a mis "ClientesDeGorra" Si no al final acabare con SBB... ademas la app esta hecha con Delphi 5... casi nada... |
Muy buenas! Increíble que me haya perdido este foro tanto tiempo .. Me siento avergonzado
Como todos vosotros me veo en la necesidad de tratar el tema de la factura electrónica. Quería haceros una pregunta a vosotros que, por lo que veo, vais muy por delante de mi. ¿Habéis usado el fichero xsd de Facturae para generar una clase con el XML Data Binding o lo habéis hecho creando vosotros el XML "a pelo"? Yo, en primera instancia, use el Data Binding y, tras pelearme un poco con él, conseguí generar un XML aparentemente correcto. El problema es en los malditos "namespace" y sus "prefijos".. en vez de ésto: <fe:Facturae xmlns:fe="http...Facturae" xmlns:ds="http...xmldsig#"> yo, obtengo: <Facturae xmlns="http..Facturae"> (nótese la falta del namespace "fe") He conseguido alguna aproximación mejor pero no me convence la manera ya que rompe la filosofía del Data Binding con "apaños".. Alguien sigo el mismo camino que yo y supo resolverlo.. me sería de gran utilidad Muchas gracias por avanzado |
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)
Recuerda poner los tags al código fuente, ejemplo: Gracias :) |
|
Gracias por la respuesta tan rápida! La verdad es que he el enlace está muy bien.. lo de la web de facturae ya lo tenía visto, por eso.. El contenido del xml lo tengo generado perfectamente. . El problema es básicamente con el elemento Facturae que he posteado antes .. Con la interface que ha generado el Data Binding al generar este nodo no lo hace como es debido y no entiendo exactamente el motivo.. Quizá sea un fallo del Data Binding y entonces optaré por algun "truco" para evitarlo pero me gustaría saber si alguien sabe como conseguirlo sin optar por "apaños"
Muchas gracias una vez más |
Hola LITHIUM76,
con el Databinding, si has conseguido generarlo correctamente (ya que el propio de el interprete de xsd delphi no los convierte si tienen referencias externas), lo único que debes haces hacer (o almenos es lo que yo he hecho) ha sido que el nombre del elemento lo he puesto directamente 'fe:Facturae' y el validador del ministerio ha dicho que OK... :-) Yo serialicé el xsd con XSDTool 3.0... pero luego reescribí todos los tipos que necesité manualmente, ya que hacia mas cosas que lo que quería, y la forma que lo hacía no me gustaba... Código:
XMLNode_eFact_32_Facturae = 'fe:Facturae'; |
Muchas gracias iMia
yo también tuve problemas inicialmente con el Data Binding por el import y probé con esa herramienta que mencionas pero no quedé muy contento con el resultado.. Total, que investigando y probando, di con que si descargaba el xsd externo al que hace referencia el del Facturae y lo ponía en el mismo directorio, el Data Binding funcionaba perfectamente. El problema es que todo el XML es perfecto menos el elemento Facturae que sale sin el fe: de las narices . Probé como bien dices poniendo fe:Facturae pero entonces pone el prefijo fe: en todos los elementos del XML y, en consecuencia, el XML no valida. He encontrado algún "apaño" pero me gustaría saber si existe alguna manera elegante de conseguir el prefijo fe solo en elemento y no en sus hijos. No sé si es culpa del DataBinding que no acaba de hacerlo bien del todo o yo que ando algo confundido con mis pocos conocimientos de xml.. se te ocurre alguna cosa? yo ya no sé qué más probar |
Lo debe hacer por que propaga el namespace en los nodos hijos. Eso era algo que no me cuadraba y poor eso reescribí los tiposwsin heredar el namespace.
Mira de modificar el tipo tfacturae para que en el create no lo traslade a los tipos contenidos. (Perdon por la redaccion, estoy desde la tablet) |
No pasa nada por la redacción, se entiende.. Gracias por ser tan rápido/a.. Eso he estado intentando pero no lo consigo de ninguna manera.. Tienes algún ejemplo de código si no te importa de como hacer para no trasladar el namespace, si no te importa? Muy agradecido
|
Como te he comentado, he reescrito todos los tipos de nuevo, sin nada de los namespaces.
A ver si manana te poongo el codigo completo del tipo facturae, para que veas lo simple (y mal para otros casos) que lo he dejado. |
Sería de gran utilidad, muchas gracias.. aquí está una parte del mío (la de los nodos principales, todo no me deja por excesivamente largo) tal como salen del Data Binding por si queda más claro lo que quería decir
|
Como verás lo he simplificado al máximo. y escribo el xml casi de forma literal
Código:
/// Tipo TFacturae |
Perdón pero he andado liado y no he podido responder antes... Pues es un gran trabajo, interesante la aproximación que has hecho al problema y la manera que has encontrado de resolverlo.. Me lo miraré más a fondo a ver si consigo rehacer mi código también . una lástima que el binding no consiga hacerlo directamente :( ¡Muchísimas gracias!
|
|
¡Muchas gracias, olbeup! ¡Muy amable! Gran aporte este post que has puesto.. Una pregunta, si me permites, tu no trabajas a partir de la interface del Data Binding, no? ¿ Son todo IXMLNode's, que vas colocando según correspndo no?
|
Cita:
Un saludo. |
Cita:
Esta es mi primera (bueno segunda) vez , no se si lo hago correctamente, en cualquier caso gracias. Veo que has implementado codigo para la facturae, podrias pasarme algun ejemplo o las clases, muchas gracias . |
Cita:
Buenas , No lo he mirado bien pero en ftp://ftp.zlatkovic.com/libxml/Delphi/ creo que tienes un ejemplo para firmar xml con las libXML y openssl. Yo estoy empezando con todo este tema y si me pudieras pasar algun ejemplo o algo te lo agradeceria , x cierto creo que ya te lo he pedido en otro post. Muchas gracias y un saludo . |
Para el tema de la firma... desde delphi sólo con componentes de terceros $$ o €€ ...
Yo lo voy a solucionar de otra forma... La AEAT/Ministerio/estado/etc... da las clases para firmar... pero en JAVA.... :( Pues a hacerlo en java y hacer un shellexecute... Empiezo las pruebas de firma... iré comentando.... |
Buenas tardes.
También estoy en la misma situación que iMia y Manuel. Actualmente he logrado hacer la factura con el formato xml y validado por la página del ministerio. El problema es que no logro validar la firma, he visto los componentes de SecureBlackBox, pero no son compatibles con Delphi 5. Actualmente estoy probando con OpenSSL, pero no he llegado a obtener buenos resultados. Gracias por vuestra ayuda y consejos. |
Cita:
|
Cita:
No firma xml en formato Xades enveloped, que es el que se necesita para la efactura. Como he comentado en el mensaje de encima, la única forma gratuita es con las clases de la AEAT, pero son clases java. hay que crear un programa en java (.jar) que use esas clases para firmar con 3 parametros, el xml, el certificado y el ficherode salida (".xml" firmado ... ".xsig") y llamarlo con un shell execute.... |
|
Cita:
Para ponerme en el camino yo solito, sin orientación, tardé un par de semanas... y un par de semanas en tener la serialización fina y a mi gusto... por que la herramineta que he comentado que sí serializa no era de mi gusto lo que dejaba... He dado pistas y codigo para tener más de la mitad de la faena hecha... y utilizando el serializador, sería toda la faena hecha... pero para hacerla hay que leer mucho y comprender bien que hay que hacer... Si te pongo todo el código y te doy hecho todo mi trabajo... ¿me pagas lo mismo que mi empresa por ese mes de trabajo? :rolleyes: |
Cita:
Pero por eso estamos aquí, para compartir nuestros conocimientos, no para decirle a los demás que "a mí me costó un mes de trabajo, ¿me lo pagarás?" Espero que lo hayas compartido, y en caso contrario, este no es tu sitio. |
Cita:
Pero me insiste en que se lo pase todo... un foro es para compartir, que es lo que estoy haciendo, para ayudar y encaminar, que es lo que he hecho, para ahorrar horas de investigación, que es lo que he hecho... No para hacerle el trabajo a los demás... por que "como nunca he trabajo con XML"... leches, ni yo antes tampoco... pero ahora sí... por que he leido, investigado, he probado, me he equivocado, vamos, que he aprendido... y no por que me lo han dado hecho sin tener yo que hacer ningún esfuerzo...y sabes de sobras que en todos los foros, de este tipo de gente hay mucha... que sus únicas aportaciones son pedir código y luego silencio... P.D.: Si no soy bienvenido, y a parte de aportar mi reducida experiencia y problemas que me he encontrado, estoy obligado a poner todo el codigo... pues tambien se dice... y me largo por donde he venido... sin problemas... |
A ver, iMia, tienes razón, peeero... me refiero a "las formas", te entiendo perfectamente, somos los primeros que ante casos de ese tipo, no hacemos el trabajo a los demás. Pero no le decimos que nos ha costado un mes de trabajo y que nos lo pague.
Lo que hacemos es indicarle un tutorial, preguntarle en qué parte tiene problemas, qué cosas es la que no entiende, etc. o sea, ayudar a encaminarlo. Desde luego, que el que llega y dice: "tengo que hacer esto, pasadme el código", lo mandamos a tomar......... |
Yo tambien entiendo tu postura como moderador, que conste.
Pero después de indicarle 2 veces, que mire lo que he puesto, que ya he puesto código, lo que he explicado , por donde ir, qué utilizar para que no tenga que hacer casi nada... me sigue insistiendo... es que, se vé claramente que ni se ha leido las 40 páginas del esquema de la eFactura, ni lo compara con el codigo que he puesto, es que si hubiese hecho un minimo esfuerzo, vería claramente por donde seguir... Por eso me he "encendido" un poco... por que no pregunta... "tengo un problema aquí o allí..." si no que... "me puedes pasar tu codigo"... Tampoco creo que le haya dicho DIRECTAMENTE... "me lo vas a pagar?"... en el sentido que quiero que me lo pague.. si no que le he intentado hacer ver que lo que pide tiene un coste de tiempo (y el tiempo es oro...) , muy grande para pedir todo e insistir, con emoticonos, para que no fuese una respuesta seca... |
Tienes razón, porque algunos no quieren aprender, sino que le den el trabajo hecho.
Disculpa si he sido un poco bruto, es que es difícil entender "el tono" de lo que ha escrito otra persona cuando no puedes verle la cara, su expresión, sus gestos, etc. |
La franja horaria es GMT +2. Ahora son las 19:33:59. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi