一、背景

      需求是需要在后台点击生成二维码,然后这个二维码不上传到服务器。我们需要把二维码返回给前台页面,并且显示出来。

二、实现过程

1、生成二维码

      这里使用的是qrcode这个第三方。网上百度,教程一大堆,这里我就不细说了。这边使用的是tp3.2.3框架。

//引入第三方
 Vendor('phpqrcode.phpqrcode');
    $errorCorrectionLevel =intval($level) ;//容错级别
    $matrixPointSize = intval($size);//生成图片大小
//实例化qrcode方法
    $object = new \QRcode();
    //生成二维码。第二个参数是false,代表不保存路径
    $object->png($url, false, $errorCorrectionLevel, $matrixPointSize, 2);

2、把二维码路径返回给前端。

      这里需要明确,png()方法返回的是二进制的图片流。所以直接返回是没用的。如果打印返回值的话,我们会发现,返回值是null。所以这里,采用ob_start(),利用缓冲区进行一系列的操作

$object = new \QRcode();
    //打开缓冲区
    ob_start();
    $object->png($url, false, $errorCorrectionLevel, $matrixPointSize, 2);
    //这里就是把生成的图片流从缓冲区保存到内存对象上,使用base64_encode变成编码字符串,通过json返回给页面。
    $imageString = base64_encode(ob_get_contents());
    //关闭缓冲区
    ob_end_clean();
    //把生成的base64字符串返回给前端
    $data = array(
      'code'=>200,
      'data'=>$imageString
    );
    $this->ajaxReturn($data);

关于缓冲区,大家可以参考这个博客:
http://blog.csdn/ljfphp/article/details/78839654

我们这里把字符串返回给前端。

3、前端处理字符串,并且显示出二维码

  success: function(r) {
        if (r.code==200) {
          //console.log(r);
          var path = 'data:image/png;base64,'+r.data;
          //给img的sec赋值。

          $("#qrcode").attr('src',path);
        } else {
          alert(r.err);
        }

1)以上是ajax的success方法。当成功返回之后,我们需要给img的src赋值
2)但是由于是base64字符串,所以我们需要解析这个字符串。这里是给img的src赋值为:

<img src="data:image/png;base64,这里是base64编码内容" />
//也就是咱们上面代码的
'data:image/png;base64,'+r.data;
//r.data就是返回的字符串

4、浏览器上显示二维码

如图,当点击按钮的时候,进行ajax请求。完成请求后,给img的src属性赋值。成功显示出二维码图片。(PS:页面有点丑,不要见怪)

老了老了,熬不住了。晚安,各位。

end

参考链接:
https://www.jianshu/p/768e72938237

更多推荐

php生成二维码并返回给前端页面显示