PHP-генерировать QR-код (qr-код)

задняя часть PHP

1. Зачем писать эту статью

Недавно мне нужно сгенерировать QR-код для проекта, чтобы пользователи могли прыгать.После поиска я обнаружил, что в Интернете используется код под названиемphpqrcodeрасширение, вgithubИскал в интернете и обнаружил, что автор этого проекта не поддерживал его 6 лет назад, и статьи Baidu тоже такие же.Вы копируете мои, а я копирую ваши, так что я долженgithubПосмотрите, есть ли что-нибудь лучше оPHPРасширение для генерации QR-кода, а затем нашел проект с именемqr-codeРасширение чувствует себя хорошо, автор занимается обслуживанием, и использование также простое и удобное. Итак, вот описание установки и использования этого расширения для облегчения вашей разработки.

qr-codeПроектgithubАдрес:qr-code

2. Установите qr-код

Здесь мы проходимcomposerустановить расширение,composerСейчас его можно считать относительно популярным инструментом управления пакетами, если он прав.composerЕсли вы мало что знаете об этом, вы можете прочитать мою предыдущую статью:

"Установка и использование php-composer"

Моя среда — Linux, мы вводим следующую команду для установки расширения:

composer require endroid/qr-code

Когда расширение установлено, мы можем начать следующие операции.

3. Сгенерируйте QR-код

Для начала нам нужно ввести в проектqr-codeфайл класса,composerВ основном черезpsr-4 "命名空间": "路径"способ автозагрузки, его расположение находится в корневом каталоге расширенияcomposer.jsonв файле.

Хорошо, теперь мы представляемqr-codeclass и попробуйте вывести простой QR-код.

use Endroid\QrCode\QrCode;

// $content 一般为url地址 当然也可以是文字内容
$content = 'http://www.baidu.com?rand=' . rand(1000, 9999);
$qrCode = new QrCode($content);
// 指定内容类型
header('Content-Type: '.$qrCode->getContentType());
// 输出二维码
echo $qrCode->writeString();

Ну а при указании типа контента QR-код будет выводиться прямо на странице

Так как же такой QR-код прямого вывода можно применить к проекту?htmlсередина<img>теги, например:

<img src="http://localhost:8080/projecttest/qrtest?id=1234"  alt="这是一个二维码" />

Таким образом, QR-код может отображаться в любом месте страницы. Конечно, мы также можем сохранить его в файл, чтобы сгенерировать картинку в любом формате, например:

$qrCode->writeFile(__DIR__ . '/qrcode.png');

Таким образом, мы можем отображать QR-код на странице в соответствии с путем изображения.

4. Простые файлы примеров и введение общих параметров

Здесь я публикую простой файл обработки класса и представляю егоqr-codeНекоторые часто используемые параметры.

файл класса:

namespace '命名空间';

use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\LabelAlignment;
use Endroid\QrCode\QrCode;

class QrcodeComponent
{
    protected $_qr;
    protected $_encoding = 'UTF-8';
    protected $_size = 300;
    protected $_logo = false;
    protected $_logo_url = '';
    protected $_logo_size = 80;
    protected $_title = false;
    protected $_title_content = '';
    protected $_generate = 'display'; // display-直接显示 writefile-写入文件
    const MARGIN = 10;
    const WRITE_NAME = 'png';
    const FOREGROUND_COLOR = ['r' => 0, 'g' => 0, 'b' => 0, 'a' => 0];
    const BACKGROUND_COLOR = ['r' => 255, 'g' => 255, 'b' => 255, 'a' => 0];

    public function __construct($config) {
        isset($config['generate']) && $this->_generate = $config['generate'];
        isset($config['encoding']) && $this->_encoding = $config['encoding'];
        isset($config['size']) && $this->_size = $config['size'];
        isset($config['display']) && $this->_size = $config['size'];
        isset($config['logo']) && $this->_logo = $config['logo'];
        isset($config['logo_url']) && $this->_logo_url = $config['logo_url'];
        isset($config['logo_size']) && $this->_logo_size = $config['logo_size'];
        isset($config['title']) && $this->_title = $config['title'];
        isset($config['title_content']) && $this->_title_content = $config['title_content'];
    }

    /**
     * 生成二维码
     * @param $content 需要写入的内容
     * @return array | page input
     */
    public function create($content) {
        $this->_qr = new QrCode($content);
        $this->_qr->setSize($this->_size);
        $this->_qr->setWriterByName(self::WRITE_NAME);
        $this->_qr->setMargin(self::MARGIN);
        $this->_qr->setEncoding($this->_encoding);
        $this->_qr->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH);
        $this->_qr->setForegroundColor(self::FOREGROUND_COLOR);
        $this->_qr->setBackgroundColor(self::BACKGROUND_COLOR);
        if ($this->_title) {
            $this->_qr->setLabel($this->_title_content, 16, '字体地址', LabelAlignment::CENTER);
        }
        if ($this->_logo) {
            $this->_qr->setLogoPath($this->_logo_url);
            $this->_qr->setLogoWidth($this->_logo_size);
            $this->_qr->setRoundBlockSize(true);
        }
        $this->_qr->setValidateResult(false);

        if ($this->_generate == 'display') {
            // 前端调用 例:<img src="http://localhost/qr.php?url=base64_url_string">
            header('Content-Type: ' . $this->_qr->getContentType());
            return $this->_qr->writeString();
        } else if ($this->_generate == 'writefile') {
            return $this->_qr->writeString();
        } else {
            return ['success' => false, 'message' => 'the generate type not found', 'data' => ''];
        }
    }

    /**
     * 生成文件
     * @param $file_name 目录文件 例: /tmp
     * @return array
     */
    public function generateImg($file_name) {
        $file_path = $file_name . DS . uniqid() . '.' . self::WRITE_NAME;

        if (!file_exists($file_name)) {
            mkdir($file_name, 0777, true);
        }

        try {
            $this->_qr->writeFile($file_path);
            $data = [
                'url' => $file_path,
                'ext' => self::WRITE_NAME,
            ];
            return ['success' => true, 'message' => 'write qrimg success', 'data' => $data];
        } catch (Exception $e) {
            return ['success' => false, 'message' => $e->getMessage(), 'data' => ''];
        }
    }
}

Инструкции:

use '命名空间';

$qr_url = 'http://www.baidu.com?id=' . rand(1000, 9999);
$file_name = '/tmp';

// 直接输出
$qr_code = new QrcodeComponent();
$qr_img = qr_code->create($qr_url);
echo $qr_img;

// 生成文件
$config = [
    'generate' => 'writefile',
];
$qr_code = new QrcodeComponent($config);
$qr_img = $qr_code->create($qr_url);
$rs = $qr_code->generateImg($file_name);
print_r($rs);

Объяснение общих параметров:

setSize- Размер QR-кода в пикселях
setWriterByName- Суффикс записываемого файла
setMargin- Содержимое QR-кода относится к внешнему полю всего изображения.
setEncoding- тип кодирования
setErrorCorrectionLevel- Уровень отказоустойчивости, разделенный на четыре уровня: L, M, Q, H
setForegroundColor- цвет переднего плана
setBackgroundColor- фоновый цвет
setLabel- Этикетка с QR-кодом
setLogoPath- Путь к логотипу QR-кода
setLogoWidth- Размер логотипа QR-кода в px