Download the PHP package grodtech/ecf-php without Composer

On this page you can find all versions of the php package grodtech/ecf-php. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package ecf-php

grodtech/ecf-php

PHP Version PSR-4 Autoloading

SDK PHP oficial para consumir la pasarela ECF GRODTECH (facturación electrónica DGII República Dominicana).

El SDK se encarga de:

Solo servidor. Nunca incruste la API Key en aplicaciones front‑end (navegador, móvil, escritorio) ni en repositorios públicos.


Índice


Cómo encaja en tu arquitectura


Requisitos


Instalación

El paquete se distribuye dentro del repositorio de la aplicación, como path repository de Composer. En el composer.json de tu proyecto:

Si más adelante el paquete se publica en un Git privado (GitHub, GitLab, Bitbucket), basta con cambiar el bloque repositories a "type": "vcs" apuntando a la URL del repo y declarar la versión deseada.


Uso

1. Enviar un e‑CF en JSON

El SDK acepta el mismo árbol JSON que documenta DOCUMENTACION_API_ECF_GRODTECH.txt — raíz ECF para los tipos 31, 32, 33, 34, 41, 43, 44, 45, 46 y 47, raíz RFCE para el Resumen de Factura de Consumo (Tipo 32 < RD$250 000).

Los placeholders {{RNC}}, {{RAZON_SOCIAL}}, {{DIRECCION_EMISOR}} y {{FECHA_EMISION}} los reemplaza el CRM con los datos del contribuyente registrado en el portal — si los actualiza ahí, los siguientes envíos los reflejan sin tocar código. Ver sección 9 del DOCUMENTACION_API_ECF_GRODTECH.txt para la lista completa.

2. Enviar un Resumen Factura de Consumo (Tipo 32 < RD$250 000)

3. Previsualizar el XML antes de enviarlo

JsonToXml::documentFromArray() produce el XML sin firma — útil para validarlo offline contra el XSD oficial DGII v1.0 antes del POST.

4. Enviar XML ya firmado por tu propio sistema

Si tu sistema firma localmente con su propio .p12 (caso avanzado), envía el XML directamente:

5. Aprobación Comercial Electrónica (ACECF)

Cuando tu sistema acepta o rechaza un e-CF recibido de un proveedor, envía el ACECF firmado:

6. Interpretar la consulta posterior a DGII

Cuando consultes el estado por trackId directamente al endpoint consultaresultado de DGII, la respuesta cruda se normaliza así:


API del SDK

Grodtech\Ecf\Client

Validaciones del constructor (lanzan \InvalidArgumentException):

Grodtech\Ecf\JsonToXml

Grodtech\Ecf\ResultInterpreter

Grodtech\Ecf\StandardPlaceholders

Constantes para no equivocarse al construir plantillas dinámicas:

Grodtech\Ecf\GatewayRecepcionResult (DTO inmutable)

Propiedad Tipo Descripción
outcome DgiiOutcome Estado normalizado
ok bool true si la pasarela aceptó
queued bool true si se encoló por contingencia
trackId string ID DGII para consultaresultado
error ?string Mensaje de error si lo hubo
http ?int Código HTTP devuelto
curlError ?string Error de transporte cURL
raw ?array Cuerpo crudo de DGII (auditoría)
summary string Texto humano-legible

Grodtech\Ecf\DgiiConsultaResult (DTO inmutable)

Propiedad Tipo Descripción
outcome DgiiOutcome Estado normalizado
estado string estado crudo de DGII
codigo string codigo crudo de DGII
trackId string TrackId asociado
mensajesTexto list<string> Mensajes aplanados de DGII
rawBody string Cuerpo crudo (texto)
parsed ?array JSON decodificado cuando fue posible

Estados (DgiiOutcome)

Valor labelEs() Significado típico
approved Aprobado Aceptado / aprobado por la pasarela o DGII
rejected Rechazado Rechazo explícito por DGII o error de negocio
partial Parcial / condicional Aceptado con observaciones (códigos ≠ 0 en mensajes)
pending En proceso Encolado por contingencia (queued: true) o "En proceso" en consulta DGII
error Error Fallo de transporte, HTTP 5xx, cuerpo inválido, autenticación API
unknown Desconocido No clasificable; revisa raw / parsed manualmente

