首页 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践 » 微信公众平台开发:从零基础到ThinkPHP5高性能框架实践全文在线阅读

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》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 ) , 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月份各场景统计柱状图