19-02-2024
|
|
Miembro
|
|
Registrado: may 2013
Ubicación: Valencia
Posts: 51
Reputación: 12
|
|
Cita:
Empezado por ermendalenda
Yo te lo pongo pero no sé si te vas a liar más, ya que yo trabajo en Vb6 para generar el xml y despuñess las firmas y encapsulamientos soaps lo hago en php con llamadas desde curl.
En Delphi hay otras formas que los compañeros del foro seguro que te pueden guiar.
Mira el código para generar el XML (A pelo) es de esta forma:
Código:
close #92
Open "C:\xmls\" & nombre_fichero & ".xml" For Output As #92
Print #92, "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>"
Print #92, "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>"
If es_anulacion Then
Print #92, "<sum:BajaFactuSistemaFacturacion xmlns:sum=" & Chr(34) & "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" & Chr(34) & " xmlns:sum1=" & Chr(34) & "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" & Chr(34) & ">"
Else
Print #92, "<sum:AltaFactuSistemaFacturacion xmlns:sum=" & Chr(34) & "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" & Chr(34) & " xmlns:sum1=" & Chr(34) & "https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" & Chr(34) & ">"
End If
Print #92, "<sum1:Cabecera>"
Print #92, "<sum1:IDVersion>" & version_vfactu & "</sum1:IDVersion>"
Print #92, "<sum1:ObligadoEmision>"
Print #92, "<sum1:NombreRazon>" & TEXT_TO_UTF8(nombre_empresa) & "</sum1:NombreRazon>"
Print #92, "<sum1:NIF>" & nif & "</sum1:NIF>"
Print #92, "</sum1:ObligadoEmision>"
select case tipo
"anulacion"
Print #92, "<sum1:TipoRegistroAEAT>T3</sum1:TipoRegistroAEAT>"
"sustitutiva"
Print #92, "<sum1:TipoRegistroAEAT>T1</sum1:TipoRegistroAEAT>"
"normal"
Print #92, "<sum1:TipoRegistroAEAT>T0</sum1:TipoRegistroAEAT>"
end select
***Y ahora lo que voy a escribir lo voy guardando en la variable datohash para calcular el hash cuando tenga en la variable lo que necesite
datoxml = "<sum:RegistroFacturacion>"
datohash = datoxml
If es_anulacion = False Then
Print #92, "<sum:RegistroAltaFacturas>" & datoxml;
Else
Print #92, "<sum:RegistroAnulacionFacturas>" & datoxml;
End If
datoxml = "<sum1:IDFactura>"
datohash = datohash & datoxml
Print #92, datoxml;
.......
****AL FINAL CALCULO EL HASH USANDO LAS API DE WINDOWS****
*** CryptCreateHash, ¿¿¿CryptAcquireContext, etc... de la libreria "advapi32.dll"*****
huella = UCase(CreateHashString(datohash, CALG_SHA_256))
*** Inserto el hash en el xml y el resto de nodos
Print #92, "<sum1:Huella>" & huella & "</sum1:Huella>"
Print #92, "<sum1:TipoHash>01</sum1:TipoHash>"
Print #92, "</sum:DatosControl>"
If es_anulacion Then
Print #92, "</sum:RegistroAnulacionFacturas>"
Print #92, "</sum:BajaFactuSistemaFacturacion>"
Else
Print #92, "</sum:RegistroAltaFacturas>"
Print #92, "</sum:AltaFactuSistemaFacturacion>"
End If
close #92
Por otro lado puedo encapsular en php, ya que en VB6 desconozco la forma, pero en mi caso hemos pagado a una empresa la programación y el servicio de conservación y le vamos a enviar los xmls sin encapsular para que hagan toda la hilera de verificación del encadenamiento, validación schema xml-xsd, conservación, encapsulamiento, envios y control de errores, el envio lo harán con su certificado y ellos le dan este servicio a cada cliente al que le cobraremos un precio "razonable", y me libero de la parte peor. Cada cliente recibirá o podrá consultar el reporte de los envios y si hay errores se avisará y se tomará las medidas según cada caso, esto ya lo tenemos definido.
|
Gracias @ermendalenda
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
|