1. 程式人生 > >微信公眾號開發(十一)生成帶引數二維碼

微信公眾號開發(十一)生成帶引數二維碼

公眾平臺提供了生成帶引數二維碼的介面。使用該介面可以獲得多個帶不同場景值的二維碼,使用者掃描後,公眾號可以接收到事件推送。

目前有2種類型的二維碼:

1、臨時二維碼,是有過期時間的,最長可以設定為在二維碼生成後的30天(即2592000秒)後過期,但能夠生成較多數量。臨時二維碼主要用於帳號繫結等不要求二維碼永久儲存的業務場景
2、永久二維碼,是無過期時間的,但數量較少(目前為最多10萬個)。永久二維碼主要用於適用於帳號繫結、使用者來源統計等場景。

使用者掃描帶場景值二維碼時,可能推送以下兩種事件:

如果使用者還未關注公眾號,則使用者可以關注公眾號,關注後微信會將帶場景值關注事件推送給開發者。

如果使用者已經關注公眾號,在使用者掃描後會自動進入會話,微信也會將帶場景值掃描事件推送給開發者。

獲取帶引數的二維碼的過程包括兩步,首先建立二維碼ticket,然後憑藉ticket到指定URL換取二維碼。

獲取帶引數的二維碼的過程包括兩步,首先建立二維碼ticket,然後憑藉ticket到指定URL換取二維碼。

每次建立二維碼ticket需要提供一個開發者自行設定的引數(scene_id:整數)或者(scene_str:字串)。

1、建立臨時二維碼ticket
介面:https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN 當引數為整數時,tmp_ticket_id.php
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php");
$data = '{
    "expire_seconds": 604800,
    "action_name": "QR_SCENE",
    "action_info": {
        "scene": {
            "scene_id": 100
        }
    }
}';
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?"
    ."access_token=".Utils::get_access_token();
$result = Utils::https_request($url, $data);
echo $result;
返回:
{
    "ticket": "gQHv8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyRW52QnMxeEZlcGkxLXFNNWhwMS0AAgQatrxZAwSAOgkA",
    "expire_seconds": 604800,
    "url": "http://weixin.qq.com/q/02EnvBs1xFepi1-qM5hp1-"
}
當引數為字串時,tmp_ticket_str.php
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php");
$data = '{
    "expire_seconds": 604800,
    "action_name": "QR_STR_SCENE",
    "action_info": {
        "scene": {
            "scene_str": "abcd"
        }
    }
}';
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?"
    ."access_token=".Utils::get_access_token();
$result = Utils::https_request($url, $data);
echo $result;
返回:
{
    "ticket": "gQEN8TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNGZPSnRXeEZlcGkxLWhQNTFwYzEAAgQRubxZAwSAOgkA",
    "expire_seconds": 604800,
    "url": "http://weixin.qq.com/q/024fOJtWxFepi1-hP51pc1"
}
2、建立永久二維碼ticket
當引數為數字時,never_ticket_id,php
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php");
$data = '{
    "action_name": "QR_LIMIT_SCENE",
    "action_info": {
        "scene": {
            "scene_id": 111
        }
    }
}';
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?"
    ."access_token=".Utils::get_access_token();
$result = Utils::https_request($url, $data);
echo $result;
返回:
{
    "ticket": "gQH88DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyYk44LXNGeEZlcGkxMDAwMHcwM2gAAgRiubxZAwQAAAAA",
    "url": "http://weixin.qq.com/q/02bN8-sFxFepi10000w03h"
}
當引數為字串時,never_ticket_str.php
<?php
@header('Content-type: text/plain;charset=UTF-8');
require_once("../Utils.php");
$data = '{
    "action_name": "QR_LIMIT_STR_SCENE",
    "action_info": {
        "scene": {
            "scene_str": "haha"
        }
    }
}';
$url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?"
    ."access_token=".Utils::get_access_token();
$result = Utils::https_request($url, $data);
echo $result;
返回:
{
    "ticket": "gQHf8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydmhZenQzeEZlcGkxMDAwMHcwN1EAAgQGu7xZAwQAAAAA",
    "url": "http://weixin.qq.com/q/02vhYzt3xFepi10000w07Q"
}
3、通過ticket換取二維碼圖片
介面:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET,TICKET記得進行UrlEncode 該操作無需登入或授權即可呼叫,也就是說可以直接在瀏覽器中開啟該連結獲取圖片。 例如開啟以上永久二維碼的id圖片: https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQH88DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyYk44LXNGeEZlcGkxMDAwMHcwM2gAAgRiubxZAwQAAAAA

開啟以上永久二維碼str圖片 https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQHf8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydmhZenQzeEZlcGkxMDAwMHcwN1EAAgQGu7xZAwQAAAAA


4、掃碼
呼叫微信掃一掃功能,掃描上面的二維碼,如果已關注會發送以下XML資料給開發者,並跳轉到公眾號,開發者此時不能回覆空字串,否則會報錯。
<xml>
    <ToUserName>
        <![CDATA[gh_6b9aa8a6f1e2]]>
    </ToUserName>
    <FromUserName>
        <![CDATA[o4WmZ0h-4huBUVQUczx2ezaxIL9c]]>
    </FromUserName>
    <CreateTime>1505542211</CreateTime>
    <MsgType>
        <![CDATA[event]]>
    </MsgType>
    <Event>
        <![CDATA[SCAN]]>
    </Event>
    <EventKey>
        <![CDATA[haha]]>
    </EventKey>
    <Ticket>
        <![CDATA[gQHf8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydmhZenQzeEZlcGkxMDAwMHcwN1EAAgQGu7xZAwQAAAAA]]>
    </Ticket>
</xml>
如果使用者未關注,掃描後會彈出以下介面讓使用者關注 點選關注後會推送給開發者如下訊息,事件為subscribe關注事件,EventKey為qrscene_  +二維碼引數值。
<xml>
    <ToUserName>
        <![CDATA[gh_6b9aa8a6f1e2]]>
    </ToUserName>
    <FromUserName>
        <![CDATA[o4WmZ0h-4huBUVQUczx2ezaxIL9c]]>
    </FromUserName>
    <CreateTime>1505542651</CreateTime>
    <MsgType>
        <![CDATA[event]]>
    </MsgType>
    <Event>
        <![CDATA[subscribe]]>
    </Event>
    <EventKey>
        <![CDATA[qrscene_haha]]>
    </EventKey>
    <Ticket>
        <![CDATA[gQHf8DwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAydmhZenQzeEZlcGkxMDAwMHcwN1EAAgQGu7xZAwQAAAAA]]>
    </Ticket>
</xml>