您现在的位置是:网站首页 > 心得笔记
微信公众号开发——生成二维码接口
简介为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。
参考开发者文档-》账号管理-》生成带参数的二维码
1、二维码类型
永久二维码:目前支持十万个 不会过期(数量少,但不会过期)
两者有一个共同点:无论用户是已关注公众号或者是未关注公众号,在扫描后都会返回一个场景值给开发者(场景值可以标识你是从哪一个渠道过来的)
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' />"; }
以上两代码执行结果是:
生成二维码后,我们可继续操作消息管理下的扫描二维码事件推送,例如,我的需求是:扫描二维码后推送给微信用户一个图文消息!!!
扫描带参数二维码事件
用户扫描带场景值二维码时,可能推送以下两种事件:
如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。
如果用户已经关注公众号,则微信会将带场景值扫描事件推送给开发者。
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; } }
再执行代码(扫描二维码):
上一篇:微信公众号开发——JS-SDK
下一篇:PHP页面静态化