PHP根据指定URL生成二维码图片教程

Composer安装依赖包

在项目根目录执行下面命令

composer require codeitnowin/barcode

核心实现代码

完整类文件(基于Yii2框架)

该类提供二维码生成、临时文件处理、浏览器下载等完整功能,支持自定义URL、文件名前缀等参数。

<?php
namespace manage\Test;

use CodeItNow\BarcodeBundle\Utils\QrCode;
use common\extensions\Helper;
use yii\helpers\FileHelper;

class TestService
{
    /**
     * 生成二维码并触发浏览器下载
     * @param int $uid 用户ID(默认400570,可自定义传递)
     * @return array 错误信息(成功时直接下载,不返回)
     * @throws \yii\base\Exception
     */
    public function generateQrCode($uid = 400570)
    {
        // 1. 基础配置定义
        $targetUrl = 'http://www.xiaobudiu.top?uid=' . $uid; // 二维码关联的目标URL
        $downloadFileName = '小卜丢饭团子' . date('His'); // 浏览器下载时的文件名(不含后缀)
        $tempDir = \Yii::$app->basePath . '/runtime/tmp_file/'; // 临时文件存储目录

        // 2. 检查并创建临时目录
        $dirPath = $this->generateDir($tempDir);
        if (!$dirPath) {
            return Helper::msg('0', '创建图片临时文件夹失败');
        }

        // 3. 生成二维码的Base64编码字符串
        $imageBase64 = $this->generateImgBase64Str($targetUrl);

        // 4. Base64转图片并保存到临时目录
        $imageFile = $this->base64ToImg($imageBase64, $tempDir, 'admin_');
        if (!$imageFile) {
            return Helper::msg('0', '生成二维码图片失败');
        }

        // 5. 设置HTTP响应头,触发浏览器下载
        header('Content-Disposition: attachment; filename=' . $downloadFileName . '.png'); // 下载文件名
        header('Content-Type: image/png'); // 图片类型
        header('Content-Length: ' . filesize($imageFile)); // 文件大小
        header('Cache-Control: no-cache, no-store, must-revalidate'); // 禁用缓存
        header('Pragma: no-cache');
        header('Expires: 0');

        // 6. 输出图片内容到浏览器
        readfile($imageFile);

        // 7. 清理临时文件(可选,节省服务器存储空间)
        unlink($imageFile);
    }

    /**
     * 检查目录是否存在,不存在则创建(支持递归创建多级目录)
     * @param string $path 目录路径
     * @return string|false 成功返回目录路径,失败返回false
     * @throws \yii\base\Exception
     */
    public static function generateDir($path)
    {
        if (FileHelper::createDirectory($path, 0775, true)) {
            return $path;
        }
        return false;
    }

    /**
     * 根据URL生成二维码的Base64编码字符串
     * @param string $url 目标URL(需确保合法可访问)
     * @return string 二维码图片的Base64编码
     */
    public function generateImgBase64Str($url)
    {
        $qrCode = new QrCode();
        // 设置二维码内容、图片类型(PNG),生成Base64字符串
        return $qrCode->setText($url)
                      ->setImageType(QrCode::IMAGE_TYPE_PNG)
                      ->generate();
    }

    /**
     * 将Base64编码字符串转换为图片文件并保存
     * @param string $base64Str Base64编码的图片数据
     * @param string $savePath 图片保存目录(绝对路径)
     * @param string|null $prefix 文件名前缀(可选,默认无)
     * @return string|false 成功返回图片绝对路径,失败返回false
     */
    public function base64ToImg($base64Str, $savePath, $prefix = null)
    {
        if (empty($base64Str)) {
            return false;
        }

        // 生成唯一文件名(前缀+时间戳+随机数),避免重复
        $fileName = $prefix . time() . rand(100, 999) . '.png';
        $fullPath = rtrim($savePath, '/') . '/' . $fileName;

        // 解码Base64并写入文件
        $fileHandle = fopen($fullPath, "wb");
        if (!$fileHandle) {
            return false;
        }
        fwrite($fileHandle, base64_decode($base64Str));
        fclose($fileHandle);

        return $fullPath;
    }
}

使用说明

调用方式

在项目中实例化 TestService 类并调用 generateQrCode 方法即可触发二维码下载:

// 示例:在控制器中调用
use manage\Test\TestService;

public function actionQrCode()
{
    $testService = new TestService();
    // 可传递自定义UID,如:$testService->generateQrCode(10086);
    $testService->generateQrCode();
}

参数自定义

  1. 目标URL修改:直接修改 $targetUrl 变量,支持拼接动态参数(如用户ID、订单号等)。

  2. 下载文件名:修改 $downloadFileName 变量,date('His') 会生成当前时分秒(如143025),确保文件名唯一。

  3. 临时目录:修改 $tempDir 变量,建议选择有写入权限的目录(如 ./temp/)。

  4. 文件名前缀:调用 base64ToImg 方法时,可自定义 $prefix 参数(如改为 user_order_)。

功能效果

  1. 调用方法后,浏览器会自动触发文件下载,下载文件名为 小卜丢饭团子+时分秒.png(如 小卜丢饭团子143025.png)。

  2. 下载的图片为标准PNG格式,扫描后可跳转至预设的目标URL(如 http://www.xiaobudiu.top?uid=400570)。

  3. 临时文件生成后会自动删除,避免占用服务器存储空间(可根据需求注释 unlink($imageFile) 保留文件)。

五、注意事项

  1. 确保服务器已安装Composer,且网络可正常访问Packagist仓库(若无法访问,可配置Composer国内镜像)。

  2. 目录权限:临时存储目录需设置可写入权限(如0775),否则会导致文件创建失败。

  3. URL合法性:目标URL需确保格式正确(如包含 http://https://),否则二维码扫描后无法正常跳转。

  4. 依赖兼容:codeitnowin/barcode 包支持PHP 5.6+及PHP 7.x、8.x版本,需根据项目PHP版本选择合适的包版本。