Enqre

Veröffentlicht am 16.8.2026

Dynamische QR-Codes in PHP: wann eine API nötig ist und wann nicht

"Wie erzeuge ich einen QR-Code in PHP" hat zwei völlig verschiedene Antworten, und die falsche kostet entweder Geld oder einen Nachdruck.

Ist der Code statisch, machen Sie es lokal

Brauchen Sie nur ein Bild einer URL — Ticket, Rechnung, Beleg —, installieren Sie eine Bibliothek und fertig. endroid/qr-code zeichnet PNG und SVG offline: kein API-Schlüssel, kein Limit, keine fremde Verfügbarkeit, keine Kosten.

Das deckt die meisten dieser Fragen ab, und jeder Artikel, der darüber hinweggeht, um Ihnen etwas zu verkaufen, verschwendet Ihren Nachmittag.

Was sich mit einem gedruckten Code ändert

Ein statischer Code ist sein Ziel: die URL steckt im Muster. Ändert sich das Ziel, ist jeder Ausdruck dauerhaft falsch.

Die Frage lautet also nicht "PHP oder Dienst", sondern: muss das Ziel nach dem Druck jemals umziehen? Wenn ja — und bei Verpackung, Typenschild, Flyer oder Maschine ist das die Regel —, muss der Code eine kurze Adresse tragen, die Sie kontrollieren. Genau das kann eine Bibliothek nicht leisten, denn dafür muss jahrelang jemand auf diese Adresse antworten.

Das Zweite ist die Zählung: ein statischer Code meldet nichts, weil niemand dazwischen steht.

Einen anlegen

<?php
$ch = curl_init("https://enqre.com/api/v1/qrcodes");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        "Authorization: Bearer " . getenv("ENQRE_API_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "name" => "Order 10432 – delivery note",
        "url"  => "https://shop.example/orders/10432",
    ]),
]);

$body   = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

if ($status !== 201) {
    throw new RuntimeException("enqre: HTTP $status — $body");
}

$code = json_decode($body, true)["data"];
// $code["id"]       — store this against your record
// $code["shortUrl"] — the address the QR image should encode
  • Die zurückgegebene id am eigenen Datensatz speichern. Sonst heißt Ändern später: nach Namen suchen und hoffen.
  • Eigene Kennung in den Namen. Sie macht fünftausend Codes navigierbar.

shortUrl zeichnen Sie mit der lokalen Bibliothek Ihrer Wahl — die beiden Aufgaben sind getrennt, und Zeichnen kann PHP hervorragend allein.

Das Ziel umlegen

<?php
$id = $code["id"];
$ch = curl_init("https://enqre.com/api/v1/qrcodes/$id");
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST  => "PATCH",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        "Authorization: Bearer " . getenv("ENQRE_API_KEY"),
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "url" => "https://shop.example/orders/10432/tracking",
    ]),
]);
curl_exec($ch);
curl_close($ch);
// The printed code is untouched. It now opens the tracking page.

Scans lesen

<?php
$ch = curl_init("https://enqre.com/api/v1/qrcodes/$id/scans");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("ENQRE_API_KEY")],
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);

echo $res["total"];             // every scan ever counted
foreach ($res["data"] as $scan) {
    // createdAt, device, os, browser — and nothing else
}

Vor dem Report-Entwurf zu wissen: ein Scan hält Zeit, Gerätetyp, System und Browser. Keine Identität und kein Standort — weder Stadt noch Land.

Fehler, die wirklich vorkommen

  • 401 invalid_api_key
  • 400 invalid_body — fast immer eine URL, die keine ist.
  • 402 plan_limit_reached
  • 429 rate_limited — mehr als 60 Anfragen je Minute.

Prüfen Sie CURLINFO_RESPONSE_CODE statt dem Body zu vertrauen. Ein unbemerkt fehlgeschlagener Aufruf wird zu einem Datensatz ohne Code — und das merkt man in der Druckerei.

Zwei Dinge von Anfang an richtig

Erzeugung idempotent machen. Zweimal gefragt heißt zwei Codes; Wiederholungen fragen irgendwann zweimal.

Nichts drucken, was nicht zurückgelesen wurde. Eine Anfrage nach dem Anlegen verhindert den einzigen Fehler, der später nicht korrigierbar ist.

Wann sich die Integration nicht lohnt

Für ein paar hundert Codes einmalig ist der CSV-Upload schneller als jeder Code, den Sie dafür schreiben. Integrieren Sie, wenn Codes laufend entstehen.

Kurze Antworten

  • Beste PHP-Bibliothek? endroid/qr-code zum Zeichnen.
  • Dynamisch in reinem PHP? Ja, wenn Sie die Weiterleitung selbst betreiben — solange der Druck existiert.
  • Authentifizierung? Authorization: Bearer enq_….
  • Ratenlimit? 60 Anfragen je Minute.
  • Liefert die API das Bild? Nein, sie liefert shortUrl.
  • Standort in den Scans? Nein.

Weiterlesen