本例介绍渠道来源统计。预先生成多个不同参数的二维码,把各个二维码投放到不同的场地,引导用户扫描关注后,后台就可以统计出该地点的用户关注数、关注时间等信息。
以下代码批量生成了8个二维码,并将其保存在本地。
1 <?php 2 $appid = "wx3f88af80a4c0a09d"; 3 $appsecret = "123"; 4 $url = "https:// api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid= $appid&secret=$appsecret"; 5 6 $output = http_request($url); 7 $jsoninfo = json_decode($output, true); 8 $access_token = $jsoninfo["access_token"]; 9 10 // 永久二维码11 for ($i = 1; $i<= 8; $i++) {12 $scene_id = $i;13 $qrcode = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_ id":'.$scene_id.'}}}';14 15 $url = "https:// api.weixin.qq.com/cgi-bin/qrcode/create?access_token=$access_ token";16 $result = http_request($url, $qrcode);17 $jsoninfo = json_decode($result, true);18 $ticket = $jsoninfo["ticket"];19 $url = "https:// mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket);20 $imageInfo = downloadWeixinFile($url);21 22 $filename = "qrcode".$scene_id.".jpg";23 $local_file = fopen($filename, 'w');24 fwrite($local_file, $imageInfo["body"]);25 fclose($local_file);26 }27 28 // http请求29 function http_request($url, $data = null)30 {31 $curl = curl_init();32 curl_setopt($curl, CURLOPT_URL, $url);33 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);34 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);35 if (!empty($data)){36 curl_setopt($curl, CURLOPT_POST, 1);37 curl_setopt($curl, CURLOPT_POSTFIELDS, $data);38 }39 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);40 $output = curl_exec($curl);41 curl_close($curl);42 return $output;43 }44 45 // 下载文件46 function downloadWeixinFile($url)47 {48 $ch = curl_init($url);49 curl_setopt($ch, CURLOPT_HEADER, 0); 50 curl_setopt($ch, CURLOPT_NOBODY, 0); // 只取body头51 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);52 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);53 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);54 $package = curl_exec($ch);55 $httpinfo = curl_getinfo($ch);56 curl_close($ch);57 $imageAll = array_merge(array('body' =>$package), array('header' =>$httpinfo));58 return $imageAll;59 }
生成的二维码如图8-3所示。
图8-3 8个永久二维码
将8个场景二维码放到8个不同的投放地,并且引导用户关注,这样才能获得用户关注的相关数据。另外再设计一个表,用于存储统计记录,其SQL脚本如下。
DROP TABLE IF EXISTS 'qrcode';CREATE TABLE IF NOT EXISTS 'qrcode' ( 'id' int(16) NOTNULL auto_increment, 'scene' varchar(2) NOTNULL COMMENT '场景', 'year' varchar(4) NOTNULL COMMENT '年', 'month' varchar(2) NOTNULL COMMENT '月', 'day' varchar(2) NOTNULL COMMENT '日', PRIMARY KEY ('id')) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
上述脚本定义了5个字段,用于存储主键ID、用户关注时的场景ID,以及关注时的年、月、日。
定义数据库配置文件如下。
if (isset($_SERVER['HTTP_APPNAME'])){// SAE define("MYSQLHOST", SAE_MYSQL_HOST_M); define("MYSQLPORT", SAE_MYSQL_PORT); define("MYSQLUSER", SAE_MYSQL_USER); define("MYSQLPASSWORD", SAE_MYSQL_PASS); define("MYSQLDATABASE", SAE_MYSQL_DB); // }else{ define("MYSQLHOST", "localhost"); define("MYSQLPORT", "3306"); define("MYSQLUSER", "root"); define("MYSQLPASSWORD", "root"); define("MYSQLDATABASE", "weixin"); // }
定义MySQL类如下。
class class_mysql{ function __construct(){ $host = MYSQLHOST; $port = MYSQLPORT; $user = MYSQLUSER; $pwd= MYSQLPASSWORD; $dbname = MYSQLDATABASE; $link = @mysql_connect("{$host}:{$port}", $user, $pwd, true); mysql_select_db($dbname, $link); return $link; } // 返回数组 function query_array($sql){ $result = mysql_query($sql); if(!$result) return false; $arr = array(); while ($row = mysql_fetch_assoc($result)){ $arr[] = $row; } return $arr; } // 只执行 function query($sql){ if (!($query = mysql_query($sql))){ return false; } return $query; }}
当用户关注二维码的时候,后台会根据关注事件消息,将该二维码的值写入到数据库中。事件响应部分的代码如下。
1 private function receiveEvent($object) 2 { 3 $content = ""; 4 switch ($object->Event) 5 { 6 case "subscribe": 7 $content = "欢迎关注方倍工作室"; 8 if (isset($object->EventKey)){ 9 $sceneid = str_replace("qrscene_","",$object->EventKey);10 require_once('mysql.php');11 $db = new class_mysql();12 $sql = "INSERT INTO 'qrcode' ('id', 'scene', 'year', 'month', 'day') VALUES (NULL, '".$sceneid."', '".date("Y")."', '".date("m")."', '". date("d")."')";13 $db->query($sql);14 }15 break;16 case "unsubscribe":17 $content = "取消关注";18 break;19 case "SCAN":20 $content = "扫描场景 ".$object->EventKey;21 break;22 default:23 break;24 }25 if (is_array($content)){26 $result = $this->transmitNews($object, $content);27 }else{28 $result = $this->transmitText($object, $content);29 }30 return $result;31 }
这样后台就能统计到用户关注的数据了。
MySQL中最终存储的数据如图8-4所示。
之后可以使用SQL语句来获取统计数据。
例如,统计2014年3月各场景关注情况的SQL查询脚本如下。
SELECT COUNT( scene ) , sceneFROM 'qrcode' WHERE YEAR='2014'AND MONTH='03'GROUP BY scene
获取到的结果数据如图8-5所示。
图8-4 关注统计数据
图8-5 各场景统计数据
另外,还可以使用JpGraph来生成统计图。
JpGraph是PHP下的一个面向对象的图表创建库,用户只需从数据库中取出相关数据,定义标题、图表类型,就能轻松画出折线图、柱状图、饼状图等图表。其官方网站为http://jpgraph.net/。读者可下载其使用手册来了解使用方法。
下面代码使用2014年3月的场景统计数据创建了一个柱状统计图。
1 require_once ('jpgraph/jpgraph.php'); 2 require_once ('jpgraph/jpgraph_bar.php'); 3 require_once ('jpgraph/jpgraph_line.php'); 4 5 // 数据 6 $data_follow = array(140,110,77,104,29,161,13,195); 7 8 // 构造对象 9 $graph = new Graph(320,440); // 屏幕分辨率1011 // 基本参数12 $graph->SetScale("textlin"); // 线性标尺13 $graph->SetY2Scale('lin',0,100); // 对数14 $graph->Set90AndMargin(50,0,65,0); // 旋转90°15 $graph->yaxis->SetTitleMargin(25);1617 // 标题与字体18 $graph->title->Set("Scene Analysis");19 $graph->title->SetFont(FF_FONT1,FS_BOLD);20 $graph->xaxis->title->Set("Sce");21 $graph->yaxis->title->Set("Num");22 $graph->y2axis->SetColor('black','blue');23 $graph->y2axis->SetLabelFormat('%2d');2425 // 生成柱状图26 $bplot = newBarPlot($data_follow);27 $bplot->SetFillColor("[email protected]");28 $bplot->SetValuePos('center');29 $bplot->value->SetFormat("%d");30 $bplot->value->SetFont(FF_ARIAL,FS_NORMAL,9);31 $bplot->value->Show();3233 // 柱状图叠到图形中34 $graph->Add($bplot);3536 // 生成图形37 return $graph->Stroke();
其运行结果在微信中的显示效果如图8-6所示。
图8-6 2014年3月份各场景统计柱状图