FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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?. |
#2
|
|||
|
|||
Cita:
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 |
#3
|
|||
|
|||
Cita:
Una pregunta, las librerias de Chilkat NO son gratuitas, ¿verdad? o ¿si? |
#4
|
|||
|
|||
Cita:
No, pero no son muy caras, para un empresa, unos 289$ licencia de por vida. Te van ha facilitar muchisimo la vida. |
#5
|
|||
|
|||
OK, muchas gracias
|
#6
|
||||
|
||||
Loados los hados del VB6
Cita:
aquí estoy .... Saludos y gracias de antemano |
#7
|
|||
|
|||
Cita:
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 |
#8
|
||||
|
||||
Disculpa, a ti no te sale este error al enviar? Me da el fichero como recibido pero me dice lo siguiente:
Código PHP:
|
#9
|
|||
|
|||
Cita:
A mí me ha dado ese error cuando no he enviado los datos en UTF8. También debes cambiar los "signature" (solo hay dos diferentes) por otros que sean distintos para cada envío, para lo que puedes usar la función generateUuid() de la clase CkCrypt2. Por ejemplo (código C++): Cita:
|
#10
|
||||
|
||||
Genial! Voy a probar, muchas gracias! Pero cómo te aseguras que lo envías con esa codificación? Porque lo tengo en el código en varios puntos y luego lo tengo adjuntado en el header de la petición. Tú cómo lo estás haciendo?
|
#11
|
||||
|
||||
De lujo compañero !!!!! muy agradecido voy ha probar
|
#12
|
||||
|
||||
Cita:
Última edición por Neftali [Germán.Estévez] fecha: 14-07-2021 a las 12:49:12. Razón: Corregir etiquetas |
#13
|
|||
|
|||
Otro problema que estoy teniendo es cuando quiero transmitir una factura de un NIF de fuera de España, que me dice el fichero no cumple el esquema XSD.
¿os ha pasado? |
#14
|
||||
|
||||
Cita:
¿Dónde la estás enviando? y ¿Qué estás enviando? (puedes poner el trozo del XML) (sección de <Destinatarios>)
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#15
|
|||
|
|||
Cita:
NOTAS: El JSON y el XML ya están creados y cargados en la variable string "jsn" y "xml" respectivamente. El certificado en un objeto del tipo CkCert llamado "Certificado. Para más claridad he quitado el control de errores. Cita:
|
#16
|
|||
|
|||
Me apunto a lo de los CRC8. Ahí va mi aportación en C++:
Código:
static const unsigned char tabla_crc8[]= { 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA,0xCD, 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 }; uchar CRC8(const unsigned char *dat) { if(dat==nullptr)return(0xff); int lng=strlen(dat); uchar crc=0; for(int cta=0;cta<lng;cta++)crc=tabla_crc8[(crc ^ dat[cta]) & 0xff]; return(crc); } |
#17
|
||||
|
||||
D E L U J O
Cita:
Muy agradecido compañero!!!! |
#18
|
|||
|
|||
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:
|
#19
|
|||
|
|||
QR en CR8.5
Cita:
Yo también uso CR8.5 para los formatos de facturas, ¿¿¿me podrias decir cómo haces para meter el QR??? Muchas gracias! |
#20
|
||||
|
||||
Mi profecia se hace realidad.
https://web.bizkaia.eus/es/web/area-...%2Fes%2Finicio Con permiso del moderador me cago en toooo |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice | newtron | Internet | 3559 | Hace 1 Día 20:02:30 |
Como utilizar la ayuda del nuevo Sistema Operativo | gluglu | Humor | 3 | 24-09-2007 09:39:05 |
Aplicacion Agencia De Viajes | ArdiIIa | Varios | 9 | 20-01-2007 16:49:53 |
El Vasco Aguirre | Al González | La Taberna | 5 | 26-05-2006 09:22:28 |
Microsoft ha lanzado su nuevo sistema operativo | DarkByte | Humor | 0 | 25-01-2004 09:21:14 |
|