本例介绍渠道来源统计。预先生成多个不同参数的二维码,把各个二维码投放到不同的场地,引导用户扫描关注后,后台就可以统计出该地点的用户关注数、关注时间等信息。
以下代码批量生成了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 ) , scene FROM '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); // 屏幕分辨率 10 11 // 基本参数 12 $graph->SetScale("textlin"); // 线性标尺 13 $graph->SetY2Scale('lin',0,100); // 对数 14 $graph->Set90AndMargin(50,0,65,0); // 旋转90° 15 $graph->yaxis->SetTitleMargin(25); 16 17 // 标题与字体 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'); 24 25 // 生成柱状图 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(); 32 33 // 柱状图叠到图形中 34 $graph->Add($bplot); 35 36 // 生成图形 37 return $graph->Stroke();
其运行结果在微信中的显示效果如图8-6所示。
图8-6 2014年3月份各场景统计柱状图