神刀安全网

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

目前一些微信发公众平台的渠道二维码功能都是收费的,网上也没有找到源码,于是自己偷懒的心就浇了盆冷水。果然还是得自己动手丰衣足食啊。

一、前期准备

渠道二维码的作用是方便公众号统计关注的来源,原理是用户扫描带参数的二维码,微信服务器会向开发者服务器推送一条带着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;

五、统计页面的开发

这边主要用到了SQL的知识。
将统计值全部读取出来,循环输出即可。
SQL: SELECT * FROM qc

<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-    scale=1.0,user-scalable=0,maximum-scale=1.0,minimun-sacle=1.0"> <meta http-equiv="Cache-Control" content="no-siteapp"> <meta http-equiv="Cache-Control" content="no-transform"> <title>统计</title> </head> <body> <?php $db=mysql_connect("数据库地址","用户名","密码"); mysql_select_db("数据库名",$db); $re=mysql_query("SELECT * FROM qc"); while($row=mysql_fetch_array($re)){ echo "ID:".$row['id']."|总计:".$row['total']."|今日:".$row['today']; echo "</br>"; } ?> </body>
微信公众平台开发-渠道二维码
部分截图

六、总结

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

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 微信公众平台开发-渠道二维码

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址