php 前端生成二维码 微信扫一扫 二维码内容是一个H5 的连接

现有一个二维码,二维码是通过QrCode生成的,二维码的内容是一个H5的页面链接,web 生成二维码的时候,手机微信扫一扫,如何让它认为本次扫做是在微信环境进行的

    function isWechat() {

        var ua = window.navigator.userAgent.toLowerCase();

        //userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值。
        if (ua.match(/MicroMessenger/i) == 'micromessenger') {
               return true;
           } else {
               return false;
        }
    }


不就是在H5页面里面判断吗,你这个根据浏览器useragent判断也可以呀

这里使用的是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);

关于缓冲区,可以参考这个博客:
php利用ob_start()清除输出和选择性输出_铁柱的博客-CSDN博客 一、背景      有一段代码,因为调用了封装的方法,所以会有一些本来不需要的返回值。这些返回值该怎么处理才能让它消失呢。有的人会说,清除变量不就好了吗?但假如这个返回值无法清除,那又该怎么办呢?二、ob_start()1、概念:      此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。      内部缓冲区的内容可以用 ob http://blog.csdn.net/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、浏览器上显示二维码
img
如图,当点击按钮的时候,进行ajax请求。完成请求后,给img的src属性赋值。成功显示出二维码图片。

h5页面做访问环境限制,只能微信内置浏览器访问,就ok了,这方面的资料你去网上找找就可以了