Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   TICKET BAI (TicketBAI); Nuevo sistema de la Agencia Tributaria del Pais Vasco (https://www.clubdelphi.com/foros/showthread.php?t=94264)

batuzail 13-07-2021 07:51:09

Cita:

Empezado por Galaxian (Mensaje 541733)
Échale un vistazo a esto: https://tools.chilkat.io/xmlDsigGen.cshtml

Solo tienes que coger la firma de uno de los ejemplos de TBAI y pegarla en la ventana. Después de generar la firma digital (la clava) puedes usar el ejemplo de factura-e para enviarlo.


Muchisimas gracias, no conocia esa utilidad, es maravillosa :-)

tejano 13-07-2021 08:31:08

Hola, no sé si os ha pasado alguno, cuando una de las bases es negativa me da EL error : B4_2000149-ImporteTotalFactura: El Importe total de la factura tiene un valor incorrecto para el valor de los campos Base imponible, Cuota IVA soportada e Importe compensación REAGYP suministrados, cuando realmente el importe total si es correcto.

Me esta pasando en todas en las que hay alguna base/cuota en negativo

<DatosFactura>
<DescripcionOperacion>MATERIAL SEGURIDAD</DescripcionOperacion>
<Claves>
<IDClave>
<ClaveRegimenIvaOpTrascendencia>01</ClaveRegimenIvaOpTrascendencia>
</IDClave>
</Claves>
<ImporteTotalFactura>3770.65</ImporteTotalFactura>
</DatosFactura>
<IVA>
<DetalleIVA>
<CompraBienesCorrientesGastosBienesInversion>C</CompraBienesCorrientesGastosBienesInversion>
<InversionSujetoPasivo>N</InversionSujetoPasivo>
<BaseImponible>3152.24</BaseImponible>
<TipoImpositivo>21.00</TipoImpositivo>
<CuotaIVASoportada>661.97</CuotaIVASoportada>
<CuotaIVADeducible>661.97</CuotaIVADeducible>
</DetalleIVA>
<DetalleIVA>
<CompraBienesCorrientesGastosBienesInversion>G</CompraBienesCorrientesGastosBienesInversion>
<InversionSujetoPasivo>N</InversionSujetoPasivo>
<BaseImponible>-36.00</BaseImponible>
<TipoImpositivo>21.00</TipoImpositivo>
<CuotaIVASoportada>-7.56</CuotaIVASoportada>
<CuotaIVADeducible>-7.56</CuotaIVADeducible>
</DetalleIVA>
</IVA>

b4aronDeLaBirr4 13-07-2021 08:37:41

Prueba firma XML Chilkat Tools C#
 
Anda, una herramienta bastante interesante! ¿Alguna directriz de alguien que la haya usado? He cogido un ejemplo oficial (Ejemplo_TicketBAI_79732487C_A2022_0399.xml) y me muestra esto con las opciones de .pfx/.p12 file y en C#:

Código PHP:

//  ----------------------------------------------------------------------
//  IMPORTANT: This generated example may require Chilkat v9.5.0.80 or later.
//  ----------------------------------------------------------------------
bool success true;
//  Load the XML to be signed from a string...
Chilkat.Xml xmlToSign = new Chilkat.Xml();
xmlToSign.LoadXml("...");

Chilkat.XmlDSigGen gen = new Chilkat.XmlDSigGen();

gen.SigLocation "T:TicketBai";
gen.SigLocationMod 0;
gen.SigId "Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-Signature";
gen.SigNamespacePrefix "ds";
gen.SigNamespaceUri "http://www.w3.org/2000/09/xmldsig#";
gen.SigValueId "Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignatureValue";
gen.SignedInfoCanonAlg "C14N";
gen.SignedInfoDigestMethod "sha256";

//  Set the KeyInfoId before adding references..
gen.KeyInfoId "Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-KeyInfo";

//  Create an Object to be added to the Signature.
Chilkat.Xml object1 = new Chilkat.Xml();
object1.Tag "xades:QualifyingProperties";
object1.AddAttribute("xmlns:xades","http://uri.etsi.org/01903/v1.3.2#");
object1.AddAttribute("Id","Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-QualifyingProperties");
object1.AddAttribute("Target","#Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-Signature");
object1.AddAttribute("xmlns:ds","http://www.w3.org/2000/09/xmldsig#");
object1.UpdateAttrAt("xades:SignedProperties",true,"Id","Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignedProperties");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime","TO BE GENERATED BY CHILKAT");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestMethod",true,"Algorithm","http://www.w3.org/2001/04/xmlenc#sha512");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestValue","TO BE GENERATED BY CHILKAT");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509IssuerName","TO BE GENERATED BY CHILKAT");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509SerialNumber","TO BE GENERATED BY CHILKAT");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Identifier","https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Description","");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestMethod",true,"Algorithm","http://www.w3.org/2001/04/xmlenc#sha256");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestValue","Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyQualifiers|xades:SigPolicyQualifier|xades:SPURI","https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat",true,"ObjectReference","#Reference-7e6f3481-4acc-47de-90fd-67878ad15e8e");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Description","");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier",true,"Qualifier","OIDAsURN");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier","urn:oid:1.2.840.10003.5.109.10");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Description","");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:MimeType","text/xml");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Encoding","");

gen.AddObject("",object1.GetXml(),"","");

//  -------- Reference 1 --------
gen.AddSameDocRef("","sha512","C14N","","http://www.w3.org/2000/09/xmldsig#Object");
gen.SetRefIdAttr("","Reference-7e6f3481-4acc-47de-90fd-67878ad15e8e");

//  -------- Reference 2 --------
gen.AddObjectRef("Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignedProperties","sha512","","","http://uri.etsi.org/01903#SignedProperties");

//  -------- Reference 3 --------
gen.AddSameDocRef("Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-KeyInfo","sha512","","","");

//  Provide a certificate + private key. (PFX password is test123)
Chilkat.Cert cert = new Chilkat.Cert();
success cert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123");
if (
success != true) {
    
Debug.WriteLine(cert.LastErrorText);
    return;
}

gen.SetX509Cert(cert,true);

gen.KeyInfoType "X509Data+KeyValue";
gen.X509Type "Certificate";

//  Load XML to be signed...
Chilkat.StringBuilder sbXml = new Chilkat.StringBuilder();
xmlToSign.GetXmlSb(sbXml);

gen.Behaviors "CompactSignedXml,TransformSignatureXPath";

//  Sign the XML...
success gen.CreateXmlDSigSb(sbXml);
if (
success != true) {
    
Debug.WriteLine(gen.LastErrorText);
    return;
}

//  -----------------------------------------------

//  Save the signed XML to a file.
success sbXml.WriteFile("qa_output/signedXml.xml","utf-8",false);

Debug.WriteLine(sbXml.GetAsString());

