PHP & Laravel Guide • 5 Min. Lesezeit

ZUGFeRD & XRechnung in PHP erstellen

Binde rechtskonforme E-Rechnungen nach EN 16931 in deine PHP-Anwendung, dein Laravel-Projekt oder dein ERP-System ein.

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:

generate_invoice.php
<?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.

Tarife & Keys