Генерация QR кода с помощью PHP: практические примеры
В современной веб-разработке QR коды часто используются для быстрого обмена ссылками, контактными данными или платежными реквизитами. Реализация генерации QR кода на PHP может быть выполнена разными способами. В этой статье рассматриваются основные подходы, их преимущества и возможные трудности.
Основное эффективное решение
Наиболее стабильным и функциональным вариантом считается использование библиотеки endroid/qr-code. Она поддерживает все современные форматы (PNG, SVG, EPS), гибкую настройку цвета, размера и уровня коррекции ошибок. Установка выполняется через Composer:
composer require endroid/qr-codePhp штрих код (штрих-код на php)
Пример базовой генерации и вывода изображения:
<?php
require 'vendor/autoload.php';
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\Label\LabelAlignment;
use Endroid\QrCode\Label\Font\NotoSans;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;
$builder = new Builder(
writer: new PngWriter(),
writerOptions: [],
validateResult: false,
data: 'https://example.com',
encoding: new Encoding('UTF-8'),
errorCorrectionLevel: new ErrorCorrectionLevelHigh(),
size: 300,
margin: 10,
roundBlockSizeMode: new RoundBlockSizeModeMargin(),
);
$result = $builder->build();
header('Content-Type: '.$result->getMimeType());
echo $result->getString();Qr кода php (qr код на php)
Код создаёт QR код со ссылкой и выводит его как PNG-картинку. Библиотека автоматически подбирает оптимальную матрицу и корректирует ошибки.
Типичные проблемы и их решение:
- Ошибка 'Class not found' – забыли выполнить composer install или неправильно указали путь к autoload.php.
- Изображение не отображается в браузере – проверьте, что перед header нет вывода текста (пробелов, ошибок PHP). Рекомендуется поместить код в отдельный файл без HTML.
- Слишком большой размер QR кода для tiny URL – используйте уровень коррекции L и минимальный размер (150 пикселей).
Как сгенерировать QR код без установки сторонних библиотек?
Если нет возможности использовать Composer, можно прибегнуть к внешнему API Google Charts. Этот метод требует активного интернет-соединения, но не требует установки.
$url = 'https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=' . urlencode('https://example.com');
header('Content-Type: image/png');
readfile($url);
Скрипт просто перенаправляет поток изображения из Google. Ограничение: размер строки данных ограничен 2 КБ, и сервис может быть недоступен в некоторых регионах.
Возможные ошибки:
- Белый экран – не включён allow_url_fopen в php.ini. Решение: используйте cURL.
- Лимит запросов от Google – для массовой генерации лучше использовать локальную библиотеку.
Как создать кастомный QR код с логотипом и настройками?
Библиотека chillerlan/php-qrcode отличается лёгкостью и возможностью добавления изображения-логотипа поверх QR кода. Установка через Composer:
composer require chillerlan/php-qrcode
Пример с логотипом:
<?php
require 'vendor/autoload.php';
use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;
$options = new QROptions([
'outputType' => QRCode::OUTPUT_IMAGE_PNG,
'eccLevel' => QRCode::ECC_H,
'scale' => 5,
'imageBase64' => false,
'logoSpaceWidth' => 13,
'logoSpaceHeight' => 13,
]);
$qrcode = new QRCode($options);
$qrcode->addByteSegment('https://example.com');
// Загружаем логотип
$logo = file_get_contents('logo.png');
$qrcode->setLogo($logo, 'png');
header('Content-type: image/png');
echo $qrcode->render();
Логотип автоматически вставляется в центр, а алгоритм коррекции ошибок компенсирует потерю данных. Важно: размер логотипа не должен превышать 30% от QR кода.
Проблемы при работе с chillerlan:
- Требуется PHP 7.4+ и расширение GD – проверьте версию и наличие модуля.
- Неправильное отображение логотипа – убедитесь, что logo.png имеет прозрачный фон или белый цвет вокруг.
Как использовать старую библиотеку phpqrcode без Composer?
Библиотека phpqrcode (доступна на SourceForge) не требует Composer – достаточно подключить один файл. Это legacy-решение, но оно всё ещё работает.
require_once 'phpqrcode/qrlib.php';
$tempDir = 'temp/';
$fileName = 'qr.png';
$data = 'https://example.com';
$errorCorrectionLevel = 'L';
$matrixPointSize = 10;
QRcode::png($data, $tempDir.$fileName, $errorCorrectionLevel, $matrixPointSize, 2);
echo '<img src="'.$tempDir.$fileName.'">';
Функция png() создаёт файл на диске. Недостаток: библиотека не обновляется, не поддерживает логотипы и SVG.
Ошибки:
- Библиотека выдаёт предупреждения об устаревших функциях в PHP 8 – рекомендуется использовать более современные альтернативы.
- Отсутствие папки temp – создайте её и дайте права на запись.
Как нарисовать QR код вручную с помощью GD?
Для академического интереса можно попробовать реализовать примитивный QR код с использованием функций GD. Однако это трудоёмко и не рекомендуется для продакшена.
<?php
// Минимальная реализация – только чёрные и белые модули (без алгоритма коррекции)
$size = 21; // версия 1
$pixel = 10;
$im = imagecreatetruecolor($size*$pixel, $size*$pixel);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
imagefill($im, 0, 0, $white);
// массив битов (пример для демонстрации)
$matrix = [/*... 21x21 0/1 ...*/];
for ($y=0; $y<$size; $y++) {
for ($x=0; $x<$size; $x++) {
if ($matrix[$y][$x]) {
imagefilledrectangle($im, $x*$pixel, $y*$pixel, ($x+1)*$pixel-1, ($y+1)*$pixel-1, $black);
}
}
}
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
Этот код не содержит коррекции ошибок и не кодирует данные. Полноценная реализация требует много кода.
Сложности:
- Ошибки расчёта маски и полиномов – без глубокого понимания стандарта QR код будет нечитаем.
- Производительность – для версий 40 размер матрицы 177×177, что медленно.
Расширенные примеры использования
Генерация QR кода с разными уровнями коррекции ошибок
Уровень коррекции определяет, сколько данных можно восстановить при повреждении кода. Следующий пример демонстрирует создание четырёх вариантов одного текста:
$levels = ['L', 'M', 'Q', 'H'];
$data = 'https://example.com';
foreach ($levels as $level) {
$options = new QROptions([
'outputType' => QRCode::OUTPUT_IMAGE_PNG,
'eccLevel' => $level,
'scale' => 3,
]);
$qrcode = new QRCode($options);
$qrcode->addByteSegment($data);
file_put_contents("level_{$level}.png", $qrcode->render());
}
Созданы файлы level_L.png, level_M.png, level_Q.png, level_H.png. Визуально они отличаются плотностью модулей – уровень H требует больше места.
Создание QR кода с встроенным логотипом и прозрачным фоном
Библиотека endroid не поддерживает логотип напрямую, но с помощью GD можно наложить изображение поверх готового QR кода.
// Генерируем QR код через endroid
$result = $builder->build();
$qrPng = $result->getString();
$qrImg = imagecreatefromstring($qrPng);
// Накладываем логотип
$logo = imagecreatefrompng('logo.png');
$qrWidth = imagesx($qrImg);
$logoWidth = imagesx($logo);
$posX = ($qrWidth - $logoWidth) / 2;
$posY = (imagesy($qrImg) - imagesy($logo)) / 2;
imagecopy($qrImg, $logo, $posX, $posY, 0, 0, $logoWidth, imagesy($logo));
header('Content-Type: image/png');
imagepng($qrImg);
На выходе – QR код с логотипом в центре. Важно: логотип не должен закрывать ключевые области (угловые метки).
Пакетная генерация QR кодов из CSV файла
Полезно при создании купонов или билетов. Предположим CSV со столбцами 'id' и 'url'.
$csv = fopen('data.csv', 'r');
while (($row = fgetcsv($csv)) !== false) {
$id = $row[0];
$url = $row[1];
$qrcode = new QRCode();
$qrcode->addByteSegment($url);
file_put_contents("qr_{$id}.png", $qrcode->render());
}
fclose($csv);
Для каждой строки CSV создаётся отдельный PNG файл с именем qr_1.png, qr_2.png и т.д.
Изменение цвета QR кода и добавление пользовательской метки
Библиотека endroid позволяет задать цвет через цветовые классы. Также можно добавить текстовую метку под кодом.
use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Label\Label;
$builder = new Builder(
data: 'https://example.com',
foregroundColor: new Color(0, 128, 0), // зелёный
backgroundColor: new Color(255, 255, 255),
label: new Label('Сканируй меня', null, new Color(0, 0, 0)),
);
$result = $builder->build();
header('Content-Type: '.$result->getMimeType());
echo $result->getString();
QR код отображается зелёными модулями на белом фоне, под ним надпись 'Сканируй меня'.
Генерация QR кода в формате SVG для векторной печати
SVG обеспечивает масштабирование без потери качества. Используем writer SvgWriter из endroid.
use Endroid\QrCode\Writer\SvgWriter;
$builder = new Builder(
writer: new SvgWriter(),
data: 'https://example.com',
size: 200,
margin: 0,
);
$result = $builder->build();
file_put_contents('qr.svg', $result->getString());
Получен файл qr.svg, который можно открыть в любом векторном редакторе.