//  ----------------------------------------
//  Verify the signatures we just produced...
Chilkat.XmlDSig verifier = new Chilkat.XmlDSig();
success verifier.LoadSignatureSb(sbXml);
if (
success != true) {
    
Debug.WriteLine(verifier.LastErrorText);
    return;
}

int numSigs verifier.NumSignatures;
int verifyIdx 0;
while (
verifyIdx numSigs) {
    
verifier.Selector verifyIdx;
    
bool verified verifier.VerifySignature(true);
    if (
verified != true) {
        
Debug.WriteLine(verifier.LastErrorText);
        return;
    }

    
verifyIdx verifyIdx 1;
}

Debug.WriteLine("All signatures were successfully verified."); 


Eric Mtz 13-07-2021 08:57:32

Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 541729)
Una pregunta sobre la firma del documento xml e independientemente de la tecnología o lenguaje para firmar dicho documento... ¿Qué formato o tipo de firma se tiene que aplicar? Más que nada por ver qué buscar por ahí dedicado a .NET. He leído en el pdf de política de firma algo del formato XaDes... ¿Alguien que me pueda echar una mano con el concepto de qué necesito para firmar el XML con el certificado?

Hola Barón, pasaba por aquí y no he podido evitar oír que trabajas en .net, por casualidad no andarás programando en C#... si es así creo que tengo mierda de la buena que te podría interesar... :cool: si te apetece podemos intercambiar unas legales y adictivas líneas de código. ;) (Guiño, guiño, codo, codo), bueno, si quieres traficar ando de estraperlo en en uno de los callejones del foro.

b4aronDeLaBirr4 13-07-2021 09:10:21

Exacto! Trabajo en C# en un entorno ASP.NET así que eso que dices por supuesto que me interesa!!

Eric Mtz 13-07-2021 09:23:50

Cita:

Empezado por b4aronDeLaBirr4 (Mensaje 541741)
Exacto! Trabajo en C# en un entorno ASP.NET así que eso que dices por supuesto que me interesa!!

Genial, pues te paso mi correo por privado para hablar en condiciones ;)

batuzail 13-07-2021 09:33:01

Cita:

Empezado por Galaxian (Mensaje 541733)
Échale un vistazo a esto: https://tools.chilkat.io/xmlDsigGen.cshtml

Solo tienes que coger la firma de uno de los ejemplos de TBAI y pegarla en la ventana. Después de generar la firma digital (la clava) puedes usar el ejemplo de factura-e para enviarlo.


No consigo encontrar el ejemplo para enviar el xml con Chilkat, alguien me puede indicar?

tejano 13-07-2021 09:55:39

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 541600)
Aquí te adjunto un ejemplo de una factura recibida (240) y la respuesta de Batuz.

Hola Neftali, no tendrás algún ejemplo de factura eliminada recibida, he mandado una y me ha dado error en la línea 2.

Gracias

yaedev 13-07-2021 12:25:19

Cita:

Empezado por batuzail (Mensaje 541743)
No consigo encontrar el ejemplo para enviar el xml con Chilkat, alguien me puede indicar?

Aquí hay un ejemplo para el envío para Bizkaia: https://www.example-code.com/vbnet/t..._send_POST.asp

jamematen 13-07-2021 12:35:33

Firma desde el navegador
 
Hola a todos.
He llegado aquí buscando información sobre Tickebai y sin ninguna duda es el sitio con la mayor y mejor cantidad.
Después de repasar los mas de mil mensajes de este hilo y hacer algunas pruebas con vuestras aportaciones he llegado a un punto donde me atasco. A ver si me podéis echar una mano.
Necesito firmar el xml de ticketbai desde el navegador, veo que Chilkat genera código para Node.js pero no acabo de entender si ese código podría usarlo desde la parte del cliente (navegador) y tampoco tengo claro que tipo de licencia usa.
Por otra parte he encontrado un librería en github que si se puede usar desde el navegador: PeculiarVentures-xadesjs pero no acabo de encontrar la combinación de parámetros para que me genere la firma tal y como se muestra en los ejemplos. En concreto no consigo que me incluya la transformación: <ds:Transform Algorithm="h t t p://w w w. w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath xmlns:ds="h t t p://w w w .w3.org/2000/09/xmldsig#">not(ancestor-or-self::ds:Signature)</ds:XPath>
</ds:Transform>

Muchas gracias.

Eric Mtz 13-07-2021 12:55:52

Cita:

Empezado por jamematen (Mensaje 541747)
Hola a todos.
He llegado aquí buscando información sobre Tickebai y sin ninguna duda es el sitio con la mayor y mejor cantidad.
Después de repasar los mas de mil mensajes de este hilo y hacer algunas pruebas con vuestras aportaciones he llegado a un punto donde me atasco. A ver si me podéis echar una mano.
Necesito firmar el xml de ticketbai desde el navegador, veo que Chilkat genera código para Node.js pero no acabo de entender si ese código podría usarlo desde la parte del cliente (navegador) y tampoco tengo claro que tipo de licencia usa.
Por otra parte he encontrado un librería en github que si se puede usar desde el navegador: PeculiarVentures-xadesjs pero no acabo de encontrar la combinación de parámetros para que me genere la firma tal y como se muestra en los ejemplos. En concreto no consigo que me incluya la transformación: <ds:Transform Algorithm="h t t p://w w w. w3.org/TR/1999/REC-xpath-19991116">
<ds:XPath xmlns:ds="h t t p://w w w .w3.org/2000/09/xmldsig#">not(ancestor-or-self::ds:Signature)</ds:XPath>
</ds:Transform>

Muchas gracias.


¡¡Sangre nueva!!, sacrifiquémosle y hagamos la danza de BATUZ para que el pálpito de Keys se haga realidad. :D:D

Nah, es broma, bienvenido al foro, yo no te sé responder pero te deseo suerte igualmente.

NVS 13-07-2021 14:18:27

Ayuda configurar Postman para Ticketbai Bizkaia
 
Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 540739)
Yo os diría que realizarais pruebas con Postman, por ejemplo, para probar las diferentes partes del proceso.
Por ejemplo, se pueden configurar los parámetros de cabecera, el certificado de envío y enviar Con eso ya podréis obtener una respuesta como esta:



Que ya son códigos de error y respuesta de BATUZ.
A partir de ahí se trata de ir centrándose en otros aspectos.

Modificar el fichero de ejemplo, por uno de los vuestros, y de ahí en adelante.

En el caso del ejemplo el problema del certificado (Interesado no identificado), porque la gente de BATUZ no admite certificados de prueba como si se hare en TicketBAI (**NOTA**, por si alguien lo está haciendo así que lo tenga en cuenta...)

Para la parte del JSON, también podéis utilizar y modificarlo lévemente.



Hola,

