本例介绍渠道来源统计。预先生成多个不同参数的二维码,把各个二维码投放到不同的场地,引导用户扫描关注后,后台就可以统计出该地点的用户关注数、关注时间等信息。
以下代码批量生成了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月份各场景统计柱状图