laravel maintained by sifadi
sifadi/laravel
🇲🇽 Made for Mexico — read this first. This is the official Laravel integration for Sifadi, a Mexican electronic-invoicing service (CFDI 4.0 / SAT). It exists exclusively to issue tax invoices in Mexico, so its documentation, examples and field names are written in Spanish on purpose — that is the language of the SAT and of the Mexican businesses and developers who use it. If you are not issuing Mexican CFDI, this package is not for you.
Integración de Sifadi para Laravel: un ServiceProvider, una Facade Sifadi y un config/sifadi.php sobre el SDK sifadi/core. Timbra CFDI 4.0, cancela, descarga XML/PDF y consulta tu saldo — desde Laravel, con cero boilerplate.
Requisitos
- PHP 8.1 o superior
- Laravel 10, 11 o 12
- Un token de Sifadi: access token de OAuth ("Conectar con Sifadi") o una API key personal (Sifadi → Ajustes → API Keys).
Instalación
composer require sifadi/laravel
El ServiceProvider y la Facade se registran solos (package auto-discovery). Publica la config solo si quieres editarla:
php artisan vendor:publish --tag=sifadi-config
Configuración
En tu .env:
SIFADI_TOKEN=tu_access_token_o_api_key
# Opcionales — por defecto apunta a producción:
# SIFADI_BASE_URL=https://app.sifadi.test
# SIFADI_TIMEOUT=30
Cómo usarlo
Con la Facade
use Sifadi\Laravel\Facades\Sifadi;
$cfdi = Sifadi::invoices()->create([
'tipo_de_comprobante' => 'I',
'exportacion' => '01',
'forma_pago' => '01',
'metodo_pago' => 'PUE',
'moneda' => 'MXN',
'emisor' => ['rfc' => 'EKU9003173C9'],
'receptor' => [
'rfc' => 'XAXX010101000',
'nombre' => 'PUBLICO EN GENERAL',
'domicilio_fiscal_receptor' => '66039',
'regimen_fiscal_receptor' => '616',
'uso_cfdi' => 'S01',
],
'conceptos' => [[
'clave_prod_serv' => '01010101',
'clave_unidad' => 'ACT',
'cantidad' => '1',
'descripcion' => 'Venta',
'valor_unitario' => '589.00',
'objeto_imp' => '02',
'traslados' => [['impuesto' => '002', 'tipo_factor' => 'Tasa', 'tasa_o_cuota' => '0.160000']],
]],
]);
$xml = Sifadi::invoices()->xml($cfdi['id']);
$saldo = Sifadi::stamps()->balance();
Con inyección de dependencias
use Sifadi\Core\SifadiClient;
public function store(SifadiClient $sifadi)
{
$cfdi = $sifadi->invoices()->create([/* ... */]);
}
Métodos disponibles
Sifadi::invoices()->create([...]); // crear + timbrar (idempotencyKey opcional)
Sifadi::invoices()->createDraft([...]); // borrador (sin timbrar)
Sifadi::invoices()->sign($id);
Sifadi::invoices()->stamp($id);
Sifadi::invoices()->cancel($id, '02'); // motivo 01 requiere uuid_sustitucion
Sifadi::invoices()->stampInfo($id);
Sifadi::invoices()->xml($id); // Sifadi::invoices()->pdf($id);
Sifadi::issuers()->list(); // RFCs de la cuenta
Sifadi::stamps()->balance(); // Sifadi::stamps()->available();
Sifadi::me(); // identidad + plan del token
Manejo de errores
Las excepciones viven en sifadi/core y son tipadas por código HTTP:
use Sifadi\Core\Exceptions\ValidationException;
use Sifadi\Core\Exceptions\InsufficientStampsException;
try {
$cfdi = Sifadi::invoices()->create($document);
} catch (ValidationException $e) {
foreach ($e->errors() as $campo => $mensajes) { /* ... */ }
} catch (InsufficientStampsException $e) {
// recarga timbres. $e->available(), $e->required()
}
| Excepción | HTTP |
|---|---|
AuthenticationException |
401 |
InsufficientStampsException |
402 |
AuthorizationException |
403 |
NotFoundException |
404 |
ConflictException |
409 |
ValidationException |
422 |
RateLimitException |
429 |
PacException |
502 |
ConnectionException |
— |
El document shape del CFDI (claves en español/SAT) y el detalle de cada método están documentados en el README de sifadi/core.
Pruebas
composer install
composer test # PHPUnit + Orchestra Testbench
composer lint # Laravel Pint
Licencia
MIT.