Me parece muy buen consejo empezar con postman en la programacion de LROE de ticketbai e ir paso a paso, y es lo que quiero hacer, pero no consigo configurar en envío para Bizkaia (Guipuzkoa sin problemas)

Me podeis ayudar??

La respuesta que me da es está:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>400 Bad Request</title>
</head>

<body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body>
</html>

Quería poner imagenes con mi configuración, pero me da error al postear: Aún no tienes permitido poner enlaces ni imágenes


El valor completo de "eus-bizkaia-n3-data" es: {"con": "LROE", "apa": "1.1", "inte": {"nif": "B00000034","nrs": "HOTEL ADIBIDEZ"},"drs": {"mode": "240","ejer": "2022"}}

Muchas gracias de antemano

b4aronDeLaBirr4 13-07-2021 14:27:01

Problema FirmaXadEsNet
 
Buenas! Estoy intentando firmar el documento en C# utilizando FirmaXadEsNet y cuando va a firmar con el certificado seleccionado, aparece este error:

Código PHP:

ERROR 2021-07-13 14:13:47,193 [26   Mvc.ExceptionHandling.AbpExceptionFilter Unable to cast object of type 'System.Security.Cryptography.RSACng' to type 'System.Security.Cryptography.RSACryptoServiceProvider'.
System.InvalidCastExceptionUnable to cast object of type 'System.Security.Cryptography.RSACng' to type 'System.Security.Cryptography.RSACryptoServiceProvider'.
   
at FirmaXadesNet.Crypto.Signer.SetSigningKey(X509Certificate2 certificate)
   
at FirmaXadesNet.Crypto.Signer..ctor(X509Certificate2 certificate

No sé si a alguien le ha ocurrido o le suena. He estado leyendo por ahí cosillas pero de momento nada lo ha resuelto así que cualquier comentario sobre el tema sería de ayuda!

batuzail 13-07-2021 15:54:26

Cita:

Empezado por NVS (Mensaje 541750)
Hola,

Me parece muy buen consejo empezar con postman en la programacion de LROE de ticketbai e ir paso a paso, y es lo que quiero hacer, pero no consigo configurar en envío para Bizkaia (Guipuzkoa sin problemas)

Me podeis ayudar??

La respuesta que me da es está:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>400 Bad Request</title>
</head>
<body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body>
</html>

Quería poner imagenes con mi configuración, pero me da error al postear: Aún no tienes permitido poner enlaces ni imágenes


El valor completo de "eus-bizkaia-n3-data" es: {"con": "LROE", "apa": "1.1", "inte": {"nif": "B00000034","nrs": "HOTEL ADIBIDEZ"},"drs": {"mode": "240","ejer": "2022"}}

Muchas gracias de antemano

Yo estoy igual que tu, lo intento desde Postman y desde VB6 con Chilkat y recibo siempre error 400, si lo consigo te aviso, creo que debe de ser algo de los Headers

sEngine 13-07-2021 16:38:11

Con el postman no he conseguido enviar nada pero si con el Insomnia, aunque no me funciona por otras razones pero al menos recibo respuesta en los headers (y error 500)

En los headers del envio pongo esto


eus-bizkaia-n3-content-type: application/xml
Content-Encoding: gzip
eus-bizkaia-n3-data: {"con": "LROE", "apa": "1.1", "inte": {"nif": "B00000034","nrs": "HOTEL ADIBIDEZ"},"drs": {"mode": "240","ejer": "2021"}}
Content-Type: application/octet-stream



Cita:

Empezado por NVS (Mensaje 541750)
Hola,

Me parece muy buen consejo empezar con postman en la programacion de LROE de ticketbai e ir paso a paso, y es lo que quiero hacer, pero no consigo configurar en envío para Bizkaia (Guipuzkoa sin problemas)

Me podeis ayudar??

La respuesta que me da es está:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>400 Bad Request</title>
</head>

<body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body>
</html>

Quería poner imagenes con mi configuración, pero me da error al postear: Aún no tienes permitido poner enlaces ni imágenes


El valor completo de "eus-bizkaia-n3-data" es: {"con": "LROE", "apa": "1.1", "inte": {"nif": "B00000034","nrs": "HOTEL ADIBIDEZ"},"drs": {"mode": "240","ejer": "2022"}}

Muchas gracias de antemano


b4aronDeLaBirr4 13-07-2021 17:00:18

Has añadido el certificado en POSTMAN?

Se añaden aquí como en esta imagen

Yo puse el sello_entidad_act.p12 de desarrollode Izempe (recuerda poner el pin también, que es: IZDesa2021) y pones el Endpoint como puede ser el de alta: https://tbai-prep.egoitza.gipuzkoa.e...nFacturas/alta

sEngine 13-07-2021 17:32:08

¿Sabeis si hay algun DNI de prueba para poder usar para las pruebas en bizkaia? Somos una empresa de fuera del pais vasco y si usamos nuestro DNI dice: "El interesado no está identificado",y si intento usar el de algun cliente nuestro me dice "No existe un apoderamiento para la pareja de interesado y representante indicada", por lo que no puedo probar si funciona realmente.
Me he bloqueado ya

skatologiko 13-07-2021 19:19:47

Buenas tardes a todos. Soy nuevo en el foro, el cual he descubierto hoy volviéndome loco para preparar mis programas para ticket BAI. Tras leer las 50 páginas, sigo más perdido que un pulpo en un garaje. A ver si me podéis arrojar algo de luz. Yo programo con VB6 y las facturas las genero con Crystal Reports. Si no he entendido mal los pasos son los siguientes
Paso 1: Genero el XML de la factura. ¿de dónde sale el número de serie del dispositivo?
Paso 2: Obtengo un XML firmado con Autofirma a partir del fichero obtenido en el paso 1 y con un certificado digital, por ejemplo de la FNMT.
Paso 3: Aquí no entiendo si lo que tengo que extraer son 13 dígitos del archivo del paso 2 o qué exactamente. ¿Con esos dígitos se forma el código QR? ¿En formato jpg? ¿Habría que incrustar esa imagen jpg en la factura?
Paso 4: Entiendo que aquí hay que enviar el archivo obtenido en el paso 2 ¿no?. Y que es diferente para Guipuzcoa o Vizcaya

Otra duda que tengo es cuál es la manera más económica (o gratuita) de obtener el certificado para firmar el .EXE con signtool (porque para eso no sirve mi certificado de la FNMT ¿no?.

NVS 14-07-2021 08:23:50

oK, muchas gracias. E igualemente, si lo consigo te aviso!!!

NVS 14-07-2021 08:34:23

[quote=b4aronDeLaBirr4;541755]Has añadido el certificado en POSTMAN?

Se añaden aquí como en esta *****

Yo puse el sello_entidad_act.p12 de desarrollode Izempe (recuerda poner el pin también, que es: IZDesa2021) y pones el Endpoint como puede ser el de alta: ****

Sí, si lo añado, de hecho utilizo postman para TBAI Gipuzkoa y me responde bien (ahora tengo que pegarme con los XML y demás, pero me funciona).
Pero para Bizkaia no hay forma, error 400 continuamente.

Mis cabeceras ahora son estas:

Accept-Encoding: gzip
Content-Encoding: gzip
Content-Length: 12.631
Content-Type: application/octet-stream
eus-bizkaia-n3-version: 1.0
eus-bizkaia-n3-content-type: {"con": "LROE", "apa": "1.1", "inte": {"nif": "B00000034","nrs": "HOTEL ADIBIDEZ"},"drs": {"mode": "240","ejer": "2021"}}

Y en Body, opcioón Binary con el archivo gz de los ejemplos: Ejemplo_1_LROE_PJ_240_FacturasEmitidasConSG_B00000034.gz

Alguna idea que es lo que nos puede estar fallando???

Muchas gracias

b4aronDeLaBirr4 14-07-2021 08:35:28

Oh vale, yo es que Bizkaia no he probado todavía ya que estoy con lo de la firma pero ánimo, a ver si nos enteramos jeje

b4aronDeLaBirr4 14-07-2021 09:06:49

Firma XML Chilkat
 
Buenas, gente!

Estoy ahora intentando firmar el XML con Chilkat, y me entran dudas en alguna cosa. Yo utilizo la herramienta para que me genere el código C# a partir de un XML firmado (que he cogido de un ejemplo de ellos). Hablando del XML de Gipuzkoa, me genera, en parte, lo siguiente:

Código PHP:

gen.SigLocation "T:TicketBai";
gen.SigLocationMod 0;
gen.SigId "Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-Signature";
gen.SigNamespacePrefix "ds";
gen.SigNamespaceUri "http://www.w3.org/2000/09/xmldsig#";
gen.SigValueId "Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignatureValue";
gen.SignedInfoCanonAlg "C14N";
gen.SignedInfoDigestMethod "sha256";

//  Set the KeyInfoId before adding references..
gen.KeyInfoId "Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-KeyInfo";

//  Create an Object to be added to the Signature.
Chilkat.Xml object1 = new Chilkat.Xml();
object1.Tag "xades:QualifyingProperties";
object1.AddAttribute("xmlns:xades","http://uri.etsi.org/01903/v1.3.2#");
object1.AddAttribute("Id","Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-QualifyingProperties");
object1.AddAttribute("Target","#Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-Signature");
object1.AddAttribute("xmlns:ds","http://www.w3.org/2000/09/xmldsig#");
object1.UpdateAttrAt("xades:SignedProperties",true,"Id","Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignedProperties");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime","TO BE GENERATED BY CHILKAT");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestMethod",true,"Algorithm","http://www.w3.org/2001/04/xmlenc#sha512");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestValue","TO BE GENERATED BY CHILKAT");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509IssuerName","TO BE GENERATED BY CHILKAT");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509SerialNumber","TO BE GENERATED BY CHILKAT");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Identifier","https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Description","");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestMethod",true,"Algorithm","http://www.w3.org/2001/04/xmlenc#sha256");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestValue","Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es=");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyQualifiers|xades:SigPolicyQualifier|xades:SPURI","https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat",true,"ObjectReference","#Reference-7e6f3481-4acc-47de-90fd-67878ad15e8e");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Description","");
object1.UpdateAttrAt("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier",true,"Qualifier","OIDAsURN");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier","urn:oid:1.2.840.10003.5.109.10");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Description","");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:MimeType","text/xml");
object1.UpdateChildContent("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Encoding","");