Endpoints cubiertos

Método del SDK Ruta HTTP Descripción
recepcionJson(array) POST /fe/recepcion/api/ecf Envía e-CF / RFCE en JSON
recepcionXml(string) POST /fe/recepcion/api/ecf Envía XML pre-generado
aprobacionComercialXml POST /fe/aprobacioncomercial/api/ecf Aprobación Comercial Electrónica (ACECF)

La verificación de conectividad y de la API Key se hace con un GET simple a /fe/autenticacion/api/autenticacion (no expuesto como método del SDK por ser trivial — un curl o file_get_contents con el header Authorization: Bearer … basta).


Entornos disponibles

Entorno URL base Uso
TestCF https://ecf.grodtech.com/TestCF Desarrollo y pruebas iniciales
CerteCF https://ecf.grodtech.com/certeCF Set de pruebas oficial DGII
eCF https://ecf.grodtech.com/eCF Producción (facturación oficial)

Cambiar de entorno = simplemente cambiar la baseUrl que pasa al Client. La pasarela detecta el entorno y enruta a la DGII correspondiente.


Seguridad

Esta sección describe el modelo de amenazas del SDK y las contramedidas integradas. Si descubre una vulnerabilidad, repórtela según SECURITY.md.

Contramedidas implementadas

Riesgo Mitigación
Man-in-the-middle (MITM) CURLOPT_SSL_VERIFYPEER = true, CURLOPT_SSL_VERIFYHOST = 2, TLS 1.2+ obligatorio
Downgrade a HTTP El constructor rechaza baseUrl no-HTTPS salvo allowInsecureHttp (reservado para tests locales)
SSRF / esquemas exóticos CURLOPT_PROTOCOLS y CURLOPT_REDIR_PROTOCOLS restringidos a HTTP/HTTPS — bloquea file://, gopher://, ftp://, etc.
Open redirect malicioso CURLOPT_MAXREDIRS = 3 y solo HTTPS en redirecciones
Fuga de API Key en var_dump / logs __debugInfo() redacta la API Key como *** REDACTED ***
Fuga de API Key en mensajes de error de transporte Los mensajes de error solo contienen el error de cURL, nunca los headers enviados
Inyección XML al convertir JSON → XML JsonToXml valida nombres de tags con regex y escapa valores con htmlspecialchars(ENT_XML1)
Negociación de protocolo HTTP/0.9 (CVE-2021-22945) User-Agent fijo, Content-Type explícito, header Expect: deshabilitado para evitar 100-continue
Hangs / deadlocks CURLOPT_TIMEOUT (total) + CURLOPT_CONNECTTIMEOUT (conexión) configurables, defaults razonables
Deserialización insegura El SDK NO usa unserialize(). Solo json_decode($body, true) (devuelve arrays, no objetos)

Lo que el SDK NO hace (responsabilidad del integrador)

Reglas de oro

  1. NUNCA ponga la API Key en JavaScript del navegador, en apps móviles, ni en repos públicos.
  2. NUNCA desactive la verificación TLS. Este SDK no lo permite, y por buena razón.
  3. NUNCA pase HTTP en baseUrl para producción. El SDK lo rechaza con InvalidArgumentException.
  4. NUNCA logee el cuerpo completo del request (puede contener PII de clientes finales). Logee trackId y outcome.
  5. NUNCA acepte input directo del usuario en el eNCF o RNC sin validar (riesgo de abuso de su cuota DGII).
  6. SIEMPRE rote la API Key si sospecha exposición; hágalo desde el panel ECF GRODTECH.
  7. SIEMPRE valide la respuesta con ResultInterpreter antes de marcar internamente el documento como “aceptado”.

Cifrado de la API Key en disco

Si por requisito operacional necesita guardar la API Key en su servidor, ciérrela con permisos restrictivos:

