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");
    }