Configura
Elige ambiente (Test, Certification, Production), apunta a tu certificado .p12 o pásalo en base64 desde tu secret store y registra el cliente con AddDgiiEcf().
Facturación electrónica de la DGII en .NET sin pelearte con XML-DSig, semillas, tokens ni multipart. Un solo paquete para emitir, recibir y consultar comprobantes fiscales electrónicos.
> dotnet add package DgiiEcf
var firmado = dgii.SignDocument(factura); if (firmado.IsFailure) return; // El token se obtiene y se renueva solo. var envio = await dgii.SendElectronicDocumentAsync(firmado.Value); if (envio.IsFailure) { // "e-NCF duplicado", directo de la DGII log.Warn(envio.Error.Message); return; } var estado = await dgii.GetTrackStatusAsync(envio.Value.TrackId!);
app.MapPost("/fe/recepcion/api/ecf", async (HttpRequest req, IEcfReceiver r) => { var auth = r.ValidateToken(req.Headers.Authorization.ToString()); if (auth.IsFailure || auth.Value.IsExpired) return Results.Unauthorized(); var body = await new StreamReader(req.Body).ReadToEndAsync(); var archivo = r.ParseReceivedDocument(body, req.ContentType!); // Acuse de recibo (ARECF) firmado var arecf = r.BuildSignedReceiptAcknowledgement( archivo.Value.XmlContent, receiverRnc: "130862346"); return Results.Content(arecf.Value, "application/xml"); });
// Perfil DGII: C14N inclusivo, RSA-SHA256, // Reference URI="" y firma enveloped. var xmlFirmado = dgii.Sign(xml, "ECF"); // Documentos tipados con el orden del XSD var acecf = dgii.SignDocument(new Acecf { /* ... */ }); // Código de seguridad: 6 primeros caracteres del SignatureValue var codigo = EcfTools.GetSecurityCode(xmlFirmado.Value);
// e-CF 32 < RD$250,000 → RFCE firmado var ecf32 = dgii.SignDocument(facturaConsumo).Value; var rfce = dgii.CreateSignedRfce(ecf32).Value; await dgii.SendSummaryAsync(rfce.SignedXml); // URL del código QR para la representación impresa var qr = EcfTools.FcQrCodeUrl( rnc, encf, montoTotal, rfce.SecurityCode, DgiiEnvironment.Test);
Elige ambiente (Test, Certification, Production), apunta a tu certificado .p12 o pásalo en base64 desde tu secret store y registra el cliente con AddDgiiEcf().
Construye un Ecf, Rfce, Acecf, Anecf o Arecf tipado y fírmalo con el perfil exacto que exige la DGII. Sin XML a mano.
Autenticación por semilla y token renovado automáticamente. Cada operación devuelve Result<T>: los errores esperados nunca lanzan excepciones y traen los mensajes de la DGII.
Menos código de integración, cero dependencias de terceros para firmar y un solo lugar donde vive todo lo que la DGII te exige. Port fiel del paquete Node dgii-ecf, con Clean Architecture.
Todas asíncronas, todas con Result<T>. Si la DGII responde 401, se reintenta una vez con un token nuevo.
SendElectronicDocumentAsync()CreateSignedRfce() + SendSummaryAsync()SendCommercialApprovalAsync()VoidEncfAsync()GetTrackStatusAsync()InquiryStatusAsync()GetCustomerDirectoryAsync()GenerateSeed() · ValidateSignedSeed()BuildSignedReceiptAcknowledgement()SellerNet es de acceso público y sin costo. Descárgalo desde NuGet, revisa el código en GitHub y abre un issue o PR si encuentras algo que mejorar.
Proyecto independiente desarrollado y mantenido por fcastro. No está afiliado, respaldado ni mantenido por la Dirección General de Impuestos Internos (DGII).