Sample code for 30+ languages & platforms
AutoIt

Create SOAP with multiple VeriFactu Digitally Signed Registration Records

See more Verifactu Examples

Creates a SOAP message containing a multiple digitally signed invoice registration records, formatted according to the specifications for Spain's Veri*Factu system.

Chilkat AutoIt Downloads

AutoIt
Local $bSuccess = False

$bSuccess = True

;  Begin with the following SOAP XML:

;  <?xml version="1.0" encoding="utf-8"?>
;  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
;      <soapenv:Header/>
;      <soapenv:Body>
;          <sum:RegFactuSistemaFacturacion>
;              <sum:Cabecera>
;                  <sum1:ObligadoEmision>
;                      <sum1:NombreRazon>XYZ STORE SL</sum1:NombreRazon>
;                      <sum1:NIF>B99999999</sum1:NIF>
;                  </sum1:ObligadoEmision>
;                  <sum1:RemisionRequerimiento>
;                      <sum1:RefRequerimiento>3333333333</sum1:RefRequerimiento>
;                      <sum1:FinRequerimiento>S</sum1:FinRequerimiento>
;                  </sum1:RemisionRequerimiento>
;              </sum:Cabecera>
;  
;          </sum:RegFactuSistemaFacturacion>
;      </soapenv:Body>
;  </soapenv:Envelope>

$oXml = ObjCreate("Chilkat.Xml")
$oXml.Tag = "soapenv:Envelope"
$oXml.AddAttribute("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/")
$oXml.AddAttribute("xmlns:sum","https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd")
$oXml.AddAttribute("xmlns:sum1","https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd")
$oXml.AddAttribute("xmlns:xd","http://www.w3.org/2000/09/xmldsig#")
$oXml.UpdateChildContent "soapenv:Header",""
$oXml.UpdateChildContent "soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:ObligadoEmision|sum1:NombreRazon","XYZ STORE SL"
$oXml.UpdateChildContent "soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:ObligadoEmision|sum1:NIF","B99999999"
$oXml.UpdateChildContent "soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:RemisionRequerimiento|sum1:RefRequerimiento","3333333333"
$oXml.UpdateChildContent "soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:RemisionRequerimiento|sum1:FinRequerimiento","S"

;  Prior to this code, we created N signed SOAP messages, each containing a single signed record.
;  Load each of these signed SOAP messages into a StringBuilder and insert after the "</sum:Cabecera>"
;  Note: We must NOT use Chilkat.Xml for this.  We must do string operations using Chilkat StringBuilder to prevent whitespace or formatting modifications which would break the signatures.

$oSbXml = ObjCreate("Chilkat.StringBuilder")
$oXml.GetXmlSb($oSbXml)

;  ---------------------------------------------------------------------------------------------
;  Load the previously signed XML containing just one signed record.
$oSbSignedSoap = ObjCreate("Chilkat.StringBuilder")
$bSuccess = $oSbSignedSoap.LoadFile("c:/temp/qa_output/signedSoapXml1.xml","utf-8")
If ($bSuccess = False) Then
    ConsoleWrite($oSbSignedSoap.LastErrorText & @CRLF)
    Exit
EndIf

;  Remove everything before "</sum:Cabecera>", including the "</sum:Cabecera>"
$oSbSignedSoap.RemoveBefore("</sum:Cabecera>")

;  Remove everything after the "</sum:RegFactuSistemaFacturacion>", including the "</sum:RegFactuSistemaFacturacion>"
$oSbSignedSoap.RemoveAfterFinal("</sum:RegFactuSistemaFacturacion>")

;  We now have the portion of the signed SOAP xml from <sum:RegistroFactura> to </sum:RegistroFactura>
;  Insert it after the </sum:Cabecera>
$oSbSignedSoap.Prepend("</sum:Cabecera>")
$oSbXml.ReplaceFirst("</sum:Cabecera>",$oSbSignedSoap.GetAsString())

;  ---------------------------------------------------------------------------------------------
;  Add the next signed SOAP containing a single signed record.
$bSuccess = $oSbSignedSoap.LoadFile("c:/temp/qa_output/signedSoapXml2.xml","utf-8")
If ($bSuccess = False) Then
    ConsoleWrite($oSbSignedSoap.LastErrorText & @CRLF)
    Exit
EndIf

;  Remove everything before "</sum:Cabecera>", including the "</sum:Cabecera>"
$oSbSignedSoap.RemoveBefore("</sum:Cabecera>")

;  Remove everything after the "</sum:RegFactuSistemaFacturacion>", including the "</sum:RegFactuSistemaFacturacion>"
$oSbSignedSoap.RemoveAfterFinal("</sum:RegFactuSistemaFacturacion>")

;  We now have the portion of the signed SOAP xml from <sum:RegistroFactura> to </sum:RegistroFactura>
;  Insert it after the </sum:Cabecera>
$oSbSignedSoap.Prepend("</sum:Cabecera>")
$oSbXml.ReplaceFirst("</sum:Cabecera>",$oSbSignedSoap.GetAsString())

;  ---------------------------------------------------------------------------------------------
;  Continue adding more signed records if needed.

;  Save the SOAP containing multiple signed records..
$oSbXml.WriteFile("c:/temp/qa_output/soap_combined.xml","utf-8",False)