Sample code for 30+ languages & platforms
Objective-C

palena.sii.cl getToken SOAP Request

See more SII Chile Examples

Demonstrates how to call getToken SOAP request at palena.sii.cl

Chilkat Objective-C Downloads

Objective-C
#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: @"&amp;"] intValue];
numReplaced = [[sbXml Replace: @">" replacement: @"&gt;"] intValue];
numReplaced = [[sbXml Replace: @"<" replacement: @"&lt;"] intValue];
numReplaced = [[sbXml Replace: @"\"" replacement: @"&quot;"] 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