资讯专栏INFORMATION COLUMN

PHP-生成二维码(qr-code)

endless_road / 3158人阅读

摘要:生成二维码首先我们需要在项目中引入类文件,现在基本上是通过命名空间路径的方式进行自动加载,它的位置位于扩展根目录的文件中。

1.为什么要写这篇文章

最近做项目要生成二维码让用户做跳转,搜索了一下发现网上都是用一个叫做 phpqrcode 的扩展,在 github 上搜索了一下发现这个项目作者在6年前就已经没有维护了,百度的文章也是千篇一律的你复制我的我复制你的,所以只好在 github 上看看有没有更好的关于 PHP 生成二维码的扩展,之后找到了一个项目名称为 qr-code 的扩展,感觉不错,作者也一直在做维护,使用也是简单方便。所以在这里把这个扩展的安装使用说明一下,方便各位的开发。

qr-code 项目的github 地址为:qr-code

2.安装 qr-code

这里我们通过composer 来安装扩展,composer 也算是现在比较火的包管理工具了,如果对composer 不太了解的话,可以看下我以前的文章:

《php-composer的安装与使用方法》

我的环境为 linux,我们键入以下命令来进行该扩展的安装:

composer require endroid/qr-code

当扩展安装完毕后,我们就可以开始下面的操作了。

3.生成二维码

首先我们需要在项目中引入qr-code 类文件,composer 现在基本上是通过psr-4 "命名空间": "路径" 的方式进行自动加载,它的位置位于扩展根目录的 composer.json 文件中。

好了,现在我们引入qr-code 类文件,并尝试输出一个简单的二维码。

use EndroidQrCodeQrCode;

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

好了,当指定了内容类型后,会直接在页面输出二维码

那这种直接输出的二维码怎么应用于项目中呢,一般都是直接写在html 中的

这样,就可以把二维码显示在页面的任意位置了。当然,我们也可以把它存入文件中,生成一个任意格式的图片,比如说:

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

这样我们就可以根据图片路径在页面上展示二维码了

4.简单的示例文件以及常用参数介绍

这里,我贴出一个简单的类处理文件,并介绍一下qr-code 常用的一些参数。

类文件:

namespace "命名空间";

use EndroidQrCodeErrorCorrectionLevel;
use EndroidQrCodeLabelAlignment;
use EndroidQrCodeQrCode;

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") {
            // 前端调用 例:
            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 - 二维码大小 px
setWriterByName - 写入文件的后缀名
setMargin - 二维码内容相对于整张图片的外边距
setEncoding - 编码类型
setErrorCorrectionLevel - 容错等级,分为L、M、Q、H四级
setForegroundColor - 前景色
setBackgroundColor - 背景色
setLabel - 二维码标签
setLogoPath - 二维码logo路径
setLogoWidth - 二维码logo大小 px

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28250.html

相关文章

  • Canvas 进阶(二)写一个生成带logo的维码npm插件

    摘要:背景最近接触到的需求,前端生成一个带企业的二维码,并支持点击下载它。 背景 最近接触到的需求,前端生成一个带企业logo的二维码,并支持点击下载它。 实现 在前面的文章有讲到如何用 canvas 画二维码,在此基础上再画一个公司logo,并提供下载的方法供调用,再封装成 npm 插件 模块名称: qrcode-with-logos github地址:https://github.com...

    Chaz 评论0 收藏0
  • PHP生成微信小程序维码,可生成带参数维码

    摘要:微信小程序官方开放了个创建二维码的接口,其中有一个是生成二维码的,还有一个是葵花状的小程序码,我这里就用生成二维码。 微信小程序官方开放了3个创建二维码的接口,其中有一个是生成二维码的,还有一个是葵花状的小程序码,我这里就用php生成二维码。 首先要获取Access_token 这个请求起来也是很容易的,微信开发文档有请求接口:要把自己的小程序的APPID和APPSECRET获取到 h...

    jsliang 评论0 收藏0
  • PHP生成微信小程序维码,可生成带参数维码

    摘要:微信小程序官方开放了个创建二维码的接口,其中有一个是生成二维码的,还有一个是葵花状的小程序码,我这里就用生成二维码。 微信小程序官方开放了3个创建二维码的接口,其中有一个是生成二维码的,还有一个是葵花状的小程序码,我这里就用php生成二维码。 首先要获取Access_token 这个请求起来也是很容易的,微信开发文档有请求接口:要把自己的小程序的APPID和APPSECRET获取到 h...

    afishhhhh 评论0 收藏0
  • PHP生成简单维码

    摘要:一二维码在现实生活中经常用的到,但二维码如何生成的呢现在我们就开始学习啦二从网上下载相应的工具包,链接下载解压并放到项目目录中去。代码示例四我们可以利用二维码生成电子名片,然后用微信扫码功能就能得到名片信息了。 一 二维码在现实生活中经常用的到,但二维码如何生成的呢?现在我们就开始学习啦! 二 从网上下载相应的工具包,链接,下载解压phpqrcode并放到项目目录中去。 三 首先我们需...

    MkkHou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<