gen.AddObject("",object1.GetXml(),"","");

//  -------- Reference 1 --------
gen.AddSameDocRef("","sha512","C14N","","http://www.w3.org/2000/09/xmldsig#Object");
gen.SetRefIdAttr("","Reference-7e6f3481-4acc-47de-90fd-67878ad15e8e");

//  -------- Reference 2 --------
gen.AddObjectRef("Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignedProperties","sha512","","","http://uri.etsi.org/01903#SignedProperties");

//  -------- Reference 3 --------
gen.AddSameDocRef("Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-KeyInfo","sha512","","",""); 

De aquí, qué es fijo y qué tengo que modificar?? Porque por supuesto veo esos "TO BE GENERATED BY CHILKAT" pero solo se cambian esos apartados? más?

batuzail 14-07-2021 09:30:57

Cita:

Empezado por skatologiko (Mensaje 541759)
Buenas tardes a todos. Soy nuevo en el foro, el cual he descubierto hoy volviéndome loco para preparar mis programas para ticket BAI. Tras leer las 50 páginas, sigo más perdido que un pulpo en un garaje. A ver si me podéis arrojar algo de luz. Yo programo con VB6 y las facturas las genero con Crystal Reports. Si no he entendido mal los pasos son los siguientes
Paso 1: Genero el XML de la factura. ¿de dónde sale el número de serie del dispositivo?
Paso 2: Obtengo un XML firmado con Autofirma a partir del fichero obtenido en el paso 1 y con un certificado digital, por ejemplo de la FNMT.
Paso 3: Aquí no entiendo si lo que tengo que extraer son 13 dígitos del archivo del paso 2 o qué exactamente. ¿Con esos dígitos se forma el código QR? ¿En formato jpg? ¿Habría que incrustar esa imagen jpg en la factura?
Paso 4: Entiendo que aquí hay que enviar el archivo obtenido en el paso 2 ¿no?. Y que es diferente para Guipuzcoa o Vizcaya

