本例介紹渠道來源統計。預先生成多個不同參數的二維碼,把各個二維碼投放到不同的場地,引導用戶掃瞄關注後,後台就可以統計出該地點的用戶關注數、關注時間等信息。
以下代碼批量生成了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月份各場景統計柱狀圖