Delphi DLL
Delphi DLL
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 Delphi DLL Downloads
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, StringBuilder, XmlDSigGen, Cert;
...
procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
gen: HCkXmlDSigGen;
cert: HCkCert;
sbXml: HCkStringBuilder;
begin
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 := CkXmlDSigGen_Create();
CkXmlDSigGen_putSigLocation(gen,'DGICFE:EnvioCFE|CFE');
CkXmlDSigGen_putSigLocationMod(gen,0);
CkXmlDSigGen_putSigNamespacePrefix(gen,'');
CkXmlDSigGen_putSigNamespaceUri(gen,'http://www.w3.org/2000/09/xmldsig#');
CkXmlDSigGen_putSignedInfoCanonAlg(gen,'C14N');
CkXmlDSigGen_putSignedInfoDigestMethod(gen,'sha1');
// -------- Reference 1 --------
CkXmlDSigGen_AddSameDocRef(gen,'','sha1','C14N','','');
// Provide a certificate + private key. (PFX password is test123)
cert := CkCert_Create();
success := CkCert_LoadPfxFile(cert,'qa_data/pfx/cert_test123.pfx','test123');
if (success <> True) then
begin
Memo1.Lines.Add(CkCert__lastErrorText(cert));
Exit;
end;
CkXmlDSigGen_SetX509Cert(gen,cert,True);
CkXmlDSigGen_putKeyInfoType(gen,'X509Data');
CkXmlDSigGen_putX509Type(gen,'IssuerSerial');
// Load XML to be signed...
sbXml := CkStringBuilder_Create();
success := CkStringBuilder_LoadFile(sbXml,'qa_data/cfe.dgi.gub.uy/sample.xml','utf-8');
if (success = False) then
begin
Memo1.Lines.Add('Failed to load input XML document.');
Exit;
end;
CkXmlDSigGen_putBehaviors(gen,'IndentedSignature,CompactSignedXml');
// Sign the XML...
success := CkXmlDSigGen_CreateXmlDSigSb(gen,sbXml);
if (success <> True) then
begin
Memo1.Lines.Add(CkXmlDSigGen__lastErrorText(gen));
Exit;
end;
// -----------------------------------------------
// Save the signed XML to a file.
success := CkStringBuilder_WriteFile(sbXml,'qa_output/signed.xml','utf-8',False);
Memo1.Lines.Add(CkStringBuilder__getAsString(sbXml));
CkXmlDSigGen_Dispose(gen);
CkCert_Dispose(cert);
CkStringBuilder_Dispose(sbXml);
end;