这几天在开发公司的企业版块,想在每个企业的展示页面上添加一个公司的二维码,通过扫描二维码便可以将公司的信息导入手机通讯录中,想法产生了,于是开始搜索PHP生成二维码的方法,比较流行的方法主要有两种:1谷歌二维码API;2 PHP QR CODE;本文将重点介绍这两种方法。
方法一:谷歌二维码API
接口地址:https://chart.googleapis.com/chart
官方文档:https://developers.google.com/chart/infographics/docs/qr_codes
参数说明:
cht=qr:必要参数,固定值<qr>,表明要生成二维码
chs=<width>x<height>
:必要参数,生成二维码尺寸,单位是像素,目前生成的二维码都是正方形的,所以两个宽高值都设置为一样的值
chl=<data>
:必要参数,生成二维码包含的信息,可以是数字、字符、二进制信息、汉字。不能混合数据类型,数据必须经过UTF-8 URL-encoded.如果需要传递的信息超过2K个字节,需使用POST方式
choe=<output_encoding>
:可选参数,编码格式。包括UTF-8/Shift_JIS/ISO-8859-1三个选项,默认为UTF-8。
chld=<error_correction_level>|<margin>
:可选参数,
error_correction_level
:容错级别(共分四个等级,L-默认:可以识别已损失的7%的数据;M-可以识别已损失15%的数据;Q-可以识别已损失25%的数据;H-可以识别已损失30%的数据)
margin
:生成的二维码离图片边框的距离
例一:扫描二维码打开网址(API)
<?php
//二维码信息,用urlencode编码
$data = urlencode('http://www.baidu.com');
//生成二维码尺寸
$size = '300x300';
//完整的API地址
$qrurl = "http://chart.googleapis.com/chart?chs=$size&cht=qr&chl=$data&chld=L|1&choe=UTF-8";
//获取二维码
$qrcode = file_get_contents($qrurl);
//输出图片
header('Content-type: image/png');
echo $qrcode;
在打开一个网站之后,我们要来实现归初的目的,扫描二维码,将企业信息导入通讯录,即在二维码中包含一个名片信息,其实二维码说白了就是将一堆信息转换为图片的形式表达,而这堆信息到底是什么样子的它并不关心,真正关心这些信息的是扫描二维码的工具,以上面的例子来说,当你用微信扫描二维码后,微信读取到二维码中储存的数据,然后尝试开始辨别它,当它发现内容是百度的网址时便使用浏览器打开它,同样的当它发现内容是一堆简单的文本数据时便以文本的形式来显示,同样的微信还可以辨别出二维码的内容是不是一个 vcard 格式的电子名片,我们的手机通讯录导入导出的时候大多是这种格式,所以我们可以直接在二维码中包含一个标准的 vcard 电子名片,这样就可以让扫描工具将它识别为通讯录。
vcard 格式参考如下:
BEGIN:VCARD
VERSION:3.0
FN:用户名
TEL;CELL;VOICE:18858140621
TEL;WORK;VOICE:0358-2157466
TEL;WORK;FAX:0358-2157466
EMAIL;PREF;INTERNET:lzw#lzw.me
URL:http://lzw.me
orG:志文工作室
ROLE:产品部
TITLE:CTO
ADR;WORK;POSTAL:北京市朝阳区北四环中路35号;100101
REV:2012-12-27T08:30:02Z
END:VCARD
如果你想更详细的定制所需要的格式,请百度 vcard 的格式标准。
例二:生成一个名片二维码(API)
<?php
//构建一个 vcard 格式数据
$vcard =
"BEGIN:VCARD".
"\nVERSION:3.0".
"\nFN:小编络络".
"\nTEL;CELL;VOICE:18858140621".
"\nTEL;WORK;VOICE:0358-2157466".
"\nEMAIL:luoluo@qq.com".
"\nURL:http://www.baidu.com".
"\nADR:浙江省杭州市滨江区".
"\nEND:VCARD";
//二维码信息,用urlencode编码
$data = urlencode($vcard);
//生成二维码尺寸
$size = '300x300';
//完整的API地址
$qrurl = "http://chart.googleapis.com/chart?chs=$size&cht=qr&chl=$data&chld=L|1&choe=UTF-8";
//获取二维码
$qrcode = file_get_contents($qrurl);
//输出图片
header('Content-type: image/png');
echo $qrcode;
到此为止我们归初的目的已经基本实现,但实际使用中,由于直接将上述拼装好的 url 加到了 img 标签的 src 属性,结果出了点小问题,由于我们的名片信息比较多,导致了二维码生成错误,在本文开头已经用红色字体标出,get 方式最多只能传递 2K 大的数据,大于 2K 数据时我们需要使用 POST 请求,所以在实际使用中,可以先在程序中通过 POST 方式获取二维码并保存为本地图片,之后直接调用本地图片即可。
方法二:使用 PHP QR CODE 生成二维码
官方主页:http://phpqrcode.sourceforge.net
下载地址:http://sourceforge.net/projects/phpqrcode/
使用方法:QRcode::png($data, $filename , $errorCorrectionLevel, $matrixPointSize, $margin );
* $data 数据
* $filename 生成二维码保存路径,如果为 false 直接输出到浏览器
*$errorCorrectionLevel 错误处理级别 L、M、Q、H;同谷歌 API 中纠错级别
* $matrixPointSize 每个黑点的像素
* $margin 图片外围的白色边框像素
例三:扫描二维码打开网址(phpqrcode)
<?php
// 包含 qrlib.php 或 phpqrcode.php
// 包含 qrlib.php 需要同其它文件放到一起; phpqrcode.php 是合并后版本,只需要包含这个文件,但生成的图片速度慢而且不太准确
include('./phpqrcode/qrlib.php');
// 二维码数据
$data = 'http://www.111cn.net';
// 纠错级别:L、M、Q、H
$errorCorrectionLevel = 'L';
// 点的大小:1到10
$matrixPointSize = 5;
QRcode::png($data, false, $errorCorrectionLevel, $matrixPointSize, 2);
例二:生成一个名片二维码(phpqrcode)
<?php
// 包含 qrlib.php 或 phpqrcode.php
include('./phpqrcode/qrlib.php');
// 构建 vcard 数据
$vcard =
"BEGIN:VCARD".
"\nVERSION:3.0".
"\nFN:王歌".
"\nTEL;CELL;VOICE:18858140621".
"\nTEL;WORK;VOICE:0358-2157466".
"\nEMAIL:wang@qq.com".
"\nURL:http://www.mailuow.com".
"\nADR:浙江省杭州市滨江区江虹路1750号".
"\nEND:VCARD";
// 纠错级别:L、M、Q、H
$errorCorrectionLevel = 'L';
// 点的大小:1到10
$matrixPointSize = 4;
QRcode::png($vcard, false, $errorCorrectionLevel, $matrixPointSize, 2);
到此为止我们已经可以用两种方法来实现最初的想法了,但二维码是挂上去了,功能也实现了,不过总觉得不够华丽,如果再能把企业的 logo 嵌到二维码当中就好了,嘿嘿,当然这部分工作已经不在二维码生成的范筹了,接下来就要靠我们 PHP 中的 GD 库来完成了,但是有一点需要了解,我们在前面提到过二维码的容错级别,即二维码在损毁一部分之后仍有可能解析出完整信息,而给二维码中间添加 logo 后仍能解读出完整信息靠的正是它的高容错性。
网上有找到一些 PHP 生成带 Logo 二维码的方法,但不够细致,生成的二维码很难看,笔者试过好几种方法,现将效果最好的一种拿出来与大家分享。
整体思路如下图:
例五:生成带 Logo 二维码
<?php
// 包含 qrlib.php 或 phpqrcode.php include('./phpqrcode/qrlib.php');
// 构建 vcard 数据 $vcard = "BEGIN:VCARD". "\nVERSION:3.0". "\nFN:王歌". "\nTEL;CELL;VOICE:18858140621". "\nTEL;WORK;VOICE:0358-2157466". "\nEMAIL:wang@qq.com". "\nURL:http://www.mailuow.com". "\nADR:浙江省杭州市滨江区江虹路1750号". "\nEND:VCARD"; // 纠错级别:L、M、Q、H $errorCorrectionLevel = 'M'; // 点的大小:1到10 $matrixPointSize = 4; // 保存文件名 $filename = 'test.png'; //生成二维码 QRcode::png($vcard, $filename, $errorCorrectionLevel, $matrixPointSize, 2); //获取二维码 $qrcode = file_get_contents($filename); $qrcode = imagecreatefromstring($qrcode); $qrcode_width = imagesx($qrcode); $qrcode_height = imagesy($qrcode); //圆角图片 $corner = file_get_contents('./images/corner.png'); $corner = imagecreatefromstring($corner); $corner_width = imagesx($corner); $corner_height = imagesy($corner); //计算圆角图片的宽高及相对于二维码的摆放位置,将圆角图片拷贝到二维码中央 $corner_qr_height = $corner_qr_width = $qrcode_width/5; $from_width = ($qrcode_width-$corner_qr_width)/2; imagecopyresampled($qrcode, $corner, $from_width, $from_width, 0, 0, $corner_qr_width, $corner_qr_height, $corner_width, $corner_height); //logo图片 $logo = file_get_contents('./images/logo.jpg'); $logo = imagecreatefromstring($logo); $logo_width = imagesx($logo); $logo_height = imagesy($logo); //计算logo图片的宽高及相对于二维码的摆放位置,将logo拷贝到二维码中央 $logo_qr_height = $logo_qr_width = $qrcode_width/5 - 6; $from_width = ($qrcode_width-$logo_qr_width)/2; imagecopyresampled($qrcode, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height); header('Content-type: image/png'); imagepng($qrcode); imagedestroy($qrcode);
imagedestroy($corner);
imagedestroy($logo);
本例中使用到的 corner 图片: 右击另存为
本例中所有代码示例下载:http://yun.baidu.com/s/1c0ovV6w