• 技术文章 >后端开发 >php教程

    PHP生成带参数的微信小程序的二维码

    不言不言2018-07-14 10:32:33原创6181
    这篇文章主要介绍了关于PHP生成带参数的微信小程序的二维码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

    微信小程序官方开放了3个创建二维码的接口,其中有一个是生成二维码的,还有一个是葵花状的小程序码,我这里就用php生成二维码。

    首先要获取Access_token

    这个请求起来也是很容易的,微信开发文档有请求接口:
    要把自己的小程序的APPID和APPSECRET获取到

    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    access_token只有2小时有效期,所以要缓存最好,避免重复请求

    构建请求参数

    82595235-5b48a5179b503_articlex[1].png

    可以构建一个数组,然后转成json数据赋给一个变量

    $param = json_encode(array("path"=>"pages/index/index?id=123","width"=> 150));

    然后POST数据发送到微信服务器换取二维码

    完整代码

    <?php
    header('content-type:text/html;charset=utf-8');
    //配置APPID、APPSECRET
    $APPID = "APPID"; 
    $APPSECRET =  "APPSECRET"; 
    //获取access_token
    $access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$APPID&secret=$APPSECRET";
    
    //缓存access_token
     session_start();
     $_SESSION['access_token'] = "";
     $_SESSION['expires_in'] = 0;
    
     $ACCESS_TOKEN = "";
     if(!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in']))
     {
    
         $json = httpRequest( $access_token );
         $json = json_decode($json,true); 
         // var_dump($json);
         $_SESSION['access_token'] = $json['access_token'];
         $_SESSION['expires_in'] = time()+7200;
         $ACCESS_TOKEN = $json["access_token"]; 
     } 
     else{
    
         $ACCESS_TOKEN =  $_SESSION["access_token"]; 
     }
    
    //构建请求二维码参数
    //path是扫描二维码跳转的小程序路径,可以带参数?id=xxx
    //width是二维码宽度
    $qcode ="https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=$ACCESS_TOKEN";
    $param = json_encode(array("path"=>"pages/index/index?id=123","width"=> 150));
    
    //POST参数
    $result = httpRequest( $qcode, $param,"POST");
    //生成二维码
    file_put_contents("qrcode.png", $result);
    $base64_image ="data:image/jpeg;base64,".base64_encode( $result );
    
    //把请求发送到微信服务器换取二维码
      function httpRequest($url, $data='', $method='GET'){
        $curl = curl_init();  
        curl_setopt($curl, CURLOPT_URL, $url);  
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);  
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);  
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);  
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);  
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);  
        if($method=='POST')
        {
            curl_setopt($curl, CURLOPT_POST, 1); 
            if ($data != '')
            {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);  
            }
        }
    
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);  
        curl_setopt($curl, CURLOPT_HEADER, 0);  
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
        $result = curl_exec($curl);  
        curl_close($curl);  
        return $result;
      } 
    
    ?>

    使用方法:

    1、新建qrcode.php
    2、拷贝上面代码进去
    3、修改APPID和APPSECRET
    4、访问qrcode.php

    即可生成一个带参数的小程序二维码

    3971639280-5b48a66542e0f_articlex[1].png

    但是这个接口生成的是有LOGO的小程序二维码。
    我们想要生成一个简简单单的,无LOGO的小程序二维码可以吗?
    官方的是没有办法的,但是我们可以用第三方的接口生成普通的二维码的方式。

    生成无LOGO二维码步骤

    1、先解码,把刚才生成的小程序二维码解码,获得URL
    2、把获得的URL用普通的二维码生成接口生成普通的无LOGO的二维码

    1、解码

    解码其实有很多的库我这里直接用了第三方的JSSDK解码,免费的,需要申请接口和appid和appkey

    <h2>生成无LOGO二维码</h2>
    <!DOCTYPE html>
    <html>
      <head>
        <title>PHP生成微信小程序二维码</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="https://cdn.bootcss.com/zepto/1.0rc1/zepto.min.js"></script>
        <script src="hprose.min.js"></script>
        <script src="md5.min.js"></script>
      </head>
      <body>
        <!--显示二维码-->
        <p id="show_test"></p>
        <p id="select_img" style="display:none;">
            <input type="file" id="imgTest" type="file"  accept=".gif,.jpg,.jpeg,.png">
            <br/>
            <img src="" id="showImage" alt="">
        </p>
        <a href="javascript:;" id="qrdecode">点击生成无LOGO二维码</a>
        <script>
    
        var get_timestamp = function(){
            var timestamp =0;
            timestamp = Date.parse(new Date());// 获取当前时间戳(以s为单位)
            timestamp = timestamp / 1000;
            return timestamp;
        };
    
        //config,申请解码接口:http://www.wwei.cn/,免费
        var api_id = 'xxxxxxx';//改为您自己的
        var api_key = 'xxxxxxxxx';//改为您自己的
        var timestamp = get_timestamp();
        var client = hprose.Client.create('http://hprose.wwei.cn/qrcode.html', ['qrencode','qrdecode']);
    
        //解码
        $("#qrdecode").click(function(){
                var timestamp = get_timestamp();
                var imgurl = '';//远程图片
                var imgdata ='<?php echo $base64_image;?>';//本地图片,直接调用生成的官方小程序二维码,用于解码
                var signature = md5(api_key + timestamp + imgurl + imgdata);
                client.ready(function(qrcode) {
                    qrcode.qrdecode(api_id,signature,timestamp,imgurl,imgdata)
                    .then(function(result) {
                        if(result.status !=1){
                            alert(result.msg);
                            return ;
                        }
    
                        //生成无LOGO二维码api接口
                        var qrcodeapi = "http://qr.liantu.com/api.php?text=";
                        //拼接接口+解码url并输出为图片
                        $("#show_test").html('<img src="'+qrcodeapi+result.data.raw_text+'"/>');
                    },function(e) {
                        console.error(e);
                    });
                },
                function(e) {
                    console.error(e);
                });
        });
        </script>
      </body>
    </html>

    上面是通过js来实现的解码,解码还是调用了php生成的二维码的一个图片地址的

    <?php echo $base64_image;?>

    上面是调用本地图片,所以需要结合php生成小程序二维码的代码使用这个解码程序。

    解码后需要生成无LOGO的二维码,这个我只需要调用一个接口就行。
    接口:http://qr.liantu.com/api.php?...

    然后拼接解码后的url就可以生成一个二维码了。

    4153609525-5b48a88a453dd_articlex[1].png

    那么生成小程序码和生成无LOGO二维码的代码结合起来就是:

    <?php
    header('content-type:text/html;charset=utf-8');
    //配置APPID、APPSECRET
    $APPID = "APPID"; 
    $APPSECRET =  "APPSECRET"; 
    //获取access_token
    $access_token = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$APPID&secret=$APPSECRET";
    
    //缓存access_token
     session_start();
     $_SESSION['access_token'] = "";
     $_SESSION['expires_in'] = 0;
    
     $ACCESS_TOKEN = "";
     if(!isset($_SESSION['access_token']) || (isset($_SESSION['expires_in']) && time() > $_SESSION['expires_in']))
     {
    
         $json = httpRequest( $access_token );
         $json = json_decode($json,true); 
         // var_dump($json);
         $_SESSION['access_token'] = $json['access_token'];
         $_SESSION['expires_in'] = time()+7200;
         $ACCESS_TOKEN = $json["access_token"]; 
     } 
     else{
    
         $ACCESS_TOKEN =  $_SESSION["access_token"]; 
     }
    
    //构建请求二维码参数
    //path是扫描二维码跳转的小程序路径,可以带参数?id=xxx
    //width是二维码宽度
    $qcode ="https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=$ACCESS_TOKEN";
    $param = json_encode(array("path"=>"pages/index/index?id=123","width"=> 150));
    
    //POST参数
    $result = httpRequest( $qcode, $param,"POST");
    //生成二维码
    file_put_contents("qrcode.png", $result);
    $base64_image ="data:image/jpeg;base64,".base64_encode( $result );
    
    //把请求发送到微信服务器换取二维码
      function httpRequest($url, $data='', $method='GET'){
        $curl = curl_init();  
        curl_setopt($curl, CURLOPT_URL, $url);  
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);  
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);  
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);  
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);  
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);  
        if($method=='POST')
        {
            curl_setopt($curl, CURLOPT_POST, 1); 
            if ($data != '')
            {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);  
            }
        }
    
        curl_setopt($curl, CURLOPT_TIMEOUT, 30);  
        curl_setopt($curl, CURLOPT_HEADER, 0);  
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
        $result = curl_exec($curl);  
        curl_close($curl);  
        return $result;
      } 
    
    ?>
    
    <h2>生成小程序官方二维码</h2>
    <!-- 生成小程序官方二维码 -->
    <img src="<?php echo $base64_image;?>"/>
    
    <br/>
    <h2>生成无LOGO二维码</h2>
    <!-- 生成无LOGO二维码 -->
    <!DOCTYPE html>
    <html>
      <head>
        <title>PHP生成微信小程序二维码</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="https://cdn.bootcss.com/zepto/1.0rc1/zepto.min.js"></script>
        <script src="hprose.min.js"></script>
        <script src="md5.min.js"></script>
      </head>
      <body>
        <p id="show_test"><!--显示信息--></p>
        <p id="select_img" style="display:none;">
            <input type="file" id="imgTest" type="file"  accept=".gif,.jpg,.jpeg,.png">
            <br/>
            <img src="" id="showImage" alt="">
        </p>
        <a href="javascript:;" id="qrdecode">点击生成无LOGO二维码</a>
        <script>
    
        var get_timestamp = function(){
            var timestamp =0;
            timestamp = Date.parse(new Date());// 获取当前时间戳(以s为单位)
            timestamp = timestamp / 1000;
            return timestamp;
        };
    
        //config,申请解码接口:http://www.wwei.cn/,免费
        var api_id = 'xxx';//改为您自己的
        var api_key = 'xxx';//改为您自己的 (实际使用,建议在后台完成 signature 签名,以防暴露 api_key ,或定期更改)
        var timestamp = get_timestamp();
        var client = hprose.Client.create('http://hprose.wwei.cn/qrcode.html', ['qrencode','qrdecode']);
    
        //解码
        $("#qrdecode").click(function(){
                var timestamp = get_timestamp();
                var imgurl = '';//远程图片
                var imgdata ='<?php echo $base64_image;?>';//本地图片,直接调用生成的官方小程序二维码,用于解码
                var signature = md5(api_key + timestamp + imgurl + imgdata);
                client.ready(function(qrcode) {
                    qrcode.qrdecode(api_id,signature,timestamp,imgurl,imgdata)
                    .then(function(result) {
                        if(result.status !=1){
                            alert(result.msg);
                            return ;
                        }
    
                        //生成无LOGO二维码api接口
                        var qrcodeapi = "http://qr.liantu.com/api.php?text=";
                        //拼接接口+解码url并输出为图片
                        $("#show_test").html('<img src="'+qrcodeapi+result.data.raw_text+'"/>');
                    },function(e) {
                        console.error(e);
                    });
                },
                function(e) {
                    console.error(e);
                });
        });
        </script>
      </body>
    </html>

    但是解码需要用到的两个js库

    以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

    相关推荐:

    php大牛分享:php代码编写的规范,总结的很全

    以上就是PHP生成带参数的微信小程序的二维码的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php大牛分享:php代码编写的规范,总结的很全 下一篇:对于pdo结构体的梳理代码
    千万级数据并发解决方案

    相关文章推荐

    • 欧拉回路的使用&&http://acm.hdu.edu.cn/showproblem.php?pid=3018• 关于PHP中获取随绝密码的疑问• php基础之位演算• 这么写是为啥?运行过程是怎样的• 上载上来的网站不能登录什么有关问题
    1/1

    PHP中文网