Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
palena.sii.cl getToken SOAP Request
See more SII Chile Examples
Demonstrates how to call getToken SOAP request at palena.sii.clChilkat Pascal (Lazarus/Delphi) Downloads
program ChilkatDemo;
// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}
uses
{$IFDEF UNIX}
cthreads,
{$ENDIF}
SysUtils,
CkDllLoader,
Chilkat.XmlDSigGen,
Chilkat.HttpResponse,
Chilkat.StringBuilder,
Chilkat.Cert,
Chilkat.Http,
Chilkat.Xml;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
xmlToSign: TXml;
gen: TXmlDSigGen;
cert: TCert;
sbXml: TStringBuilder;
http: THttp;
responseStatusCode: Integer;
endPoint: string;
xml: TXml;
sbSoapXml: TStringBuilder;
numReplaced: Integer;
xmlStr: string;
resp: THttpResponse;
xmlResp: TXml;
begin
success := False;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// Create the XML to be signed...
xmlToSign := TXml.Create;
xmlToSign.Tag := 'getToken';
// This is the seed obtained from palena.sii.cl getSeed
xmlToSign.UpdateChildContent('item|Semilla','033878794660');
gen := TXmlDSigGen.Create;
gen.SigLocation := 'getToken';
gen.SigLocationMod := 0;
gen.SigNamespacePrefix := '';
gen.SigNamespaceUri := 'http://www.w3.org/2000/09/xmldsig#';
gen.SignedInfoCanonAlg := 'EXCL_C14N';
gen.SignedInfoDigestMethod := 'sha1';
gen.AddSameDocRef('','sha1','','','');
// Provide a certificate + private key. (PFX password is test123)
cert := TCert.Create;
success := cert.LoadPfxFile('qa_data/pfx/cert_test123.pfx','test123');
if (success = False) then
begin
WriteLn(cert.LastErrorText);
Exit;
end;
gen.SetX509Cert(cert,True);
gen.KeyInfoType := 'X509Data';
gen.X509Type := 'Certificate';
// Load XML to be signed...
sbXml := TStringBuilder.Create;
xmlToSign.EmitXmlDecl := False;
xmlToSign.GetXmlSb(sbXml);
gen.Behaviors := 'IndentedSignature';
// Sign the XML...
success := gen.CreateXmlDSigSb(sbXml);
if (success = False) then
begin
WriteLn(gen.LastErrorText);
Exit;
end;
// -----------------------------------------------
http := THttp.Create;
http.UncommonOptions := 'AllowEmptyHeaders';
http.SetRequestHeader('SOAPAction','');
// The endpoint for this soap service is:
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>
xml := TXml.Create;
xml.Tag := 'soapenv:Envelope';
xml.AddAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
xml.AddAttribute('xmlns:xsd','http://www.w3.org/2001/XMLSchema');
xml.AddAttribute('xmlns:soapenv','http://schemas.xmlsoap.org/soap/envelope/');
xml.AddAttribute('xmlns:def','http://DefaultNamespace');
xml.UpdateChildContent('soapenv:Header','');
xml.UpdateAttrAt('soapenv:Body|def:getToken',True,'soapenv:encodingStyle','http://schemas.xmlsoap.org/soap/encoding/');
xml.UpdateChildContent('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.
sbSoapXml := TStringBuilder.Create;
sbSoapXml.Append(xml.GetXml());
numReplaced := sbXml.Replace('&','&');
numReplaced := sbXml.Replace('>','>');
numReplaced := sbXml.Replace('<','<');
numReplaced := sbXml.Replace('"','"');
numReplaced := sbSoapXml.Replace('SIGNED_XML_GOES_HERE',sbXml.GetAsString());
xmlStr := sbSoapXml.GetAsString();
resp := THttpResponse.Create;
success := http.HttpStr('POST',endPoint,xmlStr,'utf-8','text/xml',resp);
if (success = False) then
begin
WriteLn(http.LastErrorText);
Exit;
end;
responseStatusCode := resp.StatusCode;
WriteLn('Response Status Code: ' + responseStatusCode);
// You may examine the exact HTTP header sent with the POST like this:
WriteLn('LastHeader:');
WriteLn(http.LastHeader);
// Examine the XML returned by the web service:
WriteLn('XML Response:');
xmlResp := TXml.Create;
xmlResp.LoadXml(resp.BodyStr);
WriteLn(xmlResp.GetXml());
// Use this online tool to generate parsing code from response XML:
// Generate Parsing Code from XML
xmlToSign.Free;
gen.Free;
cert.Free;
sbXml.Free;
http.Free;
xml.Free;
sbSoapXml.Free;
resp.Free;
xmlResp.Free;
end;
// ---------------------------------------------------------------------------
begin
try
RunDemo;
except
on E: Exception do
WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
end;
WriteLn;
{$IFDEF MSWINDOWS}
WriteLn('Press Enter to exit...');
ReadLn;
{$ENDIF}
end.