PHPackages                             amephia/sri-ec - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. amephia/sri-ec

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

amephia/sri-ec
==============

High-performance Ecuador SRI Electronic Billing Library

v2.1.0(3w ago)31.2k↑39.3%MITPHPPHP &gt;=8.2CI passing

Since Jan 28Pushed 3w agoCompare

[ Source](https://github.com/JonathanTeran/teran-sri-ec)[ Packagist](https://packagist.org/packages/amephia/sri-ec)[ Docs](https://github.com/JonathanTeran/teran-sri-ec)[ Fund](https://paypal.me/teranjona)[ RSS](/packages/amephia-sri-ec/feed)WikiDiscussions main Synced 2d ago

READMEChangelog (1)Dependencies (8)Versions (11)Used By (0)

🇪🇨 amephia/sri-ec
=================

[](#-amephiasri-ec)

[![Última Versión en Packagist](https://camo.githubusercontent.com/97329d58c8aff905ab5d4a700b816b34d0fbe87532b0ad503fbe78b3012d8243/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f616d65706869612f7372692d65632e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/amephia/sri-ec) [![Licencia de Software](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](LICENSE.md) [![Descargas Totales](https://camo.githubusercontent.com/89fe39397fc29d32a0570ab06b6082ce20c046973f6ee9c2915251affcead320/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f616d65706869612f7372692d65632e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/amephia/sri-ec) [![Versión PHP](https://camo.githubusercontent.com/79ac6c4536a3331e3d827319dd782adf525bdd6289ee5748a7023086c9ed0930/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345253344253230382e322d626c75652e7376673f7374796c653d666c61742d737175617265)](https://www.php.net/) [![Invítame un café](https://camo.githubusercontent.com/9cab399b8519716608bc07dcd1f5ab58f39a98d99d0e225b3f231e351f22fd7f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f50617950616c2d496e7625433325414474616d65253230756e2532306361662543332541392d3030343537433f7374796c653d666c61742d737175617265266c6f676f3d70617970616c266c6f676f436f6c6f723d7768697465)](https://paypal.me/teranjona)

Librería profesional y de alto rendimiento para **Facturación Electrónica del SRI Ecuador**. Simplifica el proceso de generación, firma y autorización de documentos electrónicos según los últimos requerimientos técnicos del SRI.

> ☕ **¿Te ahorró horas de trabajo?** Invítame un café en **[paypal.me/teranjona](https://paypal.me/teranjona)** — ¡gracias por apoyar el proyecto!

🆕 API 2.0 (recomendada)
-----------------------

[](#-api-20-recomendada)

A partir de la versión 2.0 la librería expone una **API tipada** basada en objetos inmutables, enums y una arquitectura de capas clara. La API de arrays (`SRI`) sigue funcionando pero está **marcada como deprecada** en favor de esta versión.

> ⚠️ **Antes de pasar a producción**, haz siempre un smoke-test completo contra el ambiente de *pruebas* del SRI (`Ambiente::Pruebas`) para verificar conectividad, certificado y datos del emisor.

### Emisión individual

[](#emisión-individual)

```
use Teran\Sri\SriClient;
use Teran\Sri\Catalogs2\Ambiente;
use Teran\Sri\Signing\CertificateLoader;
use Teran\Sri\Transport\SoapClientTransport;
use Teran\Sri\Documents\Factura;

$cert = (new CertificateLoader())->load(file_get_contents('firma.p12'), 'clave');
$sri  = new SriClient(Ambiente::Pruebas, $cert, new SoapClientTransport());

$resultado = $sri->emit(Factura::fromArray([...]), $claveAcceso);

echo $resultado->status->value; // AUTORIZADO | RECHAZADO | EN_PROCESO
```

**Firma del método:** `SriClient::emit(Factura $factura, string $claveAcceso): EmissionResult`

`EmissionResult` expone:

- `->status` — `EmissionStatus` enum (`Authorized`, `Rejected`, `InProcess`, `Error`)
- `->claveAcceso`, `->signedXml`, `->numeroAutorizacion`, `->fechaAutorizacion`, `->authorizedXml`
- `->messages` — array de `Message` con los mensajes del SRI

### Envío masivo (BatchEmitter)

[](#envío-masivo-batchemitter)

```
use Teran\Sri\Batch\BatchEmitter;
use Teran\Sri\Batch\BatchProcessor;
use Teran\Sri\Transport\SoapClientTransport;
use Teran\Sri\Catalogs2\Ambiente;

$batch = new BatchEmitter(
    new BatchProcessor(new SoapClientTransport(), Ambiente::Pruebas)
);

foreach ($firmados as [$clave, $xmlFirmado]) {
    $batch->add($clave, $xmlFirmado);
}

$batch->run();               // síncrono; re-llamable para reanudar
print_r($batch->status());   // ['AUTHORIZED' => 980, 'REJECTED' => 5, ...]
```

**Métodos de `BatchEmitter`:**

- `add(string $claveAcceso, string $signedXml): void` — idempotente por clave de acceso
- `run(int $maxPasses = 20): void` — procesa todos los pendientes; reanuda donde quedó
- `status(): array` — conteo por estado (`ComprobanteState`)
- `result(string $claveAcceso): ?BatchItem` — estado de un comprobante individual

### Transportes disponibles

[](#transportes-disponibles)

ClaseDescripción`SoapClientTransport`Usa `ext-soap` (sin dependencias extra). Recomendado para la mayoría de proyectos.`Psr18SoapTransport`Acepta cualquier cliente PSR-18 (`psr/http-client`). Ideal si ya tienes un cliente HTTP configurado (Guzzle, Symfony HttpClient, etc.).---

✨ Características Principales
-----------------------------

[](#-características-principales)

- ✅ **Firma Electrónica Universal**: Compatible con archivos `.p12` o `.pfx` de cualquier entidad certificadora del Ecuador.
- ✅ **Compatibilidad Avanzada**: Manejo robusto de cadenas de confianza (certificados intermedios) y números de serie de gran longitud.
- ✅ **Algoritmos Modernos**: Soporte dinámico para llaves RSA y ECDSA.
- ✅ **Todos los Comprobantes**: Facturas, Notas de Crédito/Débito, Retenciones y Guías de Remisión.
- ✅ **Validación XSD**: Validación local contra esquemas oficiales del SRI.
- ✅ **Cliente SOAP**: Comunicación robusta con servicios web del SRI (Recepción y Autorización).
- ✅ **Clave de Acceso**: Generación automática con algoritmo Módulo 11.
- ✅ **Validación de RUC**: Online (SRI) con fallback local.
- ✅ **Soporte de Ambientes**: `pruebas` y `produccion`.

🔐 Proveedores de Firma Soportados
---------------------------------

[](#-proveedores-de-firma-soportados)

Esta librería ha sido probada y ajustada para soportar certificados de:

- **Security Data** (soporte para nuevos números de serie largos)
- **Uanataca** (manejo correcto de cadena de confianza)
- **Banco Central del Ecuador (BCE)**
- **ANF AC Ecuador**
- **Consejo de la Judicatura**
- **Datilmedia**
- **Eclipsoft**
- Y cualquier otro proveedor que emita certificados estándar X.509 en formato PKCS#12.

📋 Tipos de Comprobantes Soportados
----------------------------------

[](#-tipos-de-comprobantes-soportados)

TipoCódigoMétodoFactura01`facturaFromArray()`Nota de Crédito04`notaCreditoFromArray()`Nota de Débito05`notaDebitoFromArray()`Guía de Remisión06`guiaRemisionFromArray()`Comprobante de Retención07`retencionFromArray()`🔄 Flujo de Trabajo
------------------

[](#-flujo-de-trabajo)

 ```
sequenceDiagram
    participant App as Tu App (PHP)
    participant Lib as amephia/sri-ec
    participant SRI_REST as SRI Online (REST)
    participant SRI_SOAP as SRI Recepción (SOAP)

    App->>Lib: 1. Enviar Datos (Array)

    rect rgb(240, 240, 240)
        Note over Lib, SRI_REST: Validación RUC
        Lib->>SRI_REST: 2. Consultar RUC (Online)
        alt RUC Existe
            SRI_REST-->>Lib: OK
        else Fallo / Timeout
            Lib->>Lib: Fallback: Algoritmo Módulo 11
        end
    end

    Lib->>Lib: 3. Generar Clave de Acceso (49 dígitos)
    Lib->>Lib: 4. Generar XML
    Lib->>Lib: 5. Validar XSD
    Lib->>Lib: 6. Firmar XML (XAdES-BES)

    Lib->>SRI_SOAP: 7. Enviar XML Firmado
    SRI_SOAP-->>Lib: 8. Confirmación de Recepción

    Lib->>SRI_SOAP: 9. Solicitar Autorización
    SRI_SOAP-->>Lib: 10. Respuesta (AUTORIZADO/NO AUTORIZADO)

    Lib-->>App: 11. Retornar Resultado
```

      Loading 🚀 Instalación
-------------

[](#-instalación)

```
composer require amephia/sri-ec
```

🛠 Requisitos
------------

[](#-requisitos)

- **PHP**: `^8.1`
- **Extensiones**: `ext-curl`, `ext-dom`, `ext-libxml`, `ext-openssl`, `ext-soap`

📖 Uso (API 1.x — deprecada)
---------------------------

[](#-uso-api-1x--deprecada)

> **Nota:** La API de arrays descrita en esta sección (`new SRI(...)`, `facturaFromArray()`, etc.) sigue funcionando pero está **deprecada**. Se eliminará en la versión 3.0. Usa la [API 2.0](#-api-20-recomendada) para proyectos nuevos.

### Configuración Básica

[](#configuración-básica)

```
use Teran\Sri\SRI;

// Inicializar en ambiente 'pruebas' o 'produccion'
$sri = new SRI('pruebas');

// Configurar tu firma digital (.p12)
$p12 = file_get_contents('ruta/a/tu/firma.p12');
$sri->setFirma($p12, 'tu_contraseña_p12');
```

### Procesar una Factura

[](#procesar-una-factura)

```
$facturaData = [
    'infoTributaria' => [
        'ambiente' => '1', // 1=Pruebas, 2=Producción
        'razonSocial' => 'MI EMPRESA S.A.',
        'ruc' => '1790011001001',
        'estab' => '001',
        'ptoEmi' => '001',
        'secuencial' => '000000001',
        'dirMatriz' => 'Quito, Ecuador',
    ],
    'infoFactura' => [
        'fechaEmision' => '26/01/2026',
        'tipoIdentificacionComprador' => '05',
        'razonSocialComprador' => 'CLIENTE FINAL',
        'identificacionComprador' => '9999999999',
        'totalSinImpuestos' => '100.00',
        'totalDescuento' => '0.00',
        'importetotal' => '112.00',
        'totalConImpuestos' => [
            ['codigo' => '2', 'codigoPorcentaje' => '2', 'baseImponible' => '100.00', 'valor' => '12.00']
        ],
        'pagos' => [
            ['formaPago' => '01', 'total' => '112.00']
        ]
    ],
    'detalles' => [
        [
            'codigoPrincipal' => 'PROD001',
            'descripcion' => 'Producto de prueba',
            'cantidad' => '1.00',
            'precioUnitario' => '100.00',
            'descuento' => '0.00',
            'precioTotalSinImpuesto' => '100.00',
            'impuestos' => [
                ['codigo' => '2', 'codigoPorcentaje' => '2', 'tarifa' => '12.00', 'baseImponible' => '100.00', 'valor' => '12.00']
            ]
        ]
    ]
];

try {
    $resultado = $sri->facturaFromArray($facturaData);

    echo "Clave de Acceso: " . $resultado['claveAcceso'] . "\n";
    echo "Estado: " . $resultado['autorizacion']->estado . "\n";

    if ($resultado['autorizacion']->estado === 'AUTORIZADO') {
        echo "Número de Autorización: " . $resultado['autorizacion']->numeroAutorizacion . "\n";
        echo "Fecha de Autorización: " . $resultado['autorizacion']->fechaAutorizacion . "\n";
    } else {
        foreach ($resultado['autorizacion']->mensajes as $mensaje) {
            echo "Error [{$mensaje->identificador}]: {$mensaje->mensaje}\n";
        }
    }
} catch (\Teran\Sri\Exceptions\ValidationException $e) {
    echo "Error de validación: " . $e->getMessage() . "\n";
    foreach ($e->getErrors() as $error) {
        echo "- $error\n";
    }
}
```

### Procesar Nota de Crédito

[](#procesar-nota-de-crédito)

```
$notaCreditoData = [
    'infoTributaria' => [
        'ambiente' => '1',
        'razonSocial' => 'MI EMPRESA S.A.',
        'ruc' => '1790011001001',
        'estab' => '001',
        'ptoEmi' => '001',
        'secuencial' => '000000001',
        'dirMatriz' => 'Quito, Ecuador',
    ],
    'infoNotaCredito' => [
        'fechaEmision' => '26/01/2026',
        'tipoIdentificacionComprador' => '05',
        'razonSocialComprador' => 'CLIENTE FINAL',
        'identificacionComprador' => '9999999999',
        'codDocModificado' => '01', // Factura
        'numDocModificado' => '001-001-000000001',
        'fechaEmisionDocSustento' => '25/01/2026',
        'totalSinImpuestos' => '50.00',
        'valorModificacion' => '56.00',
        'moneda' => 'DOLAR',
        'totalConImpuestos' => [
            ['codigo' => '2', 'codigoPorcentaje' => '2', 'baseImponible' => '50.00', 'valor' => '6.00']
        ],
        'motivo' => 'Devolución parcial de mercadería'
    ],
    'detalles' => [/* ... */]
];

$resultado = $sri->notaCreditoFromArray($notaCreditoData);
```

### Procesar Comprobante de Retención

[](#procesar-comprobante-de-retención)

```
$retencionData = [
    'infoTributaria' => [
        'ambiente' => '1',
        'razonSocial' => 'MI EMPRESA S.A.',
        'ruc' => '1790011001001',
        'estab' => '001',
        'ptoEmi' => '001',
        'secuencial' => '000000001',
        'dirMatriz' => 'Quito, Ecuador',
    ],
    'infoCompRetencion' => [
        'fechaEmision' => '26/01/2026',
        'tipoIdentificacionSujetoRetenido' => '04',
        'razonSocialSujetoRetenido' => 'PROVEEDOR S.A.',
        'identificacionSujetoRetenido' => '1790011001001',
        'periodoFiscal' => '01/2026',
    ],
    'docsSustento' => [
        [
            'codSustento' => '01',
            'codDocSustento' => '01',
            'numDocSustento' => '001-001-000000001',
            'fechaEmisionDocSustento' => '25/01/2026',
            'totalSinImpuestos' => '1000.00',
            'importeTotal' => '1120.00',
            'retenciones' => [
                [
                    'codigo' => '1', // Renta
                    'codigoRetencion' => '303',
                    'baseImponible' => '1000.00',
                    'porcentajeRetener' => '10.00',
                    'valorRetenido' => '100.00'
                ]
            ]
        ]
    ]
];

$resultado = $sri->retencionFromArray($retencionData);
```

### Consultar Estado de Autorización

[](#consultar-estado-de-autorización)

```
$claveAcceso = '2601202601179001100100110010010000000011234567811';
$autorizacion = $sri->consultarAutorizacion($claveAcceso);

if ($autorizacion->estado === 'AUTORIZADO') {
    echo "Comprobante autorizado\n";
} else {
    echo "No autorizado: " . $autorizacion->mensajes[0]->mensaje . "\n";
}
```

### Solo Firmar XML (Sin Enviar)

[](#solo-firmar-xml-sin-enviar)

```
$xmlFirmado = $sri->firmarXml($xmlSinFirma);
```

🏗 Uso Avanzado
--------------

[](#-uso-avanzado)

Para implementaciones personalizadas, puedes usar `ComprobanteInterface`:

```
use Teran\Sri\Strategies\ComprobanteInterface;

class MiDocumentoPersonalizado implements ComprobanteInterface {
    public function getTipo(): string { return '01'; }
    public function generarXml(): string { /* ... */ }
    public function getXsdPath(): string { /* ... */ }
    public function getDatosClave(): array { /* ... */ }
}

$resultado = $sri->procesar(new MiDocumentoPersonalizado());
```

📂 Estructura del Proyecto
-------------------------

[](#-estructura-del-proyecto)

```
src/
├── SRI.php                    # Clase principal
├── Generators/                # Generadores de XML
│   ├── FacturaGenerator.php
│   ├── NotaCreditoGenerator.php
│   ├── NotaDebitoGenerator.php
│   ├── RetencionGenerator.php
│   └── GuiaRemisionGenerator.php
├── Signature/
│   └── XadesSignature.php     # Firma XAdES-BES
├── Soap/
│   └── SriSoapClient.php      # Cliente SOAP
├── Schema/
│   ├── XsdValidator.php
│   └── BusinessValidator.php
├── Dto/
│   ├── RecepcionResponse.php
│   ├── AutorizacionResponse.php
│   └── Mensaje.php
├── Utils/
│   ├── ClaveAcceso.php        # Generador Módulo 11
│   └── RucValidator.php
└── Exceptions/
    └── SriException.php

```

🔐 Estructura de Firma XAdES-BES
-------------------------------

[](#-estructura-de-firma-xades-bes)

La firma digital cumple con el estándar XAdES-BES requerido por el SRI:

```

        ...
        ...
        ...

    ...

            ...

                ...
                ...

                    ...

                            ...
                            ...

                        Comprobante electrónico
                        text/xml
                        UTF-8

```

🔧 Troubleshooting
-----------------

[](#-troubleshooting)

### Error: "Could not read p12 file" o "error:0308010C:digital envelope routines::unsupported"

[](#error-could-not-read-p12-file-o-error0308010cdigital-envelope-routinesunsupported)

**Causa**: Certificados P12 legacy (pre-2024) usan algoritmos de cifrado RC2/3DES que OpenSSL 3.0+ rechaza por defecto.

**Solución**: Esta librería automáticamente usa OpenSSL 1.1 cuando está disponible. En macOS con Homebrew:

```
brew install openssl@1.1
```

La librería detectará automáticamente la instalación y la usará para certificados legacy.

### Error: "FECHA EMISIÓN EXTEMPORÁNEA"

[](#error-fecha-emisión-extemporánea)

**Causa**: El SRI rechaza facturas con fechas que no coinciden con la fecha/hora actual del servidor SRI.

**Solución**:

1. Generar y enviar la factura inmediatamente (no guardar para enviar después)
2. Usar la zona horaria de Ecuador: `America/Guayaquil`
3. Formato de fecha correcto: `dd/MM/yyyy` (ej: `01/02/2026`)

```
// Correcto
date_default_timezone_set('America/Guayaquil');
$fecha = date('d/m/Y'); // Fecha actual en Ecuador
```

### Error: "Class 'Teran\\Sri\\Exceptions\\SignatureException' not found"

[](#error-class-teransriexceptionssignatureexception-not-found)

**Causa**: Problema de autoloading (solo en versiones antiguas del paquete).

**Solución**: Actualizar a la última versión:

```
composer update amephia/sri-ec
```

### Error: "No matching global element declaration available"

[](#error-no-matching-global-element-declaration-available)

**Causa**: XSD con validación strict para firma digital (solo en versiones antiguas).

**Solución**: Actualizar a la última versión que incluye XSD con `processContents="lax"`.

### Certificados Soportados

[](#certificados-soportados)

✅ **Funcionan correctamente**:

- Certificados legacy (2020-2024) con OpenSSL 1.1
- Certificados modernos (2025+) con OpenSSL 3.0+
- Todos los proveedores ecuatorianos (Uanataca, Security Data, BCE, ANF AC, etc.)

🤝 Contribuir
------------

[](#-contribuir)

¡Las contribuciones son bienvenidas! No dudes en enviar un Pull Request.

📄 Licencia
----------

[](#-licencia)

Licencia MIT. Por favor consulta el [Archivo de Licencia](LICENSE.md) para más información.

---

Desarrollado con ❤️ por [Jonathan Terán](https://github.com/jonathanteran)

###  Health Score

47

—

FairBetter than 93% of packages

Maintenance95

Actively maintained with recent releases

Popularity23

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~16 days

Recently: every ~1 days

Total

9

Last Release

23d ago

Major Versions

v1.1.2 → v2.0.02026-06-05

PHP version history (2 changes)v1.0.0PHP &gt;=8.1

v2.0.0PHP &gt;=8.2

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/22844344?v=4)[Jonathan Teran](/maintainers/JonathanTeran)[@JonathanTeran](https://github.com/JonathanTeran)

---

Top Contributors

[![JonathanTeran](https://avatars.githubusercontent.com/u/22844344?v=4)](https://github.com/JonathanTeran "JonathanTeran (1 commits)")

---

Tags

facturacion-electronicasrixadese-invoicingecuadorfacturacomprobantes-electronicos

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/amephia-sri-ec/health.svg)

```
[![Health](https://phpackages.com/badges/amephia-sri-ec/health.svg)](https://phpackages.com/packages/amephia-sri-ec)
```

###  Alternatives

[tempest/framework

The PHP framework that gets out of your way.

2.2k34.4k15](/packages/tempest-framework)[flow-php/flow

PHP ETL - Extract Transform Load - Data processing framework

85036.3k](/packages/flow-php-flow)[cakephp/cakephp

The CakePHP framework

8.9k19.5M1.8k](/packages/cakephp-cakephp)[drupal/core-recommended

Locked core dependencies; require this project INSTEAD OF drupal/core.

6942.5M420](/packages/drupal-core-recommended)[typo3/cms

TYPO3 CMS is a free open source Content Management Framework initially created by Kasper Skaarhoj and licensed under GNU/GPL.

1.2k1.9M122](/packages/typo3-cms)[civicrm/civicrm-core

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

751291.4k43](/packages/civicrm-civicrm-core)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
