Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loGen
LOCAL loCert
LOCAL loSbXml

lnSuccess = 0

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

lnSuccess = 1

* <?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>

loGen = CreateObject('Chilkat.XmlDSigGen')

loGen.SigLocation = "DGICFE:EnvioCFE|CFE"
loGen.SigLocationMod = 0
loGen.SigNamespacePrefix = ""
loGen.SigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#"
loGen.SignedInfoCanonAlg = "C14N"
loGen.SignedInfoDigestMethod = "sha1"

* -------- Reference 1 --------
loGen.AddSameDocRef("","sha1","C14N","","")

* Provide a certificate + private key. (PFX password is test123)
loCert = CreateObject('Chilkat.Cert')
lnSuccess = loCert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123")
IF (lnSuccess <> 1) THEN
    ? loCert.LastErrorText
    RELEASE loGen
    RELEASE loCert
    CANCEL
ENDIF

loGen.SetX509Cert(loCert,1)

loGen.KeyInfoType = "X509Data"
loGen.X509Type = "IssuerSerial"

* Load XML to be signed...
loSbXml = CreateObject('Chilkat.StringBuilder')
lnSuccess = loSbXml.LoadFile("qa_data/cfe.dgi.gub.uy/sample.xml","utf-8")
IF (lnSuccess = 0) THEN
    ? "Failed to load input XML document."
    RELEASE loGen
    RELEASE loCert
    RELEASE loSbXml
    CANCEL
ENDIF

loGen.Behaviors = "IndentedSignature,CompactSignedXml"

* Sign the XML...
lnSuccess = loGen.CreateXmlDSigSb(loSbXml)
IF (lnSuccess <> 1) THEN
    ? loGen.LastErrorText
    RELEASE loGen
    RELEASE loCert
    RELEASE loSbXml
    CANCEL
ENDIF

* -----------------------------------------------

* Save the signed XML to a file.
lnSuccess = loSbXml.WriteFile("qa_output/signed.xml","utf-8",0)

? loSbXml.GetAsString()

RELEASE loGen
RELEASE loCert
RELEASE loSbXml