Warum ist ZUGFeRD in nativem PHP so schwierig?
PHP treibt einen Großteil der deutschen Warenwirtschaften, Webshops (WooCommerce, Shopware) und CRM-Systeme an. Doch ZUGFeRD 2.2 / Factur-X erfordert die Einbettung von XML-Daten nach UN/CEFACT CII in ein valides PDF/A-3b Dokument.
Native PHP-Bibliotheken (wie FPDF oder TCPDF) unterstützen PDF/A-3 und Farbprofile nur unzureichend, und die XML-Erstellung scheitert häufig an strengen Rundungs- und Validierungsregeln des Gesetzgebers.
Die Lösung: ZUGFeRD in PHP integrieren
Mit der E-Rechnung API übergibst du deine Rechnungsdaten als natives PHP-Array. Du erhältst sofort das fertige PDF/A-3 Dokument zurück.
Variante A: Mit dem offiziellen Composer SDK (Empfohlen)
Installiere das offizielle PHP-Paket via Composer:
composer require andregrunert-ctrl/zugferd-client
Die Nutzung im PHP-Code erfordert nur 3 Zeilen (der kostenlose Test-Key ist standardmäßig aktiv):
<?php
require_once 'vendor/autoload.php';
use Zugferd\ZugferdClient;
$client = new ZugferdClient();
$client->generateInvoice($data, 'rechnung.pdf');
// Optional: Konformität sofort validieren
$report = $client->validate('rechnung.pdf');
echo "Ist valide: " . ($report->isValid() ? 'Ja' : 'Nein');
Variante B: Nativ mit cURL (Ohne Composer)
Falls du kein Composer verwendest, kannst du die API auch direkt über natives cURL ansprechen. Funktioniert sofort mit unserem Test-Key zg_test_ouroboros_001:
<?php
$apiUrl = "https://e-rechnung-cloud.de/v1/invoice/generate";
$apiKey = "zg_test_ouroboros_001"; // Dein Key (oder zg_live_...)
$data = [
"invoice_number" => "RE-2025-PHP-001",
"issue_date" => date("Y-m-d"),
"currency" => "EUR",
"seller" => [
"name" => "Mein Softwarehaus GmbH",
"street" => "Technologiepark 8",
"zip_code" => "70174",
"city" => "Stuttgart",
"country" => "DE",
"vat_id" => "DE123456789",
"iban" => "DE99100100100123456789"
],
"buyer" => [
"name" => "Mandant & Co. KG",
"street" => "Handelsstraße 15",
"zip_code" => "80331",
"city" => "München",
"country" => "DE"
],
"line_items" => [
[
"description" => "Backend Entwicklung & API Setup",
"quantity" => 8,
"unit_price" => 110.00,
"tax_rate_percent" => 19.0
],
[
"description" => "Wartung & Hosting (Monatlich)",
"quantity" => 1,
"unit_price" => 89.00,
"tax_rate_percent" => 19.0
]
]
];
$ch = curl_init($apiUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-API-Key: " . $apiKey,
"Content-Type: application/json"
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
file_put_contents("rechnung_zugferd.pdf", $response);
echo "SUCCESS: ZUGFeRD-Rechnung erfolgreich gespeichert (rechnung_zugferd.pdf)\n";
} else {
echo "ERROR " . $httpCode . ": " . $response . "\n";
}
Verwendung in Laravel (via Http-Client)
In modernen Laravel-Projekten ist die Einbindung ein Einzeiler:
use Illuminate\Support\Facades\Http;
$response = Http::withHeaders(['X-API-Key' => config('services.zugferd.key')])
->post('https://e-rechnung-cloud.de/v1/invoice/generate', $invoiceData);
if ($response->successful()) {
Storage::disk('invoices')->put('rechnung.pdf', $response->body());
}
Für den Live-Betrieb bereit?
Hol dir deinen API-Key und rüste dein PHP-Projekt für die E-Rechnung 2025 auf.