1. Go to this page and download the library: Download ecfx/ecf-dgii-php library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ecfx / ecf-dgii-php example snippets
use Ecfx\EcfDgii\Configuration;
$config = Configuration::getDefaultConfiguration()
->setHost('https://api.test.ecfx.ssd.com.do')
->setAccessToken('your-api-key-here');
uzzleHttp\Client;
use Ecfx\EcfDgii\Configuration;
use Ecfx\EcfDgii\Api\EcfApi;
use Ecfx\EcfDgii\ApiException;
use Ecfx\EcfDgii\Model\Ecf32ECF;
use Ecfx\EcfDgii\Model\Ecf32Encabezado;
use Ecfx\EcfDgii\Model\Ecf32IdDoc;
use Ecfx\EcfDgii\Model\Ecf32Emisor;
use Ecfx\EcfDgii\Model\Ecf32Comprador;
use Ecfx\EcfDgii\Model\Ecf32Totales;
use Ecfx\EcfDgii\Model\Ecf32Item;
use Ecfx\EcfDgii\Model\Ecf32FormaDePago;
use Ecfx\EcfDgii\Model\Ecf32VersionType;
use Ecfx\EcfDgii\Model\Ecf32TipoPagoType;
use Ecfx\EcfDgii\Model\Ecf32FormaPagoType;
use Ecfx\EcfDgii\Model\Ecf32IndicadorFacturacionType;
use Ecfx\EcfDgii\Model\Ecf32IndicadorBienoServicioType;
use Ecfx\EcfDgii\Model\Ecf32TipoIngresosValidationType;
use Ecfx\EcfDgii\Model\TipoeCFType;
use Ecfx\EcfDgii\Model\IndicadorMontoGravadoType;
use Ecfx\EcfDgii\Model\UnidadMedidaType;
// 1. Configurar
$config = Configuration::getDefaultConfiguration()
->setHost('https://api.test.ecfx.ssd.com.do')
->setAccessToken(getenv('ECF_DGII_TOKEN'));
// 2. Crear el cliente API
$ecfApi = new EcfApi(new Client(), $config);
// 3. Construir el ECF 32 (Factura de Consumo)
$ecf = new Ecf32ECF([
'encabezado' => new Ecf32Encabezado([
'version' => Ecf32VersionType::VERSION1_0,
'id_doc' => new Ecf32IdDoc([
'tipoe_cf' => TipoeCFType::FACTURA_DE_CONSUMO_ELECTRONICA,
'encf' => 'E320000000019',
'indicador_monto_gravado' => IndicadorMontoGravadoType::CON_ITBIS_INCLUIDO,
'tipo_ingresos' => Ecf32TipoIngresosValidationType::_01,
'tipo_pago' => Ecf32TipoPagoType::CONTADO,
'tabla_formas_pago' => [
new Ecf32FormaDePago([
'forma_pago' => Ecf32FormaPagoType::EFECTIVO,
'monto_pago' => 590,
]),
],
]),
'emisor' => new Ecf32Emisor([
'rnc_emisor' => 'TODO_YOUR_RNC', // TODO: Reemplaza con tu RNC
'razon_social_emisor' => 'TODO_YOUR_RAZON_SOCIAL', // TODO: Reemplaza con tu razon social
'direccion_emisor' => 'TODO_YOUR_ADDRESS', // TODO: Reemplaza con tu direccion
'numero_factura_interna' => '21',
'fecha_emision' => new \DateTime('2026-03-13'),
]),
'comprador' => new Ecf32Comprador(),
'totales' => new Ecf32Totales([
'monto_gravado_total' => 500,
'monto_gravado_i1' => 500,
'itbi_s1' => 18,
'total_itbis' => 90,
'total_itbis1' => 90,
'monto_total' => 590,
'monto_periodo' => 590,
]),
]),
'detalles_items' => [
new Ecf32Item([
'numero_linea' => 1,
'indicador_facturacion' => Ecf32IndicadorFacturacionType::ITBIS1_18_PERCENT,
'nombre_item' => 'Servicio Digital',
'indicador_bieno_servicio' => Ecf32IndicadorBienoServicioType::SERVICIO,
'cantidad_item' => 1,
'unidad_medida' => UnidadMedidaType::UNIDAD,
'precio_unitario_item' => 500,
'monto_item' => 500,
]),
],
]);
// 4. Enviar el ECF
try {
$result = $ecfApi->recepcionEcf32($ecf);
echo "ECF enviado!\n";
echo "Message ID: " . $result->getMessageId() . "\n";
} catch (ApiException $e) {
echo "Error: " . $e->getMessage() . "\n";
echo "Response: " . $e->getResponseBody() . "\n";
}
$result = $service->sendEcf($ecf);
$urlQr = $result->getImpresionUrl(); // codificar como QR
$codigoSeguridad = $result->getCodSec(); // imprimir en el comprobante
$fechaFirma = $result->getFechaFirma(); // fecha de firma digital
use GuzzleHttp\Client;
use Ecfx\EcfDgii\Configuration;
use Ecfx\EcfDgii\Api\CompanyApi;
use Ecfx\EcfDgii\Api\EcfApi;
use Ecfx\EcfDgii\Api\DgiiApi;
use Ecfx\EcfDgii\Api\RecepcionApi;
use Ecfx\EcfDgii\Api\ApiKeyApi;
$config = Configuration::getDefaultConfiguration()
->setHost('https://api.prod.ecfx.ssd.com.do')
->setAccessToken('your-api-key');
$client = new Client();
// Operaciones de empresas
$companyApi = new CompanyApi($client, $config);
$companies = $companyApi->getCompanies();
$company = $companyApi->getCompanyByRnc('123456789');
// Operaciones de ECF
$ecfApi = new EcfApi($client, $config);
$response = $ecfApi->recepcionEcf31($ecf); // Factura de credito fiscal
$response = $ecfApi->recepcionEcf32($ecf); // Factura de consumo
$results = $ecfApi->searchEcfs('123456789'); // Buscar ECFs por RNC
$ecfById = $ecfApi->getEcfById('123456789', $msgId); // Obtener ECF por message ID
$ecfApi->aprobacionComercial('123456789', $encf, $acecfRequest); // Aprobacion comercial
// Consultas DGII
$dgiiApi = new DgiiApi($client, $config);
$directorio = $dgiiApi->consultaDirectorioListado('123456789');
$estado = $dgiiApi->consultaEstado('123456789', $rncEmisor, $ncf, $rncComprador, $codSeg);
$timbre = $dgiiApi->consultaTimbre('123456789', $rncEmisor, $encf, $monto, $codSeg);
$servicios = $dgiiApi->estatusServiciosObtenerEstatus('123456789');
// Seguimiento de recepcion
$recepcionApi = new RecepcionApi($client, $config);
$requests = $recepcionApi->searchEcfReceptionRequests();
use Ecfx\EcfDgii\ApiException;
use Ecfx\EcfDgii\EcfProcessingException;
use Ecfx\EcfDgii\EcfPollingTimeoutException;
try {
$result = $service->sendEcf($ecf);
} catch (EcfProcessingException $e) {
// ECF rechazado por la DGII
$response = $e->getEcfResponse();
if ($response) {
echo "Errores: " . $response->getErrors() . "\n";
}
} catch (EcfPollingTimeoutException $e) {
// El polling no obtuvo resultado a tiempo
echo "Timeout: " . $e->getMessage() . "\n";
} catch (ApiException $e) {
// Error HTTP (4xx, 5xx, red)
echo "HTTP Error: " . $e->getCode() . "\n";
echo "Body: " . $e->getResponseBody() . "\n";
}
use GuzzleHttp\Client;
use Ecfx\EcfDgii\Configuration;
use Ecfx\EcfDgii\Api\EcfApi;
use Ecfx\EcfDgii\Api\ApiKeyApi;
use Ecfx\EcfDgii\EcfService;
$config = Configuration::getDefaultConfiguration()
->setHost('https://api.prod.ecfx.ssd.com.do')
->setAccessToken(getenv('ECF_DGII_TOKEN'));
$client = new Client();
$ecfApi = new EcfApi($client, $config);
$service = new EcfService($ecfApi);
// Endpoint de facturacion — tu logica de negocio + envio a ECF SSD
// POST /api/v1/invoices
$invoice = validateAndSave($request);
$ecf = convertToEcf($invoice);
$result = $service->sendEcf($ecf);
// Retorna el messageId al cliente para que haga polling desde el frontend
return json_encode(['messageId' => $result->getMessageId(), 'encf' => $result->getEncf()]);
// Generar token de solo lectura para el cliente
// GET /api/v1/ecf-token
$apiKeyApi = new ApiKeyApi($client, $config);
$apiKey = $apiKeyApi->createApiKey($rnc);
return json_encode(['apiKey' => $apiKey->getToken()]);
bash
composer
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.