Sample code for 30+ languages & platforms
Unicode C++

SII POST boleta.electronica.token

See more SII Chile Examples

Obtener un token de at autenticación para el envío y consultas automatizadas de boletas electrónicas.

Chilkat Unicode C++ Downloads

Unicode C++
#include <CkXmlW.h>
#include <CkXmlDSigGenW.h>
#include <CkCertW.h>
#include <CkStringBuilderW.h>
#include <CkHttpW.h>
#include <CkHttpResponseW.h>

void ChilkatSample(void)
    {
    bool success = false;

    //  This example assumes the Chilkat API to have been previously unlocked.
    //  See Global Unlock Sample for sample code.

    //  Create the XML to be signed...
    //  The following XML is created:
    //  
    //    <?xml version="1.0" encoding="UTF-8"?>
    //    <getToken><item><Semilla>030530912644</Semilla></item></getToken>
    //  
    CkXmlW xmlToSign;
    xmlToSign.put_Tag(L"getToken");
    xmlToSign.UpdateChildContent(L"item|Semilla",L"030530912644");

    //  Sign the XML.
    //  
    //  We wish to create the following signed XML:

    //    <?xml version="1.0" encoding="UTF-8"?>
    //    <getToken>
    //    	<item>
    //    		<Semilla>030530912644</Semilla>
    //    	</item>
    //    	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    //    		<SignedInfo>
    //    			<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">
    //    			</CanonicalizationMethod>
    //    			<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1">
    //    			</SignatureMethod>
    //    			<Reference URI="">
    //    				<Transforms>
    //    					<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature">
    //    					</Transform>
    //    				</Transforms>
    //    				<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1">
    //    				</DigestMethod>
    //    				<DigestValue>l2s9BqLppHaWo+w1Al1J5SsYScs=</DigestValue>
    //    			</Reference>
    //    		</SignedInfo>
    //    		<SignatureValue>jlbzatIIBLW8AjH++5uVTTrGIMVwGButuoAR88y/hvSc1+6/eW1K864fK3cKi76oArqk7lAM4pP okoXme0JT/hRXXGo6ecuKzO18z2WfPWwgnN0f3ac03TDu7PwfqiDG9mhQpYfIkNp6GNJIiqlg9PG2w1fOJ1QoypsrQmKq6 YU=</SignatureValue>
    //    		<KeyInfo>
    //    			<KeyValue>
    //    				<RSAKeyValue>
    //    					<Modulus>2Pb4kEB19m7NmOUYew9f36325yrTLTPMU7qzYG2A0/BsubxDdgQw2Op0x6zXvOVX sYI9KkPXtD5orKJMjwxYRv9wUWdyiE776Rv4ljfJO7EQhIK1fDQDnPt0HefBS06Xzg2QLBvLR+pe1vc6C02Dr99v+lnLA8 mnZiJlRHndhNU=</Modulus>
    //    					<Exponent>AQAB</Exponent>
    //    				</RSAKeyValue>
    //    			</KeyValue>
    //    			<X509Data>
    //    				<X509Certificate>MIIF1DCCBLygAwIBAgIDAQNtMA0GCSqGSIb3DQEBBQUAMIHGMQswCQYDVQQG
    //    EwJDTDEYMBYGA1UEChMPQWNlcHRhLmNvbSBTLkEuMTgwNgYDVQQLEy9BdXRv
    //    cmlkYWQgY2VydGlmaWNhZG9yYSBDbGFzZSAzIHBlcnNvbmEgbmF0dXJhbDFD
    //    MEEGA1UEAxM6QWNlcHRhLmNvbSBBdXRvcmlkYWQgY2VydGlmaWNhZG9yYSBD
    //    bGFzZSAzIHBlcnNvbmEgbmF0dXJhbDEeMBwGCSqGSIb3DQEJARYPaW5mb0Bh
    //    Y2VwdGEuY29tMB4XDTAxMDkyNTIxMDgxMloXDTAyMDkyNTIxMDgxMlowgZ8x
    //    CzAJBgNVBAYTAkNMMRgwFgYDVQQKEw9BY2VwdGEuY29tIFMuQS4xLDAqBgNV
    //    BAsTI0NlcnRpZmljYWRvIENsYXNlIDMgUGVyc29uYSBOYXR1cmFsMRwwGgYJ
    //    KoZIhvcNAQkBFg1uY2hlbGVAc2lpLmNsMSowKAYDVQQDEyFOSUNPTEFTIFpB
    //    UFJJQU4gQ0hFTEVCSUZTS0kgQkFFWkEwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
    //    MIGJAoGBANj2+JBAdfZuzZjlGHsPX9+t9ucq0y0zzFO6s2BtgNPwbLm8Q3YE
    //    MNjqdMes17zlV7GCPSpD17Q+aKyiTI8MWEb/cFFncohO++kb+JY3yTuxEISC
    //    tXw0A5z7dB3nwUtOl84NkCwby0fqXtb3OgtNg6/fb/pZywPJp2YiZUR53YTV
    //    AgMBAAGjggJyMIICbjAdBggrBgEEAbVrDwQRFg9BY2VwdGEuY29tIFMuQS4w
    //    JQYDVR0RBB4wHKAaBggrBgEEAcEBAaAOFgwxMC40MTEuODcxLTIwDwYIKwYB
    //    Jh0z1DR3Pl3xOiaFIjSXsQO2PSzcA3wZXYF+KDrMul8e5lAF2NNiLmMVtXEx
    //    ZykMaTGGWS0ZETDhJmBwEZGpP4+lt/JhgwF1Sb6wdrXp7MFCJUc1Tj+/5JqH
    //    1kP0E63/hVElrcP0g8Zn8Z+vr/PMGW1kKgE0IyS4iJ8eIhNSK5phFyKJUn0l
    //    BmIZX7u89d5u7X8=
    //    </X509Certificate>
    //    			</X509Data>
    //    		</KeyInfo>
    //    	</Signature>
    //    </getToken>

    CkXmlDSigGenW gen;

    gen.put_SigLocation(L"getToken");
    gen.put_SigLocationMod(0);
    gen.put_SigNamespacePrefix(L"");
    gen.put_SigNamespaceUri(L"http://www.w3.org/2000/09/xmldsig#");
    gen.put_SignedInfoCanonAlg(L"C14N");
    gen.put_SignedInfoDigestMethod(L"sha1");

    //  -------- Reference 1 --------
    gen.AddSameDocRef(L"",L"sha1",L"",L"",L"");

    //  Provide a certificate + private key. (PFX password is test123)
    CkCertW cert;
    success = cert.LoadPfxFile(L"qa_data/pfx/cert_test123.pfx",L"test123");
    if (success == false) {
        wprintf(L"%s\n",cert.lastErrorText());
        return;
    }

    gen.SetX509Cert(cert,true);

    gen.put_KeyInfoType(L"X509Data+KeyValue");
    gen.put_X509Type(L"Certificate");

    //  Load XML to be signed...
    CkStringBuilderW sbXml;
    xmlToSign.GetXmlSb(sbXml);

    gen.put_Behaviors(L"IndentedSignature");

    //  Sign the XML...
    success = gen.CreateXmlDSigSb(sbXml);
    if (success == false) {
        wprintf(L"%s\n",gen.lastErrorText());
        return;
    }

    wprintf(L"%s\n",sbXml.getAsString());

    //  Send the POST with signed XML in the request body
    CkHttpW http;

    http.SetRequestHeader(L"accept",L"application/xml");

    //  Use one of the following domains, depending on the environment:
    //  apicert.sii.cl  - Certification Environment
    //  api.sii.cl      - Production Environment
    const wchar_t *url = L"https://apicert.sii.cl/recursos/v1/boleta.electronica.token";
    CkHttpResponseW resp;
    success = http.HttpSb(L"POST",url,sbXml,L"utf-8",L"application/xml",resp);
    if (success == false) {
        wprintf(L"%s\n",http.lastErrorText());
        return;
    }

    //  Examine the response status code:
    wprintf(L"response status code = %d\n",resp.get_StatusCode());

    //  Examine the response body:
    wprintf(L"response body: %s\n",resp.bodyStr());

    //  We expect a response like this:
    //    <?xml version="1.0" encoding="UTF-8"?>
    //    <SII:RESPUESTA xmlns:SII="http://www.sii.cl/XMLSchema">
    //    	<SII:RESP_HDR>
    //    		<ESTADO>00</ESTADO>
    //    		<GLOSA>Token Creado</GLOSA>
    //    	</SII:RESP_HDR>
    //    	<SII:RESP_BODY>
    //    		<TOKEN>XAuSbYXiNh9Ik</TOKEN>
    //    	</SII:RESP_BODY>
    //    </SII:RESPUESTA>

    //  Parse the XML response.
    CkXmlW xml;
    xml.LoadXml(resp.bodyStr());
    int ESTADO = xml.GetChildIntValue(L"SII:RESP_HDR|ESTADO");
    const wchar_t *GLOSA = xml.getChildContent(L"SII:RESP_HDR|GLOSA");
    const wchar_t *TOKEN = xml.getChildContent(L"SII:RESP_BODY|TOKEN");
    }