Otra duda que tengo es cuál es la manera más económica (o gratuita) de obtener el certificado para firmar el .EXE con signtool (porque para eso no sirve mi certificado de la FNMT ¿no?.

Te recomiendo los componentes de Chilkat para generar los xml y para realizar el envío, lo estoy haciedo sobre VB6, y ya consigo enviar a Gipuzkoa, en Bizkaia me da error 400 y 415, creo que es algo de cabeceras que tendré que descubrir.
Yo uso CR8.5 y para generar el QR encontre un dll que lo genera y permite guardarlo como imagen, ya que la versión de CR no permite crear QR.


Si necesitas ayuda te puedo pasar ejemplos para el envío.


Saludos

keys 14-07-2021 09:32:17

Cita:

Empezado por skatologiko (Mensaje 541759)
Buenas tardes a todos. Soy nuevo en el foro, el cual he descubierto hoy volviéndome loco para preparar mis programas para ticket BAI. Tras leer las 50 páginas, sigo más perdido que un pulpo en un garaje. A ver si me podéis arrojar algo de luz. Yo programo con VB6 y las facturas las genero con Crystal Reports. Si no he entendido mal los pasos son los siguientes
Paso 1: Genero el XML de la factura. ¿de dónde sale el número de serie del dispositivo?
Paso 2: Obtengo un XML firmado con Autofirma a partir del fichero obtenido en el paso 1 y con un certificado digital, por ejemplo de la FNMT.
Paso 3: Aquí no entiendo si lo que tengo que extraer son 13 dígitos del archivo del paso 2 o qué exactamente. ¿Con esos dígitos se forma el código QR? ¿En formato jpg? ¿Habría que incrustar esa imagen jpg en la factura?
Paso 4: Entiendo que aquí hay que enviar el archivo obtenido en el paso 2 ¿no?. Y que es diferente para Guipuzcoa o Vizcaya

Otra duda que tengo es cuál es la manera más económica (o gratuita) de obtener el certificado para firmar el .EXE con signtool (porque para eso no sirve mi certificado de la FNMT ¿no?.

1 . El numero de serie del dispositivo es un número que te dan a la hora de pedir el certificado de dispostivo. Si no utilizas el certificado de dispositivo para firmar las facturas no es necesario.
2. Correcto. Lo puedes firmar con autofirma o con otro sistema.
3 Tienes que formar el TBAI sacando lo que dice la norma del fichero que acabas de generar y formar el codigo QR. Dentro de la factura en papel lo debes poner, ya sea en jpg o como tu quieras. Pero tiene que estar en la imagen de la factura, pdf, etc....
4 Ese fichero hay que enviarlo a hacienda.

Que yo sepa no hay ninguna forma gratuita de firmar los exe. El de la fnmt no sirve. Yo el mas economico que he encontrado es este https://www.ksoftware.net/code-signing-certificates/

NVS 14-07-2021 09:47:11

Cita:

Empezado por batuzail (Mensaje 541770)
Te recomiendo los componentes de Chilkat para generar los xml y para realizar el envío, lo estoy haciedo sobre VB6, y ya consigo enviar a Gipuzkoa, en Bizkaia me da error 400 y 415, creo que es algo de cabeceras que tendré que descubrir.
Yo uso CR8.5 y para generar el QR encontre un dll que lo genera y permite guardarlo como imagen, ya que la versión de CR no permite crear QR.


Si necesitas ayuda te puedo pasar ejemplos para el envío.


Saludos

Hola,

Una pregunta, las librerias de Chilkat NO son gratuitas, ¿verdad? o ¿si?

batuzail 14-07-2021 09:55:05

Cita:

Empezado por NVS (Mensaje 541772)
Hola,

Una pregunta, las librerias de Chilkat NO son gratuitas, ¿verdad? o ¿si?


No, pero no son muy caras, para un empresa, unos 289$ licencia de por vida. Te van ha facilitar muchisimo la vida.

NVS 14-07-2021 09:59:07

Cita:

Empezado por batuzail (Mensaje 541773)
No, pero no son muy caras, para un empresa, unos 289$ licencia de por vida. Te van ha facilitar muchisimo la vida.

OK, muchas gracias

thinkows 14-07-2021 09:59:53

Loados los hados del VB6
 
Cita:

Empezado por batuzail (Mensaje 541770)
Te recomiendo los componentes de Chilkat para generar los xml y para realizar el envío, lo estoy haciedo sobre VB6, y ya consigo enviar a Gipuzkoa, en Bizkaia me da error 400 y 415, creo que es algo de cabeceras que tendré que descubrir.
Yo uso CR8.5 y para generar el QR encontre un dll que lo genera y permite guardarlo como imagen, ya que la versión de CR no permite crear QR.


Si necesitas ayuda te puedo pasar ejemplos para el envío.


Saludos

Buenos días creía que era el único en desarrollar en anacrónico VB6 que alegría me has dado, yo también genero el xml y firmo con chilkat ... pero el envío a Guipuzkoa lo tengo muy verde, estoy probando con Advanced Rest Client de SoftEmule el ejemplo que ha puesto un compañero pero siempre me da error 500, podrías poner algun ejemplo de envio a Guipuzkoa ??? te estaría muy agradecido y si necesitas algo mi
aquí estoy ....

Saludos y gracias de antemano

Neftali [Germán.Estévez] 14-07-2021 10:33:39

Cita:

Empezado por NVS (Mensaje 541766)
Alguna idea que es lo que nos puede estar fallando???


Yo mismo recomendé en su momento Postman para hacer las pruebas y ahora he probado envíos a Vizcaya con Postman y también me están dando problemas.
La verdad es que en su momento fue algo simple, y no se si ha cambiado algo, pero no consigo respuesta.

He realizado una prueba sencilla con insomnia (que es similar a Postman) y me ha funcionado sin problemas (como en su dia lo hizo Postman), así que os dejo los pasos.

1) descargar insomnia (Insomnia.Core-2021.4.1.exe):
https://insomnia.rest/download

2) Ejecutar el fichero directamente. Se abre en programa con un entorno de pruebas.
3) Al entrar la primera vez, aceptar los dialogos iniciales y acceder al Dashboard (o crear uno nuevo)
4) Configurar el certificado cliente desde Dashboard/Insomnia/Collection settings:




Una vez creado debe aparecer así:


5) Montar una nueva petición (POST) con la URL de Vizcaya.
En el Body, seleccionar "binary file" y seleccionar nuestro fichero de LROE codificado como gzip


Sólo añadir el fichero, detecta el tipo y nos pregunta si cambia esto; Le decimos que si:


6) En Header, añadimos los parámetros que nos piden:


Y realizamos en SEND.

7) Obtenemos respuesta:


Y en el Header de la Response, ya podemos ver respuesta de Batuz.
En mi caso, la factura era incorrecta y eso es lo que me están diciendo.


Esto tan sencillo (o muy similar) funcionaba en Postman y ahora no se porqué está dando problemas.
Si lo queréis probar con insomnia a ver si os funciona, ya diréis cual es el resultado y si os da problemas.

Sistel 14-07-2021 10:35:30

Cita:

Empezado por skatologiko (Mensaje 541759)
Buenas tardes a todos. Soy nuevo en el foro, el cual he descubierto hoy volviéndome loco para preparar mis programas para ticket BAI. Tras leer las 50 páginas, sigo más perdido que un pulpo en un garaje. A ver si me podéis arrojar algo de luz. Yo programo con VB6 y las facturas las genero con Crystal Reports. Si no he entendido mal los pasos son los siguientes
Paso 1: Genero el XML de la factura. ¿de dónde sale el número de serie del dispositivo?
Paso 2: Obtengo un XML firmado con Autofirma a partir del fichero obtenido en el paso 1 y con un certificado digital, por ejemplo de la FNMT.
Paso 3: Aquí no entiendo si lo que tengo que extraer son 13 dígitos del archivo del paso 2 o qué exactamente. ¿Con esos dígitos se forma el código QR? ¿En formato jpg? ¿Habría que incrustar esa imagen jpg en la factura?
Paso 4: Entiendo que aquí hay que enviar el archivo obtenido en el paso 2 ¿no?. Y que es diferente para Guipuzcoa o Vizcaya

