Chilkat2-Python
Chilkat2-Python
Sign XML for eFactura DGI Uruguay (cfe.dgi.gub.uy)
See more XAdES Examples
Demonstrates how to sign XML for eFactura DGI (Uruguay, cfe.dgi.gub.uy).Chilkat Chilkat2-Python Downloads
import sys
import chilkat2
success = False
# This example assumes the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
success = True
# <?xml version="1.0" encoding="utf-8"?>
# <DGICFE:EnvioCFE version="1.0" xsi:schemaLocation="http://cfe.dgi.gub.uy EnvioCFE_v1.30.xsd" xmlns:DGICFE="http://cfe.dgi.gub.uy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
# <DGICFE:Caratula version="1.0">
# <DGICFE:RutReceptor>...</DGICFE:RutReceptor>
# <DGICFE:RUCEmisor>...</DGICFE:RUCEmisor>
# <DGICFE:Idemisor>...</DGICFE:Idemisor>
# <DGICFE:CantCFE>1</DGICFE:CantCFE>
# <DGICFE:Fecha>2020-07-29T08:24:34-03:00</DGICFE:Fecha>
# <DGICFE:X509Certificate>MIIGc...UJwsTEnI
# </DGICFE:X509Certificate>
# </DGICFE:Caratula>
# <CFE xmlns="http://cfe.dgi.gub.uy" version="1.0">
# <eFact>
# <TmstFirma>2020-07-21T12:34:01-03:00</TmstFirma>
# <Encabezado>
# <IdDoc>
# <TipoCFE>111</TipoCFE>
# <Serie>A</Serie>
# <Nro>...</Nro>
# <FchEmis>2020-07-21</FchEmis>
# <FmaPago>2</FmaPago>
# <FchVenc>2020-09-19</FchVenc>
# </IdDoc>
# <Emisor>
# <RUCEmisor>...</RUCEmisor>
# <RznSoc>...</RznSoc>
# <NomComercial>...</NomComercial>
# <GiroEmis>...</GiroEmis>
# <Telefono>(598)...</Telefono>
# <Telefono>(598)...</Telefono>
# <CorreoEmisor>...</CorreoEmisor>
# <EmiSucursal>...</EmiSucursal>
# <CdgDGISucur>7</CdgDGISucur>
# <DomFiscal>...</DomFiscal>
# <Ciudad>Montevideo</Ciudad>
# <Departamento>Montevideo</Departamento>
# </Emisor>
# <Receptor>
# <TipoDocRecep>2</TipoDocRecep>
# <CodPaisRecep>UY</CodPaisRecep>
# <DocRecep>...</DocRecep>
# <RznSocRecep>...</RznSocRecep>
# <DirRecep>...</DirRecep>
# <CiudadRecep>...</CiudadRecep>
# <DeptoRecep>...</DeptoRecep>
# <PaisRecep/>
# <CP>...</CP>
# <InfoAdicional/>
# <LugarDestEnt>...</LugarDestEnt>
# <CompraID>...</CompraID>
# </Receptor>
# <Totales>
# <TpoMoneda>UYU</TpoMoneda>
# <MntNoGrv>0.00</MntNoGrv>
# <MntExpoyAsim>0.00</MntExpoyAsim>
# <MntImpuestoPerc>0.00</MntImpuestoPerc>
# <MntIVaenSusp>0.00</MntIVaenSusp>
# <MntNetoIvaTasaMin>2701.71</MntNetoIvaTasaMin>
# <MntNetoIVATasaBasica>0.00</MntNetoIVATasaBasica>
# <MntNetoIVAOtra>0.00</MntNetoIVAOtra>
# <IVATasaMin>10.00</IVATasaMin>
# <IVATasaBasica>22.00</IVATasaBasica>
# <MntIVATasaMin>270.17</MntIVATasaMin>
# <MntIVATasaBasica>0.00</MntIVATasaBasica>
# <MntIVAOtra>0.00</MntIVAOtra>
# <MntTotal>2971.88</MntTotal>
# <MntTotRetenido>0.00</MntTotRetenido>
# <CantLinDet>1</CantLinDet>
# <MontoNF>0.11</MontoNF>
# <MntPagar>2971.99</MntPagar>
# </Totales>
# </Encabezado>
# <Detalle>
# <Item>
# <NroLinDet>1</NroLinDet>
# <IndFact>2</IndFact>
# <NomItem>...</NomItem>
# <DscItem>...</DscItem>
# <Cantidad>4.000</Cantidad>
# <UniMed/>
# <PrecioUnitario>662.185000</PrecioUnitario>
# <DescuentoPct>0.000</DescuentoPct>
# <DescuentoMonto>0.00</DescuentoMonto>
# <RecargoPct>2.000</RecargoPct>
# <RecargoMnt>52.97</RecargoMnt>
# <MontoItem>2701.71</MontoItem>
# </Item>
# </Detalle>
# <CAEData>
# <CAE_ID>90200658285</CAE_ID>
# <DNro>1015000</DNro>
# <HNro>1016999</HNro>
# <FecVenc>2022-05-07</FecVenc>
# </CAEData>
# </eFact>
# </CFE>
# </DGICFE:EnvioCFE>
gen = chilkat2.XmlDSigGen()
gen.SigLocation = "DGICFE:EnvioCFE|CFE"
gen.SigLocationMod = 0
gen.SigNamespacePrefix = ""
gen.SigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#"
gen.SignedInfoCanonAlg = "C14N"
gen.SignedInfoDigestMethod = "sha1"
# -------- Reference 1 --------
gen.AddSameDocRef("","sha1","C14N","","")
# Provide a certificate + private key. (PFX password is test123)
cert = chilkat2.Cert()
success = cert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123")
if (success != True):
print(cert.LastErrorText)
sys.exit()
gen.SetX509Cert(cert,True)
gen.KeyInfoType = "X509Data"
gen.X509Type = "IssuerSerial"
# Load XML to be signed...
sbXml = chilkat2.StringBuilder()
success = sbXml.LoadFile("qa_data/cfe.dgi.gub.uy/sample.xml","utf-8")
if (success == False):
print("Failed to load input XML document.")
sys.exit()
gen.Behaviors = "IndentedSignature,CompactSignedXml"
# Sign the XML...
success = gen.CreateXmlDSigSb(sbXml)
if (success != True):
print(gen.LastErrorText)
sys.exit()
# -----------------------------------------------
# Save the signed XML to a file.
success = sbXml.WriteFile("qa_output/signed.xml","utf-8",False)
print(sbXml.GetAsString())