Go
Go
Create sii.cl Factura Electrónica (Chile Servicio de Impuestos Internos)
See more XAdES Examples
Demonstrates how to sign an XML invoice according to Chilean Internal Revenue Service regulations.Chilkat Go Downloads
success := false
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// See: Apply 2nd Signature to sii.cl Factura Electr�nica (Chile Servicio de Impuestos Internos)
// for an example showing how to apply a 2nd signature.
// We want to sign XML that looks like the following:
// <?xml version="1.0" encoding="iso-8859-1"?>
// <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte">
// <Documento ID="F13T34">
// <Encabezado>
// <IdDoc>
// <TipoDTE>34</TipoDTE>
// <Folio>13</Folio>
// <FchEmis>2020-07-17</FchEmis>
// <FmaPago>1</FmaPago>
// <FchVenc>2020-07-17</FchVenc>
// </IdDoc>
// <Emisor>
// <RUTEmisor>...</RUTEmisor>
// <RznSoc>...</RznSoc>
// <GiroEmis>...</GiroEmis>
// <Acteco>...</Acteco>
// <DirOrigen>...</DirOrigen>
// <CmnaOrigen>...</CmnaOrigen>
// <CiudadOrigen>...</CiudadOrigen>
// </Emisor>
// <Receptor>
// <RUTRecep>...</RUTRecep>
// <RznSocRecep>...</RznSocRecep>
// <GiroRecep>...</GiroRecep>
// <Contacto/>
// <DirRecep>...</DirRecep>
// <CmnaRecep>...</CmnaRecep>
// <CiudadRecep>...</CiudadRecep>
// </Receptor>
// <Totales>
// <MntExe>14999</MntExe>
// <MntTotal>14999</MntTotal>
// </Totales>
// </Encabezado>
// <Detalle>
// <NroLinDet>1</NroLinDet>
// <CdgItem>
// <TpoCodigo>INT</TpoCodigo>
// <VlrCodigo>1</VlrCodigo>
// </CdgItem>
// <NmbItem>Atenci�n profesional mes de Junio 2020</NmbItem>
// <QtyItem>1</QtyItem>
// <UnmdItem>UNI</UnmdItem>
// <PrcItem>14999</PrcItem>
// <MontoItem>14999</MontoItem>
// </Detalle>
// <TED version="1.0">
// <DD>
// <RE>99972220-K</RE>
// <TD>34</TD>
// <F>13</F>
// <FE>2020-07-17</FE>
// <RR>99942999-2</RR>
// <RSR>...</RSR>
// <MNT>14999</MNT>
// <IT1>Atencion profesional mes de Junio 2020</IT1>
// <CAF version="1.0">
// <DA>
// <RE>99972220-K</RE>
// <RS>...</RS>
// <TD>34</TD>
// <RNG>
// <D>3</D>
// <H>12</H>
// </RNG>
// <FA>2019-10-10</FA>
// <RSAPK>
// <M>2zHVYpcVNQRvS2yFuqdrh...TEQZx/m0t9HVTgWKZvlc6LSQ==</M>
// <E>Aw==</E>
// </RSAPK>
// <IDK>300</IDK>
// </DA>
// <FRMA algoritmo="SHA1withRSA">LaVkjISGu...sBtsQL1jR9lw==</FRMA>
// </CAF>
// <TSTED>2020-07-17T13:19:10</TSTED>
// </DD>
// <FRMT algoritmo="SHA1withRSA">LxZr6zmXRZIfTz7...IXS6sp4vfz2fIsA==</FRMT>
// </TED>
// <TmstFirma>2020-07-17T13:19:10</TmstFirma>
// </Documento>
// </DTE>
success = true
gen := chilkat.NewXmlDSigGen()
gen.SetSigLocation("DTE")
gen.SetSigLocationMod(0)
gen.SetSigNamespacePrefix("")
gen.SetSigNamespaceUri("http://www.w3.org/2000/09/xmldsig#")
gen.SetSignedInfoCanonAlg("C14N")
gen.SetSignedInfoDigestMethod("sha1")
// -------- Reference 1 --------
gen.AddSameDocRef("F13T34","sha1","","","")
// Provide a certificate + private key. (PFX password is test123)
cert := chilkat.NewCert()
success = cert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123")
if success != true {
fmt.Println(cert.LastErrorText())
gen.DisposeXmlDSigGen()
cert.DisposeCert()
return
}
gen.SetX509Cert(cert,true)
gen.SetKeyInfoType("X509Data+KeyValue")
gen.SetX509Type("Certificate")
// Load XML to be signed...
sbXml := chilkat.NewStringBuilder()
success = sbXml.LoadFile("qa_data/xml_dsig/sii_cl/xmlToSign.xml","iso-8859-1")
if success == false {
fmt.Println("Failed to load XML file.")
gen.DisposeXmlDSigGen()
cert.DisposeCert()
sbXml.DisposeStringBuilder()
return
}
gen.SetBehaviors("IndentedSignature")
// Sign the XML...
success = gen.CreateXmlDSigSb(sbXml)
if success != true {
fmt.Println(gen.LastErrorText())
gen.DisposeXmlDSigGen()
cert.DisposeCert()
sbXml.DisposeStringBuilder()
return
}
// -----------------------------------------------
// Save the signed XML to a file.
success = sbXml.WriteFile("qa_data/xml_dsig/sii_cl/signed1.xml","iso-8859-1",false)
fmt.Println(*sbXml.GetAsString())
// ----------------------------------------
// Verify the signatures we just produced...
verifier := chilkat.NewXmlDSig()
success = verifier.LoadSignatureSb(sbXml)
if success != true {
fmt.Println(verifier.LastErrorText())
gen.DisposeXmlDSigGen()
cert.DisposeCert()
sbXml.DisposeStringBuilder()
verifier.DisposeXmlDSig()
return
}
numSigs := verifier.NumSignatures()
verifyIdx := 0
for verifyIdx < numSigs {
verifier.SetSelector(verifyIdx)
verified := verifier.VerifySignature(true)
if verified != true {
fmt.Println(verifier.LastErrorText())
gen.DisposeXmlDSigGen()
cert.DisposeCert()
sbXml.DisposeStringBuilder()
verifier.DisposeXmlDSig()
return
}
verifyIdx = verifyIdx + 1
}
fmt.Println("All signatures were successfully verified.")
gen.DisposeXmlDSigGen()
cert.DisposeCert()
sbXml.DisposeStringBuilder()
verifier.DisposeXmlDSig()