Otra duda que tengo es cuál es la manera más económica (o gratuita) de obtener el certificado para firmar el .EXE con signtool (porque para eso no sirve mi certificado de la FNMT ¿no?.

Hola skatologiko.

Bienvenido a este fascinante mundo del TicketBAI :D:D:D

Efectivamente, los pasos (en el caso de arquitectura de escritorio) son:

1.- Crear el XML de la factura a emitir, incluyendo (además de los datos habituales de la factura):
- Datos de la última factura emitida: serie, número, fecha y 100 primeros caracteres de su firma
- Datos del software garante (licencia TBAI, NIF de la entidad desarrolladora, nombre del software y versión).
- Nº de serie del dispositivo, que puede ser uno de éstos:
- Nº de serie del equipo
- Nº de serie de la placa base
- Dirección MAC de red
- IMEI del dispositivo móvil (en el caso de un dispositivo móvil)

2.- Firmar el XML con un certificado válido. Por ejemplo con un certificado de dispositivo.
(Los certificados de dispositivo de IZENPE para TicketBAI son gratuitos y tienen una validez de 10 años)

3.- Obtener los códigos TBAI y QR
El código TBAI lleva algunos datos de la factura + los 13 primeros dígitos de la firma + un código CRC-8
El código QR lleva datos del código TBAI + otro código CRC-8

4.- Imprimir o guardar la factura con los códigos TBAI y QR insertados con el tamaño y posición que se detalla en la normativa TicketBAI

5.- Enviar el XML firmado de la factura a la Hacienda Foral correspondiente.
En el caso de Álava o Gipuzkoa, de forma inmediata.
En el caso de Bizkaia, dentro del plazo de declaraciones de IVA (o de SII si se está obligado) en formato capítulo 1.1 del LROE (modelo 140 para autónomos o modelo 240 para empresas)

Aunque no tengo ni idea de Windows, (mis aplicaciones TicketBAI no son de arquitectura de escritorio sino de servidor y en Linux), sí que entendí que en el caso de que se instale la aplicación de facturación en un PC con Windows, el fichero .EXE debe ir firmado con un certificado de aplicación (que no son ni los de IZENPE ni los de FNMT).

Saludos

Neftali [Germán.Estévez] 14-07-2021 10:39:04

Se puede guardar la respuesta desde:


Os da por defecto un XML, debéis guardarlo como GZIP; Esto está relacionado con el "bug" o "caracteristica" (para la gente de Batuz) de que la respuesta llega comprimida 2 veces.
Si lo guardáis en formato Gzip, tenéis el fichero de respuesta con el XML y la estructura de la documentación.

Neftali [Germán.Estévez] 14-07-2021 10:51:38

Cita:

Empezado por tejano (Mensaje 541744)
Hola Neftali, no tendrás algún ejemplo de factura eliminada recibida, he mandado una y me ha dado error en la línea 2.


Lo siento, todavía no.
Pero no parece muy complicado, ¿no?


batuzail 14-07-2021 10:54:16

Cita:

Empezado por thinkows (Mensaje 541775)
Buenos días creía que era el único en desarrollar en anacrónico VB6 que alegría me has dado, yo también genero el xml y firmo con chilkat ... pero el envío a Guipuzkoa lo tengo muy verde, estoy probando con Advanced Rest Client de SoftEmule el ejemplo que ha puesto un compañero pero siempre me da error 500, podrías poner algun ejemplo de envio a Guipuzkoa ??? te estaría muy agradecido y si necesitas algo mi
aquí estoy ....

Saludos y gracias de antemano

Aqui tienes lo que tengo hasta el momento, está un poco guarrete y con cosas a piñón, ya que estoy de pruebas aún, pero como punto de partida te funcionará, por lo menos para Gipuzkoa, yo tengo que implemetar los tres envíos. Como ves usando Chilkat no es muy complejo, además hay ejemplos y utilidades https://tools.chilkat.io/xmlCreate.cshtml, puedes instalar una version trial de 30 dias.
Código:

Attribute VB_Name = "TicketBAI"
Option Explicit


Public Function GenerarXMLTbai() '(ejercicio As Integer, serie As String, factura As Long) As Boolean
Dim success As Long
Dim rsFactura As Recordset
Dim sSQL As String

success = 1
'  Create the XML to be signed...
Dim xmlToSign As New ChilkatXml
xmlToSign.Tag = "T:TicketBai"
success = xmlToSign.AddAttribute("xmlns:T", "urn:ticketbai:emision")
xmlToSign.UpdateChildContent "Cabecera|IDVersionTBAI", "1.2"
xmlToSign.UpdateChildContent "Sujetos|Emisor|NIF", "B00000034"
xmlToSign.UpdateChildContent "Sujetos|Emisor|ApellidosNombreRazonSocial", "HOTEL ADIBIDEZ"
xmlToSign.UpdateChildContent "Sujetos|Destinatarios|IDDestinatario|NIF", "B26248146"
xmlToSign.UpdateChildContent "Sujetos|Destinatarios|IDDestinatario|ApellidosNombreRazonSocial", "EMPRESA LANTEGIA"
xmlToSign.UpdateChildContent "Factura|CabeceraFactura|SerieFactura", "B2022"
xmlToSign.UpdateChildContent "Factura|CabeceraFactura|NumFactura", "0100"
xmlToSign.UpdateChildContent "Factura|CabeceraFactura|FechaExpedicionFactura", "30-01-2021"
xmlToSign.UpdateChildContent "Factura|CabeceraFactura|HoraExpedicionFactura", "18:00:17"
xmlToSign.UpdateChildContent "Factura|DatosFactura|DescripcionFactura", "Servicios Hotel"
xmlToSign.UpdateChildContent "Factura|DatosFactura|DetallesFactura|IDDetalleFactura|DescripcionDetalle", ""
xmlToSign.UpdateChildContent "Factura|DatosFactura|DetallesFactura|IDDetalleFactura|Cantidad", "1"
xmlToSign.UpdateChildContent "Factura|DatosFactura|DetallesFactura|IDDetalleFactura|ImporteUnitario", "55"
xmlToSign.UpdateChildContent "Factura|DatosFactura|DetallesFactura|IDDetalleFactura|Descuento", "0"
xmlToSign.UpdateChildContent "Factura|DatosFactura|DetallesFactura|IDDetalleFactura|ImporteTotal", "66.55"
xmlToSign.UpdateChildContent "Factura|DatosFactura|ImporteTotalFactura", "66.55"
xmlToSign.UpdateChildContent "Factura|DatosFactura|Claves|IDClave|ClaveRegimenIvaOpTrascendencia", "01"
xmlToSign.UpdateChildContent "Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|TipoNoExenta", "S1"
xmlToSign.UpdateChildContent "Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|DesgloseIVA|DetalleIVA|BaseImponible", "55.00"
xmlToSign.UpdateChildContent "Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|DesgloseIVA|DetalleIVA|TipoImpositivo", "21.00"
xmlToSign.UpdateChildContent "Factura|TipoDesglose|DesgloseFactura|Sujeta|NoExenta|DetalleNoExenta|DesgloseIVA|DetalleIVA|CuotaImpuesto", "11.55"
xmlToSign.UpdateChildContent "HuellaTBAI|EncadenamientoFacturaAnterior|SerieFacturaAnterior", "B2022"
xmlToSign.UpdateChildContent "HuellaTBAI|EncadenamientoFacturaAnterior|NumFacturaAnterior", "0099"
xmlToSign.UpdateChildContent "HuellaTBAI|EncadenamientoFacturaAnterior|FechaExpedicionFacturaAnterior", "29-01-2022"
xmlToSign.UpdateChildContent "HuellaTBAI|EncadenamientoFacturaAnterior|SignatureValueFirmaFacturaAnterior", "BeMkKwXaFsxHQec65SKpVP7EU9o4nUXOx7SAftIToFsxH+2j2tXPXhpBUnS26dhdSpiMl2DlTuqRsFdZfWyYazaGHgSRQHZZAnFt"
xmlToSign.UpdateChildContent "HuellaTBAI|Software|LicenciaTBAI", "TBAXXXXX"
xmlToSign.UpdateChildContent "HuellaTBAI|Software|EntidadDesarrolladora|NIF", "XXXXXX"
xmlToSign.UpdateChildContent "HuellaTBAI|Software|Nombre", "XXXXXXX"
xmlToSign.UpdateChildContent "HuellaTBAI|Software|Version", App.Major & "." & App.Minor & "." & App.Revision

FirmarXMLTbai xmlToSign

End Function

Public Function FirmarXMLTbai(xmlToSign As ChilkatXml) As Boolean
Dim gen As New ChilkatXmlDSigGen
Dim success As Long
    success = 1
    gen.SigLocation = "T:TicketBai"
    gen.SigLocationMod = 0
    gen.SigId = "Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-Signature"
    gen.SigNamespacePrefix = "ds"
    gen.SigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#"
    gen.SigValueId = "Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-SignatureValue"
    gen.SignedInfoCanonAlg = "C14N"
    gen.SignedInfoDigestMethod = "sha256"
   
    '  Set the KeyInfoId before adding references..
    gen.KeyInfoId = "Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-KeyInfo"
   
    '  Create an Object to be added to the Signature.
    Dim object1 As New ChilkatXml
    object1.Tag = "xades:QualifyingProperties"
    success = object1.AddAttribute("xmlns:xades", "http://uri.etsi.org/01903/v1.3.2#")
    success = object1.AddAttribute("Id", "Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-QualifyingProperties")
    success = object1.AddAttribute("Target", "#Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-Signature")
    success = object1.AddAttribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#")
    success = object1.UpdateAttrAt("xades:SignedProperties", 1, "Id", "Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-SignedProperties")
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime", "TO BE GENERATED BY CHILKAT"
    success = object1.UpdateAttrAt("xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestMethod", 1, "Algorithm", "http://www.w3.org/2001/04/xmlenc#sha512")
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestValue", "TO BE GENERATED BY CHILKAT"
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509IssuerName", "TO BE GENERATED BY CHILKAT"
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509SerialNumber", "TO BE GENERATED BY CHILKAT"
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Identifier", "https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf"
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Description", ""
    success = object1.UpdateAttrAt("xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestMethod", 1, "Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256")
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestValue", "Quzn98x3PMbSHwbUzaj5f5KOpiH0u8bvmwbbbNkO9Es="
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyQualifiers|xades:SigPolicyQualifier|xades:SPURI", "https://www.batuz.eus/fitxategiak/batuz/ticketbai/sinadura_elektronikoaren_zehaztapenak_especificaciones_de_la_firma_electronica_v1_0.pdf"
    success = object1.UpdateAttrAt("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat", 1, "ObjectReference", "#Reference-cf54e6a9-7bf2-4128-8cae-474a267a16a1")
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Description", ""
    success = object1.UpdateAttrAt("xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier", 1, "Qualifier", "OIDAsURN")
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Identifier", "urn:oid:1.2.840.10003.5.109.10"
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:ObjectIdentifier|xades:Description", ""
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:MimeType", "text/xml"
    object1.UpdateChildContent "xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Encoding", ""
   
    success = gen.AddObject("", object1.GetXml(), "", "")
    '  -------- Reference 1 --------
    success = gen.AddSameDocRef("", "sha512", "C14N", "", "http://www.w3.org/2000/09/xmldsig#Object")
    success = gen.SetRefIdAttr("", "Reference-cf54e6a9-7bf2-4128-8cae-474a267a16a1")
    '  -------- Reference 2 --------
    success = gen.AddObjectRef("Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-SignedProperties", "sha512", "", "", "http://uri.etsi.org/01903#SignedProperties")
    '  -------- Reference 3 --------
    success = gen.AddSameDocRef("Signature-a53a6ab2-f904-4f7c-be64-603333f651bf-KeyInfo", "sha512", "", "", "")
    '  Provide a certificate + private key. (PFX password is test123)
    Dim cert As New ChilkatCert
    success = cert.LoadPfxFile("ruta.pfx", "1234")
    If (success <> 1) Then
        Debug.Print cert.LastErrorText
        Exit Function
    End If
   
    success = gen.SetX509Cert(cert, 1)
   
    gen.KeyInfoType = "X509Data+KeyValue"
    gen.X509Type = "Certificate"
    '  Load XML to be signed...
    Dim sbXml As New ChilkatStringBuilder
    success = xmlToSign.GetXmlSb(sbXml)
    gen.Behaviors = "IndentedSignature,TransformSignatureXPath"
    '  Sign the XML...
    success = gen.CreateXmlDSigSb(sbXml)
    If (success <> 1) Then
        Debug.Print gen.LastErrorText
        Exit Function
    End If
    '  Save the signed XML to a file.
    success = sbXml.WriteFile("c:\signedXml.xml", "utf-8", 0)
    'Debug.Print sbXml.GetAsString()
   
    VerificarFirmaXMLTbai sbXml
End Function
 
Public Function VerificarFirmaXMLTbai(sbXml As ChilkatStringBuilder) As Boolean
Dim verifier As New ChilkatXmlDSig
Dim success As Long
    success = 1
    success = verifier.LoadSignatureSb(sbXml)
    If (success <> 1) Then
        Debug.Print verifier.LastErrorText
        Exit Function
    End If
   
    Dim numSigs As Long
    numSigs = verifier.NumSignatures
    Dim verifyIdx As Long
    verifyIdx = 0
    Do While verifyIdx < numSigs
        verifier.selector = verifyIdx
        Dim verified As Long
        verified = verifier.VerifySignature(1)
        If (verified <> 1) Then
            Debug.Print verifier.LastErrorText
            Exit Function
        End If
   
        verifyIdx = verifyIdx + 1
    Loop
    Debug.Print "All signatures were successfully verified."
End Function

Public Sub EnviarXMLTbai()

Dim Http As New ChilkatHttp
Dim success As Boolean
success = Http.SetSslClientCertPfx("ruta.pfx", "1234")
If (success = False) Then
    Debug.Print Http.LastErrorText
    Exit Sub
End If

' Get the XML we wish to send in the body of the request.
Dim sbXml As New ChilkatStringBuilder
success = sbXml.LoadFile("c:\signedXml.xml", "utf-8")
If (success = False) Then
    Debug.Print ("Failed to load XML that is to be the HTTP request body")
    Exit Sub
End If

Dim url As String
url = "https://tbai-prep.egoitza.gipuzkoa.eus/WAS/HACI/HTBRecepcionFacturasWEB/rest/recepcionFacturas/alta"
Dim bGzip As Boolean
bGzip = True
Dim resp As ChilkatHttpResponse

Set resp = Http.PostXml(url, sbXml.GetAsString, "utf-8")
If (Http.LastMethodSuccess = False) Then
    Debug.Print (Http.LastErrorText)
    Exit Sub
End If

Http.ClearHeaders

Debug.Print ("response status code: " & resp.StatusCode)

' Examine the response (it is already decompressed)
Debug.Print ("response body:")
Debug.Print (resp.BodyStr)

End Sub


skatologiko 14-07-2021 10:58:54

Muchas gracias, pues sí que lo agradecería. Acabo de adquirir la licencia de Chilkat (que justo además la necesitaba también para otra cosa, jejeje )

Cita:

Empezado por batuzail (Mensaje 541770)
Te recomiendo los componentes de Chilkat para generar los xml y para realizar el envío, lo estoy haciedo sobre VB6, y ya consigo enviar a Gipuzkoa, en Bizkaia me da error 400 y 415, creo que es algo de cabeceras que tendré que descubrir.
Yo uso CR8.5 y para generar el QR encontre un dll que lo genera y permite guardarlo como imagen, ya que la versión de CR no permite crear QR.


Si necesitas ayuda te puedo pasar ejemplos para el envío.


Saludos


NVS 14-07-2021 11:01:34

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 541776)
Yo mismo recomendé en su momento Postman para hacer las pruebas y ahora he probado envíos a Vizcaya con Postman y también me están dando problemas.
La verdad es que en su momento fue algo simple, y no se si ha cambiado algo, pero no consigo respuesta.

