Construye y sella CFDI 4.0 sobre el ecosistema phpcfdi/eclipxe, y timbra detrás de un driver de PAC intercambiable.
Un núcleo independiente de framework con un puente opcional para Laravel (configuración, facade).
use Webrek\Cfdi\Laravel\Facades\Cfdi;
use Webrek\Cfdi\Csd;
$creator = Cfdi::comprobante([
'Serie' => 'A', 'Folio' => '1001', 'Fecha' => now()->format('Y-m-d\TH:i:s'),
'FormaPago' => '01', 'Moneda' => 'MXN', 'TipoDeComprobante' => 'I',
'Exportacion' => '01', 'MetodoPago' => 'PUE', 'LugarExpedicion' => '06000',
]);
$comprobante = $creator->comprobante();
$comprobante->addEmisor(['RegimenFiscal' => '601']); // RFC/Nombre se toman del CSD al sellar
$comprobante->addReceptor([
'Rfc' => 'XAXX010101000', 'Nombre' => 'PUBLICO EN GENERAL',
'DomicilioFiscalReceptor' => '06000', 'RegimenFiscalReceptor' => '616', 'UsoCFDI' => 'S01',
]);
$comprobante->addConcepto([
'ClaveProdServ' => '01010101', 'Cantidad' => '1', 'ClaveUnidad' => 'H87',
'Descripcion' => 'Servicio', 'ValorUnitario' => '100.00', 'Importe' => '100.00', 'ObjetoImp' => '01',
]);
$resultado = Cfdi::issue($creator, app(Csd::class)); // sella + timbra
$resultado->uuid; // folio fiscal
$resultado->xml; // CFDI timbradoQué hace y qué no. Arma el CFDI 4.0 y lo sella con tu CSD (lo difícil y verificable). El timbrado lo realiza tu PAC a través de un driver — el paquete trae uno falso para desarrollo. No valida el comprobante contra el SAT ni reemplaza las reglas de negocio de tu facturación. El algoritmo de sellado está verificado contra el CSD de pruebas del SAT.
composer require webrek/cfdiRequiere las extensiones dom, xsl y openssl (para la cadena de origen y el
sellado).
El service provider se descubre solo. Publica la configuración y apunta tu CSD:
php artisan vendor:publish --tag=cfdi-configCFDI_CSD_CER=/ruta/csd.cer
CFDI_CSD_KEY=/ruta/csd.key
CFDI_CSD_PASSWORD=...
CFDI_PAC=App\Cfdi\MiPac # tu driver de PAC (por defecto: el falso)
CFDI_XSLT_CACHE=/ruta/persistente # caché de los XSLT del SATuse Webrek\Cfdi\{Sealer, Csd};
$csd = Csd::fromFiles('csd.cer', 'csd.key', 'contraseña');
$sealed = (new Sealer)->seal($creator, $csd); // $creator es un CfdiUtils\CfdiCreator40
$resultado = (new MiPac)->stamp($sealed->xml);El timbrado vive detrás de una interfaz para que conectes tu proveedor (Finkok, SW, etc.):
use Webrek\Cfdi\Contracts\Pac;
use Webrek\Cfdi\StampResult;
final class MiPac implements Pac
{
public function stamp(string $sealedXml): StampResult
{
// …llama al web service de tu PAC con $sealedXml…
return new StampResult($uuid, $xmlTimbrado, $respuestaCruda);
}
}Webrek\Cfdi\Pacs\FakePac (el default) devuelve el XML sellado con un UUID
generado, para que tus pruebas ejerciten el flujo sin contactar a un PAC real.
El sellado construye la cadena de origen con los XSLT del SAT. La primera vez se
descargan y se cachean; configura CFDI_XSLT_CACHE a una ruta persistente y
escribible en producción para no volver a bajarlos.
composer testLa suite del núcleo sella un CFDI 4.0 con el CSD de pruebas del SAT
(RFC AAA010101AAA) usando los XSLT incluidos en tests/fixtures, así que corre
sin red.
Consulta CONTRIBUTING.md. Corre make check antes de abrir un
pull request.
Reporta vulnerabilidades a través del formulario de avisos de seguridad, no como issues públicos. Consulta SECURITY.md.
Licencia MIT (MIT). Consulta LICENSE.