Lo recomendado es leerla desde una variable de entorno gestionada por el secret manager de su plataforma (Vault, AWS Secrets Manager, Doppler, GCP Secret Manager, etc.) y nunca commitearla.


Manejo de errores

Errores HTTP que devuelve la pasarela

Código Significado
200 OK — verifique ok, queued, trackId en el cuerpo
401 API Key ausente, incorrecta o revocada
403 Servicio suspendido (revise pago / plan)
404 Empresa no encontrada (API Key huérfana)
415 Cuerpo XML/JSON no válido en la recepción
422 XML rechazado por validación XSD (ver xsd_errors) o no se pudo firmar
502 Fallo de autenticación con DGII desde la pasarela
503 Falta el certificado .p12 o no es válido

Patrón de manejo recomendado


Buenas prácticas

  1. Idempotencia del eNCF: nunca reenvíe el mismo eNCF en flujos lógicos distintos. La DGII rechazará por “secuencia ya utilizada”.
  2. Aproveche TestCF y CerteCF antes de pasar a eCF. Cambiar de entorno solo requiere cambiar la baseUrl del Client.
  3. Persistencia de auditoría: la pasarela ya retiene el XML firmado y el PDF por 10 años; usted persista al menos trackId y outcome en su sistema para conciliación.
  4. Validación previa: use JsonToXml::documentFromArray() para verificar que su JSON produce un XML estructurado antes de enviarlo.
  5. Order-aware: respete el orden de las claves en el JSON. El XSD DGII v1.0 es estricto en IdDoc, Emisor, Totales, etc.
  6. Timeouts realistas: si su flujo es síncrono (web request), considere bajar timeoutSeconds a 30–60 y reintente en background con curlError.
  7. Contingencia activada en el panel: si la DGII tiene un outage, sus envíos quedarán encolados (queued: true) y se reintentarán automáticamente.

Pruebas

El paquete está diseñado para ser fácil de testear:

Para tests de integración, mocke Client con una clase que implemente la misma firma pública.


FAQ

¿Necesito firmar el XML yo mismo? No. La pasarela firma con el .p12 cargado en su portal. Solo envíe JSON (recepcionJson) y olvídese del openssl_*.

¿Qué pasa si la DGII está caída? La pasarela detecta el fallo y, si tiene contingencia activada, encola el documento (queued: true, ok: true). Luego reintenta automáticamente.

¿Cómo cambio de entorno (CerteCF → eCF)? Cambie la baseUrl que pasa al new Client(...). No hace falta reinstalar el SDK.

¿Puedo enviar múltiples e-CFs en paralelo? Sí, instancie un Client por hilo / proceso. El SDK no comparte estado mutable.

¿El SDK soporta async / corutinas? No nativamente; usa cURL síncrono. Para concurrencia masiva use ReactPHP/Amphp envolviendo el Client o haga curl_multi_* por su cuenta con los mismos endpoints.

¿Por qué JsonToXml reemplaza tags con caracteres extraños por Nodo? Es una protección anti-inyección XML: si una clave no cumple [A-Za-z_][A-Za-z0-9_.-]*, se sanea para evitar romper el XML.

¿Por qué el constructor lanza excepción si paso http://? Porque la API Key viaja en el header Authorization y un MITM podría capturarla en HTTP plano. Use HTTPS siempre. Para tests locales, pase allowInsecureHttp: true explícitamente.

¿Dónde quedan los XML firmados y PDFs? La pasarela los persiste 10 años en su panel: Panel → Archivo de Comprobantes. Puede descargar PDF o XML por cada e-CF. Si pierde el archivo en disco, el PDF se regenera bajo demanda desde el XML firmado conservado en la base.


Soporte


Licencia

Software propietario. Ver LICENSE.

Copyright © 2026 GRODTECH. Todos los derechos reservados.


All versions of ecf-php with dependencies

PHP Build Version
Package Version
Requires php Version ^8.1
ext-json Version *
ext-curl Version *
ext-openssl Version *
ext-dom Version *
ext-simplexml Version *
ext-libxml Version *
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package grodtech/ecf-php contains the following files

Loading the files please wait ...