He realizado una prueba sencilla con insomnia (que es similar a Postman) y me ha funcionado sin problemas (como en su dia lo hizo Postman), así que os dejo los pasos.

1) descargar insomnia (Insomnia.Core-2021.4.1.exe):
...
2) Ejecutar el fichero directamente. Se abre en programa con un entorno de pruebas.
3) Al entrar la primera vez, aceptar los dialogos iniciales y acceder al Dashboard (o crear uno nuevo)
4) Configurar el certificado cliente desde Dashboard/Insomnia/Collection settings:
...

Una vez creado debe aparecer así:
...
5) Montar una nueva petición (POST) con la URL de Vizcaya.
En el Body, seleccionar "binary file" y seleccionar nuestro fichero de LROE codificado como gzip
...

Sólo añadir el fichero, detecta el tipo y nos pregunta si cambia esto; Le decimos que si:
...

6) En Header, añadimos los parámetros que nos piden:
...

Y realizamos en SEND.

7) Obtenemos respuesta:
...

Y en el Header de la Response, ya podemos ver respuesta de Batuz.
En mi caso, la factura era incorrecta y eso es lo que me están diciendo.
...

Esto tan sencillo (o muy similar) funcionaba en Postman y ahora no se porqué está dando problemas.
Si lo queréis probar con insomnia a ver si os funciona, ya diréis cual es el resultado y si os da problemas.

