zoukankan      html  css  js  c++  java
  • PHP生成二维码【谷歌API+qrcode+圆角Logo】

    方法一:谷歌二维码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".
        "
    VERSION:3.0".
        "
    FN:小编络络".
        "
    TEL;CELL;VOICE:18858140621".
        "
    TEL;WORK;VOICE:0358-2157466".
        "
    EMAIL:luoluo@qq.com".
        "
    URL:http://www.baidu.com".
        "
    ADR:浙江省杭州市滨江区".
        "
    END: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 方式获取二维码并保存为本地图片,之后直接调用本地图片即可。

    例五:生成带 Logo 二维码

    
    
    复制代码
    
    
    <?php
    // 包含 qrlib.php 或 phpqrcode.php
    include('./phpqrcode/qrlib.php');
    // 构建 vcard 数据
    $vcard = "BEGIN:VCARD". " VERSION:3.0". " FN:王歌". " TEL;CELL;VOICE:18858140621". " TEL;WORK;VOICE:0358-2157466". " EMAIL:wang@qq.com". " URL:http://www.mailuow.com". " ADR:浙江省杭州市滨江区江虹路1750号". " END: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);
     
     
     
  • 相关阅读:
    浅谈MyBatis-Plus学习之条件构造器 EntityWrapper
    浅谈MyBatis-Plus学习之插件扩展
    [XSS防御]HttpOnly之四两拨千斤
    [PHP防火墙]输入内容存在危险字符,安全起见,已被本站拦截
    [思路笔记]WEB安全之漏洞挖掘
    通过TleChat插件一键Getshell
    云服务器上安装MSF环境
    (vshadow)Volume Shadow在渗透测试中的利用
    一个帖子csrf的例子
    yuyuecms 1.2文件删除漏洞
  • 原文地址:https://www.cnblogs.com/xlz307/p/3736697.html
Copyright © 2011-2022 走看看