Tcl
Tcl
palena.sii.cl getToken SOAP Request
See more SII Chile Examples
Demonstrates how to call getToken SOAP request at palena.sii.clChilkat Tcl Downloads
load ./chilkat.dll
set success 0
# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
# Create the XML to be signed...
set xmlToSign [new_CkXml]
CkXml_put_Tag $xmlToSign "getToken"
# This is the seed obtained from palena.sii.cl getSeed
CkXml_UpdateChildContent $xmlToSign "item|Semilla" "033878794660"
set gen [new_CkXmlDSigGen]
CkXmlDSigGen_put_SigLocation $gen "getToken"
CkXmlDSigGen_put_SigLocationMod $gen 0
CkXmlDSigGen_put_SigNamespacePrefix $gen ""
CkXmlDSigGen_put_SigNamespaceUri $gen "http://www.w3.org/2000/09/xmldsig#"
CkXmlDSigGen_put_SignedInfoCanonAlg $gen "EXCL_C14N"
CkXmlDSigGen_put_SignedInfoDigestMethod $gen "sha1"
CkXmlDSigGen_AddSameDocRef $gen "" "sha1" "" "" ""
# Provide a certificate + private key. (PFX password is test123)
set cert [new_CkCert]
set success [CkCert_LoadPfxFile $cert "qa_data/pfx/cert_test123.pfx" "test123"]
if {$success == 0} then {
puts [CkCert_lastErrorText $cert]
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkCert $cert
exit
}
CkXmlDSigGen_SetX509Cert $gen $cert 1
CkXmlDSigGen_put_KeyInfoType $gen "X509Data"
CkXmlDSigGen_put_X509Type $gen "Certificate"
# Load XML to be signed...
set sbXml [new_CkStringBuilder]
CkXml_put_EmitXmlDecl $xmlToSign 0
CkXml_GetXmlSb $xmlToSign $sbXml
CkXmlDSigGen_put_Behaviors $gen "IndentedSignature"
# Sign the XML...
set success [CkXmlDSigGen_CreateXmlDSigSb $gen $sbXml]
if {$success == 0} then {
puts [CkXmlDSigGen_lastErrorText $gen]
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkCert $cert
delete_CkStringBuilder $sbXml
exit
}
# -----------------------------------------------
set http [new_CkHttp]
CkHttp_put_UncommonOptions $http "AllowEmptyHeaders"
CkHttp_SetRequestHeader $http "SOAPAction" ""
# The endpoint for this soap service is:
set endPoint "https://palena.sii.cl/DTEWS/GetTokenFromSeed.jws"
# Send the following SOAP XML
# <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:def="http://DefaultNamespace">
# <soapenv:Header/>
# <soapenv:Body>
# <def:getToken soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
# <pszXml>SIGNED_XML_GOES_HERE</pszXml>
# </def:getToken>
# </soapenv:Body>
# </soapenv:Envelope>
set xml [new_CkXml]
CkXml_put_Tag $xml "soapenv:Envelope"
CkXml_AddAttribute $xml "xmlns:xsi" "http://www.w3.org/2001/XMLSchema-instance"
CkXml_AddAttribute $xml "xmlns:xsd" "http://www.w3.org/2001/XMLSchema"
CkXml_AddAttribute $xml "xmlns:soapenv" "http://schemas.xmlsoap.org/soap/envelope/"
CkXml_AddAttribute $xml "xmlns:def" "http://DefaultNamespace"
CkXml_UpdateChildContent $xml "soapenv:Header" ""
CkXml_UpdateAttrAt $xml "soapenv:Body|def:getToken" 1 "soapenv:encodingStyle" "http://schemas.xmlsoap.org/soap/encoding/"
CkXml_UpdateChildContent $xml "soapenv:Body|def:getToken|pszXml" "SIGNED_XML_GOES_HERE"
# We must replace the "SIGNED_XML_GOES_HERE" with the exact contents of the signed XML to ensure the signed XML is not modified in any way.
set sbSoapXml [new_CkStringBuilder]
CkStringBuilder_Append $sbSoapXml [CkXml_getXml $xml]
set numReplaced [CkStringBuilder_Replace $sbXml "&" "&"]
set numReplaced [CkStringBuilder_Replace $sbXml ">" ">"]
set numReplaced [CkStringBuilder_Replace $sbXml "<" "<"]
set numReplaced [CkStringBuilder_Replace $sbXml "\"" """]
set numReplaced [CkStringBuilder_Replace $sbSoapXml "SIGNED_XML_GOES_HERE" [CkStringBuilder_getAsString $sbXml]]
set xmlStr [CkStringBuilder_getAsString $sbSoapXml]
set resp [new_CkHttpResponse]
set success [CkHttp_HttpStr $http "POST" $endPoint $xmlStr "utf-8" "text/xml" $resp]
if {$success == 0} then {
puts [CkHttp_lastErrorText $http]
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkCert $cert
delete_CkStringBuilder $sbXml
delete_CkHttp $http
delete_CkXml $xml
delete_CkStringBuilder $sbSoapXml
delete_CkHttpResponse $resp
exit
}
set responseStatusCode [CkHttpResponse_get_StatusCode $resp]
puts "Response Status Code: $responseStatusCode"
# You may examine the exact HTTP header sent with the POST like this:
puts "LastHeader:"
puts [CkHttp_lastHeader $http]
# Examine the XML returned by the web service:
puts "XML Response:"
set xmlResp [new_CkXml]
CkXml_LoadXml $xmlResp [CkHttpResponse_bodyStr $resp]
puts [CkXml_getXml $xmlResp]
# Use this online tool to generate parsing code from response XML:
# Generate Parsing Code from XML
delete_CkXml $xmlToSign
delete_CkXmlDSigGen $gen
delete_CkCert $cert
delete_CkStringBuilder $sbXml
delete_CkHttp $http
delete_CkXml $xml
delete_CkStringBuilder $sbSoapXml
delete_CkHttpResponse $resp
delete_CkXml $xmlResp