(NOTA: He modificado el mensaje para eliminar las imágenes duplicadas)

MUCHAS GRACIAS Neftali, intentaré probar con insomnia!!!

b4aronDeLaBirr4 14-07-2021 11:45:31

Disculpa, a ti no te sale este error al enviar? Me da el fichero como recibido pero me dice lo siguiente:

Código PHP:

<Codigo>008</Codigo>
            <
Descripcion>El mensaje ha sido modificado en tránsito o la firma no está bien realizada -- SignedInfo failed to verifyReference URI="" failed to verifyReference URI="#Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-SignedProperties" failed to verifyReference URI="#Signature-63c35f38-2b5f-4600-b3da-3ddee86d62b3-KeyInfo" failed to verify. [src/xml2signatureobj.cpp(315)] - (10606)</ 


NVS 14-07-2021 12:25:12

Postman
 
Me funciona con Insomnia, bueno me dice Error 500 Internal server error:

eus-bizkaia-n3-mensaje-respuesta: El interesado no est� identificado.
eus-bizkaia-n3-codigo-respuesta: N3_0000002

Utilizo un certificado de dispositivo, y es su xml de pruebas... entiendo que será por eso...
¿sabeis si en pruebas se puede usar certificado de dispositivo?

Pero ya no tengo error 400!! :)

Un saludo,

thinkows 14-07-2021 12:31:33

De lujo compañero !!!!! muy agradecido voy ha probar

tejano 14-07-2021 12:36:32

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 541779)
Lo siento, todavía no.
Pero no parece muy complicado, ¿no?


Buenas Neftali, finalmente era un error mío, estaba poniendo la cabecera de la anulación de emitidas.

Si alguien necesita la estructura de la anulación, emisión o consulta de las emitidas que me diga y le paso ejemplos puesto que en la página de Batuz no existen ejemplos.

tejano 14-07-2021 12:38:34

Cita:

Empezado por NVS (Mensaje 541784)
Me funciona con Insomnia, bueno me dice Error 500 Internal server error:

eus-bizkaia-n3-mensaje-respuesta: El interesado no est� identificado.
eus-bizkaia-n3-codigo-respuesta: N3_0000002

Utilizo un certificado de dispositivo, y es su xml de pruebas... entiendo que será por eso...
¿sabeis si en pruebas se puede usar certificado de dispositivo?

Pero ya no tengo error 400!! :)

Un saludo,

Estoy utilizando el certificado de dispositivo para firmar el XML y el de la FNMT de empresa para su envío en el LROE y funciona bien.


La franja horaria es GMT +2. Ahora son las 15:35:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi