Создание QR-кодов на PHP: эффективные инструменты и советы

Раздел: Расширенные возможности PHP -> Генерация изображений

Генерация QR-кодов в PHP

Как создать QR-код с помощью современной библиотеки endroid/qr-code?

Наиболее эффективное решение использует пакет endroid/qr-code, устанавливаемый через Composer. Библиотека поддерживает форматы PNG, SVG, EPS, настройку размера, уровня коррекции ошибок, кодировку и многое другое. Она активно поддерживается и рекомендуется для профессиональных проектов.

Установка:

composer require endroid/qr-code

Php qr code (генерация qr-кода в php)

Простой пример генерации и вывода PNG изображения в браузер:

<?php
require 'vendor/autoload.php';

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;

$qrCode = QrCode::create('https://example.com')
    ->setSize(300)
    ->setMargin(10);

$writer = new PngWriter();
$result = $writer->write($qrCode);

header('Content-Type: '.$result->getMimeType());
echo $result->getString();

Результат: изображение QR-кода, отображаемое в браузере.

[PNG image data]

Возможные проблемы и их решение:

  • Composer не установлен — установите Composer или используйте phpqrcode (см. вариант ниже).
  • Ошибка "Class not found" — проверьте правильность автозагрузки (vendor/autoload.php).
  • Не отображается изображение в браузере — убедитесь, что перед вызовом header нет вывода текста или пробелов.
  • Библиотека требует расширение GD для PNG — включите его в php.ini (extension=gd).
  • Китайские символы не распознаются — используйте setEncoding('UTF-8') или укажите кодировку в данных.

Как генерировать QR-код без менеджера зависимостей с помощью phpqrcode?

Библиотека phpqrcode (устаревшая, но всё ещё работает) не требует Composer. Достаточно скачать один файл phpqrcode.php и подключить его.

<?php
include 'phpqrcode.php';

QRcode::png('https://example.com', false, 'L', 4, 2);

Результат: вывод PNG напрямую в браузер.

[PNG image data]

Второй параметр может быть именем файла для сохранения, третий — уровень коррекции ошибок (L, M, Q, H), четвёртый — размер (1-10), пятый — отступ (0-4).

Типичные ошибки:

  • Библиотека не поддерживает пространства имён, возможны конфликты с другими классами.
  • UTF-8 текст может отображаться некорректно; необходимо предварительно конвертировать данные в Windows-1251 или использовать внешнюю обработку.
  • Нет встроенной поддержки SVG или других форматов.

Как использовать Google Charts API для генерации QR-кода без установки библиотек?

Google предоставляет бесплатный API для создания QR-кодов (без необходимости регистрации). Запрос формируется так:

<?php
$data = urlencode('https://example.com');
$url = "https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=$data&choe=UTF-8";
$image = file_get_contents($url);
header('Content-Type: image/png');
echo $image;

Результат: PNG изображение QR-кода.

[PNG image data]

Проблемы:

  • Зависимость от интернет-соединения и доступности сервиса Google.
  • Ограничение размера данных (не более 2 КБ после кодирования).
  • Google может изменить или отключить API в любое время (сейчас он считается устаревшим).
  • Не поддерживаются кастомные цвета, логотипы, SVG.

Как создать QR-код без сторонних библиотек, используя только GD?

Теоретически возможно реализовать генератор QR-кода с нуля, используя библиотеку GD для рисования модулей. Но это крайне трудоёмко (необходимо реализовать алгоритм кодирования, коррекции ошибок, маскирования) и не рекомендуется. Примеров кода нет из-за сложности. Лучше использовать готовые библиотеки.

Реализация своими силами потребует сотен строк кода, глубоких знаний спецификации QR и может содержать ошибки генерации, несовместимые со стандартными сканерами.

Дополнительные примеры с расширенными возможностями

Ниже приведены примеры, которые расширяют базовые сценарии и демонстрируют гибкость библиотеки endroid/qr-code.

Генерация QR-кода в формате SVG

Пример
<?php
require 'vendor/autoload.php';

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\SvgWriter;

$qrCode = QrCode::create('https://example.com')
    ->setSize(400)
    ->setMargin(5);

$writer = new SvgWriter();
$result = $writer->write($qrCode);
header('Content-Type: image/svg+xml');
echo $result->getString();
[SVG-код с квадратными модулями, масштабируемый]

Генерация QR-кода с логотипом

Пример
<?php
require 'vendor/autoload.php';

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Label\Label;

$qrCode = QrCode::create('https://example.com')
    ->setSize(400);

$writer = new PngWriter();
$result = $writer->write($qrCode);

// Логотип будет добавлен отдельными средствами
// Библиотека не поддерживает встроенное наложение логотипа, но можно использовать внешнюю обработку
// Например, через GD
$logo = imagecreatefrompng('logo.png');
$qrImage = imagecreatefromstring($result->getString());
$qrWidth = imagesx($qrImage);
$qrHeight = imagesy($qrImage);
$logoWidth = imagesx($logo);
$logoHeight = imagesy($logo);
// Позиционирование по центру
$dstX = ($qrWidth - $logoWidth) / 2;
$dstY = ($qrHeight - $logoHeight) / 2;
imagecopyresampled($qrImage, $logo, $dstX, $dstY, 0, 0, $logoWidth, $logoHeight, $logoWidth, $logoHeight);
header('Content-Type: image/png');
imagepng($qrImage);
imagedestroy($qrImage);
imagedestroy($logo);
[QR-код с логотипом в центре]

Настройка уровня коррекции ошибок и кодировки

Пример
<?php
require 'vendor/autoload.php';

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\ErrorCorrectionLevel;

$qrCode = QrCode::create('Hello, мир!')
    ->setSize(300)
    ->setEncoding('UTF-8')
    ->setErrorCorrectionLevel(ErrorCorrectionLevel::High); // H - 30% данных восстановления

$writer = new PngWriter();
$result = $writer->write($qrCode);
header('Content-Type: image/png');
echo $result->getString();
[PNG с высокой коррекцией ошибок, поддерживающий кириллицу]

Пакетная генерация из списка данных

Пример
<?php
require 'vendor/autoload.php';

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;

$dataList = [
    'https://example.com',
    'https://test.org',
    'Текстовые данные с кириллицей'
];

$writer = new PngWriter();
$outputDir = 'qrcodes/';
if (!is_dir($outputDir)) mkdir($outputDir, 0777, true);

foreach ($dataList as $index => $data) {
    $qrCode = QrCode::create($data)
        ->setSize(200)
        ->setMargin(5);
    $result = $writer->write($qrCode);
    file_put_contents($outputDir . 'qr_' . $index . '.png', $result->getString());
}
echo 'Сгенерировано ' . count($dataList) . ' QR-кодов.';
[В папке qrcodes появились файлы qr_0.png, qr_1.png, qr_2.png]

Генерация QR-кода для визитной карточки (vCard)

Пример
<?php
require 'vendor/autoload.php';

use Endroid\QrCode\QrCode;
use Endroid\QrCode\Writer\PngWriter;

$vcard = "BEGIN:VCARD\nVERSION:3.0\nFN:Иван Петров\nTEL:+7-123-456-78-90\nEMAIL:ivan@example.com\nEND:VCARD";

$qrCode = QrCode::create($vcard)
    ->setSize(300)
    ->setMargin(10);

$writer = new PngWriter();
$result = $writer->write($qrCode);
header('Content-Type: image/png');
echo $result->getString();
[QR-код, при сканировании добавляющий контакт в телефонную книгу]

Генерация QR-кода в PHP - comments

En
Php qr code (php)