Firma. Envía. Cumple.

Paquete NuGet DgiiEcf .NET 8 + .NET 10 Licencia MIT e-CF · DGII · República Dominicana por fcastro

Gratis. Abierto.
Listo para producción.

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
Descubre más

Funciona
con

.NET 8 LTS.NET 10 LTSASP.NET CoreMinimal APIsWorker ServicesAzure FunctionsDockerTesteCFCerteCFeCF Producción

Todo el ciclo del e-CF en un solo paquete.

FacturacionService.cs
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);
SellerNet no cambia tu arquitectura. Se conecta a ella.
01appsettings.json

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().

02XML-DSig

Firma

Construye un Ecf, Rfce, Acecf, Anecf o Arecf tipado y fírmalo con el perfil exacto que exige la DGII. Sin XML a mano.

03Result<T>

Envía

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.

El efecto SellerNet

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.

0paqueteemisor, receptor, firma, consultas y herramientas
0documentos tipados con el orden del XSD
0ambientes DGII: TesteCF, CerteCF y eCF

Operaciones
disponibles

Todas asíncronas, todas con Result<T>. Si la DGII responde 401, se reintenta una vez con un token nuevo.

Ver documentación
Emisor

Enviar e-CF

SendElectronicDocumentAsync()
Emisor

Factura de consumo (RFCE)

CreateSignedRfce() + SendSummaryAsync()
Emisor

Aprobación comercial

SendCommercialApprovalAsync()
Emisor

Anulación de secuencias

VoidEncfAsync()
Consulta

Estado por trackId

GetTrackStatusAsync()
Consulta

Estado de un e-CF

InquiryStatusAsync()
Consulta

Directorio de facturadores

GetCustomerDirectoryAsync()
Receptor

Semilla y token JWT

GenerateSeed() · ValidateSignedSeed()
Receptor

Acuse de recibo

BuildSignedReceiptAcknowledgement()

Instálalo.
Úsalo.
Contribuye.

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).