写点什么

微信公众平台 - 渠道二维码开发

用户头像
Geek_247dae
关注
发布于: 2021 年 02 月 26 日
微信公众平台-渠道二维码开发

一、前期准备

渠道二维码的作用是方便公众号统计关注的来源,原理是用户扫描带参数的二维码,微信服务器会向开发者服务器推送一条带着 EventKey 参数消息:

EventKey :事件 KEY 值,qrscene_为前缀,后面为二维码的参数值


推送 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>


这时候开发者服务器应该对不同的参数进行判断,以便进入下一步的业务流程。

拥有带参数的二维码接口的目前只有认证过的服务号。

本教程基于 Mysql+PHP 解决。


二、数据库

数据库我们设置 3 个字段

ID INT

TODAY INT

TOTIL INT


三、服务器端逻辑

参考微信公众平台开发文档

首先进行接入。

示例代码:


define("TOKEN", "weixin"); //与微信后台开发者配置一致$wechatObj = new wechatCallbackapiTest();$wechatObj-> valid()class wechatCallbackapiTest{public function valid(){    $echoStr = $_GET["echostr"];
//valid signature , option if($this->checkSignature()){ echo $echoStr; exit; }}private function checkSignature(){ // you must define TOKEN by yourself if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; }} public function responseMsg(){ //get post data, May be due to the different environments $postStr = file_get_contents("php://input");
//extract post data if (!empty($postStr)){ /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, the best way is to check the validity of xml by yourself */ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $Event = $postObj->Event; $EventKey=$postObj->EventKey; $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; if($Event=="SCAN") { $msgType = "text"; $contentStr = "您已经关注啦!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } if($Event=="subscribe" and !empty($EventKey)){ if(strpos($EventKey,"qrscene_")==0){ $id=substr($EventKey,8); $db=mysql_connect("数据库地址","用户名","密码");//在这里分别把数据库地址用户名和密码替换进去 mysql_select_db("数据库名",$db);//在这里填写数据库名 mysql_query("UPDATE qc SET total=total+1,today=today+1 WHERE id=".$id); $msgType = "text"; $contentStr = $id; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } }
}else { echo ""; exit; }}}
复制代码

以上的示例代码中,根据注释改填入数据库信息即可。

逻辑如下:

如果接受到消息不为空:if (!empty($postStr))

则进行 XML 解析,将 XML 解析为对象。

当事件为扫描(即已经关注的用户扫描二维码后,事件值便是 SCAN),则直接输出“您已经关注”即可。

如果事件为关注($Event=="subscribe")同时参数不为空(!empty($EventKey)),则截取出参数值 substr($EventKey,8)。参数值为 ID,即渠道二维码的 ID

连接数据库,将对应的 ID 二维码相应的值+1 统计。

UPDATE qc SET total=total+1,today=today+1 WHERE id=


关于接入指南:参考微信公众平台开发者文档,详细接入过程这边不再详细介绍,只介绍根据参数进行统计的思路。

四、生成参数二维码

假设我们要生产 100 个渠道二维码,在我们完成获取 token 参数后,使用循环获取 100 个参数二维码。设置参数 i 自增,直接作为参数二维码的参数。

$http="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";//设置请求网址$content=file_get_contents($http);//发送请求$json=json_decode($content,true);//解析返回数据$token=$json['access_token'];//提取token$url="https://api.weixin.qq.com/cgi-bin/qrcode/create? access_token=".$token;//组合请求网址for($i=1;$i<=100;$i++){$ch = curl_init ();//初始化$data='{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id":'.$i.'}}}';curl_setopt ( $ch, CURLOPT_URL, $url);curl_setopt ( $ch, CURLOPT_POST, 1 );curl_setopt ( $ch, CURLOPT_HEADER, 0 );curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data);$return = curl_exec ( $ch );curl_close ( $ch );$re=json_decode($return,true);$http="https://mp.weixin.qq.com/cgi-bin/showqrcode?  ticket=".urlencode($re['ticket']);//组合出二维码网址echo "<img src=".$http.">";echo "ID:".$i;
复制代码


用户头像

Geek_247dae

关注

还未添加个人签名 2020.09.18 加入

还未添加个人简介

评论

发布
暂无评论
微信公众平台-渠道二维码开发