讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 8.2 案例實踐 >

8.2 案例實踐

本例介紹渠道來源統計。預先生成多個不同參數的二維碼,把各個二維碼投放到不同的場地,引導用戶掃瞄關注後,後台就可以統計出該地點的用戶關注數、關注時間等信息。

以下代碼批量生成了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月份各場景統計柱狀圖