Objective-C
Objective-C
palena.sii.cl getToken SOAP Request
See more SII Chile Examples
Demonstrates how to call getToken SOAP request at palena.sii.clChilkat Objective-C Downloads
#import <CkoXml.h>
#import <CkoXmlDSigGen.h>
#import <CkoCert.h>
#import <CkoStringBuilder.h>
#import <CkoHttp.h>
#import <NSString.h>
#import <CkoHttpResponse.h>
BOOL success = NO;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// Create the XML to be signed...
CkoXml *xmlToSign = [[CkoXml alloc] init];
xmlToSign.Tag = @"getToken";
// This is the seed obtained from palena.sii.cl getSeed
[xmlToSign UpdateChildContent: @"item|Semilla" value: @"033878794660"];
CkoXmlDSigGen *gen = [[CkoXmlDSigGen alloc] init];
gen.SigLocation = @"getToken";
gen.SigLocationMod = [NSNumber numberWithInt:0];
gen.SigNamespacePrefix = @"";
gen.SigNamespaceUri = @"http://www.w3.org/2000/09/xmldsig#";
gen.SignedInfoCanonAlg = @"EXCL_C14N";
gen.SignedInfoDigestMethod = @"sha1";
[gen AddSameDocRef: @"" digestMethod: @"sha1" canonMethod: @"" prefixList: @"" refType: @""];
// Provide a certificate + private key. (PFX password is test123)
CkoCert *cert = [[CkoCert alloc] init];
success = [cert LoadPfxFile: @"qa_data/pfx/cert_test123.pfx" password: @"test123"];
if (success == NO) {
NSLog(@"%@",cert.LastErrorText);
return;
}
[gen SetX509Cert: cert usePrivateKey: YES];
gen.KeyInfoType = @"X509Data";
gen.X509Type = @"Certificate";
// Load XML to be signed...
CkoStringBuilder *sbXml = [[CkoStringBuilder alloc] init];
xmlToSign.EmitXmlDecl = NO;
[xmlToSign GetXmlSb: sbXml];
gen.Behaviors = @"IndentedSignature";
// Sign the XML...
success = [gen CreateXmlDSigSb: sbXml];
if (success == NO) {
NSLog(@"%@",gen.LastErrorText);
return;
}
// -----------------------------------------------
CkoHttp *http = [[CkoHttp alloc] init];
int responseStatusCode;
http.UncommonOptions = @"AllowEmptyHeaders";
[http SetRequestHeader: @"SOAPAction" value: @""];
// The endpoint for this soap service is:
NSString *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>
CkoXml *xml = [[CkoXml alloc] init];
xml.Tag = @"soapenv:Envelope";
[xml AddAttribute: @"xmlns:xsi" value: @"http://www.w3.org/2001/XMLSchema-instance"];
[xml AddAttribute: @"xmlns:xsd" value: @"http://www.w3.org/2001/XMLSchema"];
[xml AddAttribute: @"xmlns:soapenv" value: @"http://schemas.xmlsoap.org/soap/envelope/"];
[xml AddAttribute: @"xmlns:def" value: @"http://DefaultNamespace"];
[xml UpdateChildContent: @"soapenv:Header" value: @""];
[xml UpdateAttrAt: @"soapenv:Body|def:getToken" autoCreate: YES attrName: @"soapenv:encodingStyle" attrValue: @"http://schemas.xmlsoap.org/soap/encoding/"];
[xml UpdateChildContent: @"soapenv:Body|def:getToken|pszXml" value: @"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.
CkoStringBuilder *sbSoapXml = [[CkoStringBuilder alloc] init];
[sbSoapXml Append: [xml GetXml]];
int numReplaced = [[sbXml Replace: @"&" replacement: @"&"] intValue];
numReplaced = [[sbXml Replace: @">" replacement: @">"] intValue];
numReplaced = [[sbXml Replace: @"<" replacement: @"<"] intValue];
numReplaced = [[sbXml Replace: @"\"" replacement: @"""] intValue];
numReplaced = [[sbSoapXml Replace: @"SIGNED_XML_GOES_HERE" replacement: [sbXml GetAsString]] intValue];
NSString *xmlStr = [sbSoapXml GetAsString];
CkoHttpResponse *resp = [[CkoHttpResponse alloc] init];
success = [http HttpStr: @"POST" url: endPoint bodyStr: xmlStr charset: @"utf-8" contentType: @"text/xml" response: resp];
if (success == NO) {
NSLog(@"%@",http.LastErrorText);
return;
}
responseStatusCode = [resp.StatusCode intValue];
NSLog(@"%@%d",@"Response Status Code: ",responseStatusCode);
// You may examine the exact HTTP header sent with the POST like this:
NSLog(@"%@",@"LastHeader:");
NSLog(@"%@",http.LastHeader);
// Examine the XML returned by the web service:
NSLog(@"%@",@"XML Response:");
CkoXml *xmlResp = [[CkoXml alloc] init];
[xmlResp LoadXml: resp.BodyStr];
NSLog(@"%@",[xmlResp GetXml]);
// Use this online tool to generate parsing code from response XML:
// Generate Parsing Code from XML