您现在的位置是:网站首页 > 心得笔记

微信公众号开发——生成二维码接口

盛悦2019-02-22539人围观
简介为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。

参考开发者文档-》账号管理-》生成带参数的二维码

1、二维码类型

    临时二维码:有一个短暂的过期时间 最长可以设置为在二维码生成后的30天 但能够生成较多数量 临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景 (数量多,但会过期)

    永久二维码:目前支持十万个 不会过期(数量少,但不会过期)

    两者有一个共同点:无论用户是已关注公众号或者是未关注公众号,在扫描后都会返回一个场景值给开发者(场景值可以标识你是从哪一个渠道过来的)


2、生成二维码步骤

    步骤一:获取ticket票据

    

        临时二维码请求说明:

http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST数据格式:json
POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 1000}}}//这里的scene_id自己定义  只是为了区分是临时二维码还是永久二维码

或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

       永久二维码请求说明:

http请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST数据格式:json
POST数据例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 2000}}}

或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}


参数说明

参数说明
expire_seconds该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
action_name二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值
action_info二维码详细信息
scene_id场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
scene_str场景值ID(字符串形式的ID),字符串类型,长度限制为1到64


返回说明

正确的Json返回结果:

{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm
3sUw==","expire_seconds":60,"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"}
参数说明
ticket获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。
expire_seconds该二维码有效时间,以秒为单位。 最大不超过2592000(即30天)。
url

    

步骤二:通过ticket换取二维码图片

请求说明

HTTP GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
提醒:TICKET记得进行UrlEncode

返回说明

ticket正确情况下,http 返回码是200,是一张图片,可以直接展示或者下载。


3、代码生成二维码实例

在前几篇文章的基础上新增方法:

//获取临时二维码
public function getQrCode () {
    //1、获取ticket票据
    $access_token = $this->getWxAccessToken();//前面类中已定义该方法
    $url = " . $access_token ;
    $postArr = array(
                    'expire_seconds' => 604800,//过期时间7天
                    'action_name' => 'QR_SCENE',//场景类型
                    'action_info' => array(//场景信息
                        'scene' => array('scene_id' => 1000),
                    ),
    );
    $postJson = json_encode($postArr);
    $res = $this->http_curl($url, 'post', 'json', $postJson);
    $ticket = $res['ticket'];
    
    //2、通过ticket换取二维码图片
    $url = " . urlencode($ticket) ;
    echo "<img src='$url' />";//返回说明:ticket正确情况下,http 返回码是200,是一张二维码图片,可以直接展示或者下载。
    
}
//获取永久二维码
public function getForeverCode () {
    //1、获取ticket票据
    $access_token = $this->getWxAccessToken();
    $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' . $access_token;
    //{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
    $postArr = array(
        'action_name' => 'QR_LIMIT_SCENE',
        'action_info' => array(
            'scene' => array('scene_id' => 2000),
        ),
    );
    $postJson = json_encode($postArr);
    $res = $this->http_curl($url, 'post', 'json', $postJson);
    $ticket = $res['ticket'];
    //2、通过ticket换取二维码图片
    $url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket);
    echo "<img src='$url' />";

}


以上两代码执行结果是:

e(1).png


d(1).png


生成二维码后,我们可继续操作消息管理下的扫描二维码事件推送,例如,我的需求是:扫描二维码后推送给微信用户一个图文消息!!!


扫描带参数二维码事件

用户扫描带场景值二维码时,可能推送以下两种事件:

  1. 如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。

  2. 如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。

1. 用户未关注时,进行关注后的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[FromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[subscribe]]></Event><EventKey><![CDATA[qrscene_123123]]></EventKey><Ticket><![CDATA[TICKET]]></Ticket></xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,subscribe
EventKey事件KEY值,qrscene_为前缀,后面为二维码的参数值
Ticket二维码的ticket,可用来换取二维码图片

2. 用户已关注时的事件推送

推送XML数据包示例:

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[FromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[SCAN]]></Event><EventKey><![CDATA[SCENE_VALUE]]></EventKey><Ticket><![CDATA[TICKET]]></Ticket></xml>

参数说明:

参数描述
ToUserName开发者微信号
FromUserName发送方帐号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,event
Event事件类型,SCAN
EventKey事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id
Ticket二维码的ticket,可用来换取二维码图片


继续在代码中操作,这里在前几篇中代码api()中继续添加:

public function api()
    {
        $echoStr = isset($_GET["echostr"]) ? $_GET["echostr"] : '';
        if (!empty($echoStr) && $this->checkSignature()) {
            echo $echoStr;
            exit;
        } else {
            $postStr = file_get_contents("php://input", 'r');
            //写入日志  在同级目录下建立php_log.txt
            error_log(var_export($postStr,1),3,'php_log.txt');

            if (!empty($postStr)){
                libxml_disable_entity_loader(true);
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
               
                //如果是重扫二维码
                if (strtolower( $postObj->MsgType ) == 'event') {
                    if (strtolower( $postObj->Event ) == 'scan') {
                        if ($postObj->EventKey == 1000) {//自己定义的临时二维码scene_id = 1000 永久是2000
                            $tmp = '临时二维码欢迎你';
                        } elseif ($postObj->EventKey == 2000) {
                            $tmp = '永久二维码欢迎你';
                        }
                        $arr = array(//从数据库中得到或自定义
                            array(
                                'title' => $tmp,
                                'description' => "imooc is very cool",
                                'picUrl' => 'https://www.chuangkit.com/ruanjian/assets/i/002.jpg',
                                'url' => 'http://www.imooc.com',
                            ),
                        );
                        $test->responseNews($postObj, $arr);
                    }
                }
                
            } else {
                echo "";
                exit;
            }
        }

    }



    //检查签名
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = "weixin";
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);
        if($tmpStr == $signature){
            return true;

        }else{
            return false;
        }
    }


再执行代码(扫描二维码):

s(1).png