Librería PHP moderna para generar, firmar y exportar facturas electrónicas en formato FacturaE (3.2, 3.2.1, 3.2.2) con firma XAdES-EPES — sin dependencias externas.
La alternativa moderna a Facturae-PHP: API fluent con named arguments, enums nativos de PHP 8.2+, tipado estricto y PHPStan nivel 8.
use PhpFacturae\Invoice;
use PhpFacturae\Party;
use PhpFacturae\Signer;
Invoice::create('FAC-001')
->series('A')
->date('2025-03-01')
->seller(Party::company('B12345674', 'Mi Empresa S.L.')
->address('C/ Mayor 10', '28013', 'Madrid', 'Madrid'))
->buyer(Party::person('12345678Z', 'Laura', 'Gómez', 'Ruiz')
->address('C/ Sol 3', '28012', 'Madrid', 'Madrid'))
->line('Diseño logotipo', price: 450.00, vat: 21)
->transferPayment(iban: 'ES91 2100 0418 4502 0005 1332', dueDate: '2025-03-31')
->sign(Signer::pfx('certificado.pfx', 'password'))
->export('factura.xsig');| PhpFacturae | josemmo/facturae-php | |
|---|---|---|
| API | Fluent con named arguments | Arrays asociativos |
| PHP mínimo | 8.2+ con enums y readonly | 5.6+ |
| Tipado | Estricto · PHPStan nivel 8 | Sin análisis estático |
| Impuestos | Named args: vat:, igic:, irpf: |
Constantes: TAX_IVA + arrays |
| Dependencias | Cero (solo ext-dom, ext-openssl) | Cero |
| Rendimiento | ~0.2 ms / factura | — |
composer require php-facturae/php-facturaeRequiere PHP 8.2+ con ext-openssl (firma), ext-dom (XML) y ext-curl (TSA, opcional).
->line('Producto', price: 100, vat: 21) // IVA 21 %
->line('Servicio profesional', price: 500, vat: 21, irpf: 15) // IVA + retención IRPF
->line('Producto canario', price: 100, igic: 7) // IGIC 7 %
->line('Joyería', price: 200, vat: 21, surcharge: 5.2) // IVA + recargo equivalencia
->exemptLine('Formación', price: 2000, reason: 'Art. 20.Uno.9') // ExentaPara combinaciones más específicas, customLine acepta un array de TaxBreakdown:
->customLine('Producto canario', price: 300, taxes: [
new TaxBreakdown(Tax::IGIC, 7),
new TaxBreakdown(Tax::REIGIC, 0.5),
])// Persona jurídica
Party::company('B12345674', 'Empresa S.L.')
->tradeName('Nombre Comercial')
->address('C/ Mayor 10', '28013', 'Madrid', 'Madrid')
->email('admin@empresa.es')
->merchantRegister(book: '1', register: 'Madrid', sheet: 'T-12345', folio: '100')
// Persona física
Party::person('12345678Z', 'Laura', 'Gómez', 'Ruiz')
->address('C/ Sol 3', '28012', 'Madrid', 'Madrid')
// Extranjero
Party::company('FR12345678901', 'Entreprise SAS')
->address('12 Rue de la Paix', '75002', 'Paris', 'Île-de-France', 'FRA')Centros administrativos para FACe:
Party::company('S2800000A', 'Ministerio de Ejemplo')
->address('C/ Oficial 1', '28001', 'Madrid', 'Madrid')
->centre('01', 'L01234567', 'Oficina contable')
->centre('02', 'L01234567', 'Órgano gestor')
->centre('03', 'L01234567', 'Unidad tramitadora')->transferPayment(iban: 'ES91...', dueDate: '2025-04-01')
->cashPayment(dueDate: '2025-03-01')
->cardPayment(dueDate: '2025-03-01')
->directDebitPayment(iban: 'ES80...', dueDate: '2025-03-10')Pagos fraccionados (divide el total en N plazos, ajusta céntimos en el último):
->splitPayments(
method: PaymentMethod::Transfer,
installments: 3,
firstDueDate: '2025-04-01',
intervalDays: 30,
iban: 'ES91...',
)->generalDiscount('Cliente VIP', rate: 5)
->generalDiscount('Promoción', amount: 50.00)
->generalCharge('Portes', amount: 15.00)->corrects(
invoiceNumber: 'FAC-001',
reason: CorrectionReason::TaxableBase,
method: CorrectionMethod::FullReplacement,
series: 'A',
periodStart: '2025-01-01',
periodEnd: '2025-03-31',
)22 motivos en CorrectionReason, 4 métodos en CorrectionMethod.
->attachFile('/path/to/contrato.pdf', 'Contrato firmado')
->attach(Attachment::fromData($rawPdf, 'application/pdf', 'Albarán'))// PKCS#12
->sign(Signer::pfx('certificado.pfx', 'password'))
// PEM
->sign(Signer::pem('cert.pem', 'key.pem'))
// Con sellado de tiempo TSA
->sign(Signer::pfx('certificado.pfx', 'password')->timestamp('https://freetsa.org/tsr'))También firma XMLs generados por otros programas:
$signedXml = Pkcs12Signer::pfx('cert.pfx', 'pass')->sign(file_get_contents('factura.xml'));->schema(Schema::V3_2_2) // Versión XSD (por defecto 3.2.2)
->operationDate('2025-02-28') // Fecha operación (devengo)
->billingPeriod(from: '2025-02-01', to: '2025-02-28') // Periodo facturación
->legalLiteral('Factura exenta de IVA por aplicación del REF Canario.')- XML FacturaE 3.2 / 3.2.1 / 3.2.2
- Firma XAdES-EPES + sellado de tiempo TSA
- 29 impuestos · 19 métodos de pago · 36 unidades de medida
- Multi-impuesto por línea, recargo de equivalencia
- Operaciones exentas y no sujetas
- Facturas rectificativas (22 motivos + periodo fiscal)
- Descuentos y cargos generales
- Adjuntos embebidos (PDF, imágenes, etc.)
- Pagos fraccionados con ajuste de céntimos
- Personas físicas / jurídicas / extranjeros
- Centros administrativos FACe (DIR3)
- PHPStan nivel 8 · CI con PHP 8.2, 8.3 y 8.4
- Envío directo a FACe (AAPP)
- Envío a FACeB2B
- Suplidos
- Cesionarios (factoring)
- Terceros (third-party issuer)
git clone https://github.com/php-facturae/php-facturae.git
cd php-facturae
composer install
vendor/bin/phpunit
vendor/bin/phpstan analyse src --level=8¿Encontraste un bug? Abre un issue. ¿Quieres aportar código? Los PRs son bienvenidos.
MIT © Mario Pérez