目前一些微信发公众平台的渠道二维码功能都是收费的,网上也没有找到源码,于是自己偷懒的心就浇了盆冷水。果然还是得自己动手丰衣足食啊。
一、前期准备
渠道二维码的作用是方便公众号统计关注的来源,原理是用户扫描带参数的二维码,微信服务器会向开发者服务器推送一条带着EventKey参数消息:
EventKey :事件KEY值,qrscene_为前缀,后面为二维码的参数值
推送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 = "
%s
0
";
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 "";
echo "ID:".$i;
五、统计页面的开发
这边主要用到了SQL的知识。
将统计值全部读取出来,循环输出即可。
SQL: SELECT * FROM qc
统计
";
}
?>