Sample code for 30+ languages & platforms
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 C++ Downloads

C++
#include <CkXml.h>
#include <CkXmlDSigGen.h>
#include <CkCert.h>
#include <CkStringBuilder.h>
#include <CkHttp.h>
#include <CkHttpResponse.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>
    //  
    CkXml xmlToSign;
    xmlToSign.put_Tag("getToken");
    xmlToSign.UpdateChildContent("item|Semilla","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>

    CkXmlDSigGen gen;

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

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

    //  Provide a certificate + private key. (PFX password is test123)
    CkCert cert;
    success = cert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123");
    if (success == false) {
        std::cout << cert.lastErrorText() << "\r\n";
        return;
    }

    gen.SetX509Cert(cert,true);

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

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

    gen.put_Behaviors("IndentedSignature");

    //  Sign the XML...
    success = gen.CreateXmlDSigSb(sbXml);
    if (success == false) {
        std::cout << gen.lastErrorText() << "\r\n";
        return;
    }

    std::cout << sbXml.getAsString() << "\r\n";

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

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

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

    //  Examine the response status code:
    std::cout << "response status code = " << resp.get_StatusCode() << "\r\n";

    //  Examine the response body:
    std::cout << "response body: " << resp.bodyStr() << "\r\n";

    //  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.
    CkXml xml;
    xml.LoadXml(resp.bodyStr());
    int ESTADO = xml.GetChildIntValue("SII:RESP_HDR|ESTADO");
    const char *GLOSA = xml.getChildContent("SII:RESP_HDR|GLOSA");
    const char *TOKEN = xml.getChildContent("SII:RESP_BODY|TOKEN");
    }