Objavljeno dne 16. 8. 2026
Dinamične QR kode v PHP: kdaj potrebujete API in kdaj ne
"Kako v PHP ustvarim QR kodo" ima dva povsem različna odgovora, napačen pa stane bodisi denar bodisi ponatis.
Če je koda statična, naredite to lokalno
Če potrebujete zgolj sliko naslova — vstopnico, račun, potrdilo —, namestite knjižnico in konec. endroid/qr-code riše PNG in SVG brez povezave: brez ključa, brez omejitev, brez odvisnosti od tuje razpoložljivosti in brez stroška.
To pokrije večino teh vprašanj, in vsak članek, ki to preskoči, da bi vam nekaj prodal, vam zapravlja popoldne.
Kaj se spremeni pri natisnjeni kodi
Statična koda je svoj cilj: naslov je v vzorcu. Če se ta spremeni, je vse natisnjeno trajno napačno.
Vprašanje torej ni "PHP ali storitev", ampak: ali se bo cilj po tisku kdaj premaknil? Če da — pri embalaži, tablicah in zloženkah je to pravilo —, mora koda nositi kratek naslov, ki ga nadzirate. Prav tega knjižnica ne zmore, saj mora nekdo na ta naslov odgovarjati leta.
Ustvarjanje
<?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
- Vrnjeni
idshranite ob svoj zapis. - V ime vpišite svoj identifikator.
shortUrl narišite s poljubno lokalno knjižnico: to sta ločeni opravili.
Premik cilja
<?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.
Branje skeniranj
<?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
}
Pred načrtovanjem poročila: zapis o skeniranju vsebuje čas, vrsto naprave, sistem in brskalnik. Brez identitete in brez lokacije.
Napake, ki se res zgodijo
401 invalid_api_key400 invalid_body— skoraj vedno naslov, ki to ni.402 plan_limit_reached429 rate_limited— več kot 60 zahtev na minuto.
Preverjajte CURLINFO_RESPONSE_CODE, namesto da zaupate telesu odgovora.
Dvoje že prvi dan
Ustvarjanje naredite idempotentno. Dva klica ustvarita dve kodi.
Ne tiskajte tistega, česar niste prebrali nazaj.
Kdaj integracije ne pisati
Za nekaj sto kod enkratno je nalaganje CSV hitrejše od katere koli kode, ki bi jo napisali. Integrirajte, kadar kode nastajajo neprekinjeno.
Kratki odgovori
- Najboljša knjižnica za PHP?
endroid/qr-codeza risanje. - Dinamično v čistem PHP? Da, če preusmeritev gostite sami.
- Preverjanje pristnosti?
Authorization: Bearer enq_…. - Omejitev? 60 zahtev na minuto.
- Ali API vrne sliko? Ne, vrne
shortUrl. - Lokacija v skeniranjih? Ne.