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)