PHPackages                             gmlo89/cfdi - 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. gmlo89/cfdi

ActiveLibrary

gmlo89/cfdi
===========

CFDI 3.3 México / Laravel

51514PHP

Since Sep 3Pushed 6y agoCompare

[ Source](https://github.com/gmlo89/CFDI)[ Packagist](https://packagist.org/packages/gmlo89/cfdi)[ RSS](/packages/gmlo89-cfdi/feed)WikiDiscussions master Synced yesterday

READMEChangelogDependenciesVersions (1)Used By (0)

CFDI 3.3 / Laravel
==================

[](#cfdi-33--laravel)

EN DESARROLLO
-------------

[](#en-desarrollo)

**IMPORTANTE** este componente se encuentra en desarrollo y probablemente tenga cambios severos.

Si utilizas los servicios de Finkok para timbrado, talvez te puede servir

> Nota: Para poder generar los CFDIs es necesario contar con el certificado de sello digital o CSD (los archivos .cer y .key), ademas de conocer la contraseña de la llave privada.

### Instalación

[](#instalación)

Ejecutar en la terminal:

```
composer require gmlo89/cfdi
```

Agregar el Service Provider en `config/app.php`

```
use Gmlo\CFDI\CFDIServiceProvider;
...
    'providers' => [
        ...
        CFDIServiceProvider:class,
    ],
...
```

### Crear archivos .cer.pem y .key.pem

[](#crear-archivos-cerpem-y-keypem)

Con ayuda de la clase `Gmlo\CFDI\OpenSSL` podemos generar los archivos .pem. El metodo `generatePemFiles(..)` ademas valida que los certificados esten vigentes y concuerden con el RFC y contraseña proporcionada.

```
$openssl = new OpenSSL('ruta/al_archivo/.cer', 'ruta/al_archivo/.key', 'RFC del emisor', 'Contraseña');
$openssl->generatePemFiles('directorio/donde_se_guardaran_los_archivos/.cer.pem_y_.key.pem');
//Ruta del archivo .cer.pem
echo $openssl->cer_pem_path;
//Ruta del archivo .key.pem
echo $openssl->key_pem_path;
//Número del certificado.
echo $openssl->getCertificateSerialNumber();
//Fecha de inicio del periodo de validez del certificado.
echo $openssl->start_date;
//Fecha de fin del periodo de validez del certificado.
echo $openssl->end_date;
```

### Generar una factura de venta

[](#generar-una-factura-de-venta)

```
$invoice = new \Gmlo\CFDI\Invoice([
    'pay_way' => 99,
    'pay_method' => 'PUE',
    'zip_code' => '23000',
    'serie' => 'A',
    'folio' => 123,
    'cert_number' => '20001000000300022762',
    'currency' => 'MXN',
    //'exchange_rate' => 20, (Opcional para otras monedas)
]);
// Asignamos los certificados
$invoice->setKeyPath('/path/to/key_file');
$invoice->setCerPath('/Path/to/cer_file');

// Empresa que factura
$invoice->setTransmitter(new Transmitter([
    'rfc' => 'TU-RFC',
    'name' => 'Razón social',
    'tax_regime' => '601', //Regimen fiscal
]));

// datos del cliente
$invoice->setReceiver(new Receiver([
    'rfc' => 'RFC del cliente',
    'name' => 'Razón social del cliente',
    'how_use' => 'G02', // uso del CFDI
]));

// Creamos un objeto para el concepto
$concept = new Concept([
    'quantity' => 1,
    'price' => 10000.00,
    'description' => 'Computadora',
    'category_code' => '43211501', // Código del SAT
    'unit' => 'H87', // Clave de la unidad de medida (SAT)
    'unit_str' => 'Pieza', // Nombre de la unidad de medida (SAT)
]);

// Se agrega un impuesto al concepto
$concept->addTransferredTax(new TransferredTax([
    'base' => 10000.00, // Precio unitario x cantidad
    'tax' => '002', // Código del impuesto
    'factor_type' => 'Tasa', // Factor
    'rate' => .16, // Porcentaje
]));

// Se agrega el concepto a la factura.
$invoice->addConcept($concept);

// Generamos el CFDI
$invoice->generate();
// Ya puedes obtener el XML generado
echo $invoice->getXML();

```

### Generar recibo de nomina

[](#generar-recibo-de-nomina)

A continuación un ejemplo de como generar un recibo de nomina.

```
$nomina = new Gmlo\CFDI\Nomina([
    'pay_way' => '99',
    'pay_method' => 'PUE',
    'zip_code' => '23000',
    'serie' => 'A',
    'folio' => '01',
    'cert_number' => '20001000000300022762',
    'pay_start_date' => '2018-09-01',
    'pay_end_date' => '2018-09-15',
    'pay_date' => '2018-09-15',
    'type' => 'O',
    'pay_days' => 15,
]);
/*
    Asignar rutas de los archivos en el archivo .env:
    CFDI_KEY_PEM_PATH=/var/www/.../storage/certs/sasasasa.key.pem
    CFDI_CER_PEM_PATH=/var/www/.../storage/certs/sasasasa.cer.pem
    o asignarlos con los metodos setKeyPath y setCerPath:
*/
$nomina->setKeyPath(storage_path('certs/20181003171044.key.pem'));
$nomina->setCerPath(storage_path('certs/20181003171044.cer.pem'));

$nomina->setEmployer([
    'rfc' => 'ERFC201902919201',
    'name' => 'EL EMPLEADOR',
    'tax_regime' => '603',
]);

$nomina->setEmployee([
    'rfc' => 'RFCC921929192',
    'name' => 'EL EMPLEADO',
    'curp' => 'ELE28192819821',
    'contract_type' => '09',
    'regime_type' => '09',
    'employee_number' => '1',
    'periodicity_of_payment' => '05',
    'employee_position' => 'JEFE DE ALGUN DEPARTAMENTO',
    'state' => 'BCS',
]);

$nomina->addPerception('001', '001', 'Sueldos y Salarios', 7824.00, 0);
$nomina->addDeduction('002', '002', 'ISR', 1033.03);

$nomina->generate();
// Ya puedes obtener el XML generado
echo $nomina->getXML();
```

### Leer XML del CFDI

[](#leer-xml-del-cfdi)

Podemos recuperar la información del XML con la ayuda de nuestra clase `\Gmlo\CFDI\CFDIReader`, con el que podras acceder a los nodos y atributos. ya sea con los nombres originales o con su traducción a ingles. En caso de los conjuntos de nodos del mismo tipo como por ejemplo los `CFDI:Conceptos` seran agrupados en una `Collection`. Ejemplo:

```
$cfdi = new CFDIReader('/path/to/CFDI.xml');
// Obtener información de un atributo (Con los nombres originales)
echo $cfdi->Emisor->Rfc;
// Ahora en ingles, minúsculas y en snake_case:
echo $cfdi->transmitter->rfc;
// Otras funciones:
echo $cfdi->toJson();
```

### ToDo

[](#todo)

- Cancelaciones
- Complementos de pago
- Otros complementos
- CFDI de Egresos
- CFDI de Ingresos

### Development By [@gmlo\_89](https://twitter.com/gmlo_89)

[](#development-by-gmlo_89)

###  Health Score

22

—

LowBetter than 22% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity17

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity36

Early-stage or recently created project

 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/49ce1f14578db9416c76c30bfed304409edbcb916f3e761a33499899b3a9c4f6?d=identicon)[gmlo\_89](/maintainers/gmlo_89)

---

Top Contributors

[![gmlo89](https://avatars.githubusercontent.com/u/874420?v=4)](https://github.com/gmlo89 "gmlo89 (29 commits)")

### Embed Badge

![Health badge](/badges/gmlo89-cfdi/health.svg)

```
[![Health](https://phpackages.com/badges/gmlo89-cfdi/health.svg)](https://phpackages.com/packages/gmlo89-cfdi)
```

PHPackages © 2026

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