微信公众平台接口的响应事件文件,接上篇写的微信类,这个主要是响应事件的相关方法,如事件推送,文本,图片,链接,自定义菜单点击…

这个是我在项目中抽取出来的,因为涉及到功能文件比较多,所以我也只好把功能简写出来,不过原理可以跟大家详细说一下。
下面为我项目中的功能说明:
1.先讲事件推送,微信官方暂时只包括了a.关注事件 b.取消关注事件 c.自定义菜单点击事件 三大块。
A.当客户端关注和取消关注微美公众号的时候,我现在只是做了一个简单的返回文字的处理。在attentionEvent()方法里面我都写好备注了,如果你想返回文字带上超链接,$this->wechat->fun_xml(“text“,$arr,array(0)); 只需要第一个参数修改成text_link 即可(PS:你如果喜欢的话,也可以做出图文列表的响应,或者音乐等等,直接调用我上一篇写的那个类的事件就可以了)
B.自定义菜单中的点击事件,同上,响应的事件也是写在attentionEvent()方法里面,对应的event是’CLICK’,然后再根据eventkey的返回值(对应你创建自定义菜单时的key值),写上对应你想要的事件即可。
2.链接消息,我只是简单的做了一个返回字符的操作
3.图片消息,我就随机一个数,从这个数字上响应几个不同的字符,也比较简单。
4.地理位置消息,这个比较好玩,从微信服务端返回的经纬度,再通过从百度找的一个测算两个经纬度之间距离的api,我就写了一个,客户端现在距离我公司的距离是多少的一个简单应用。(PS:不过后来公司又要求变成了返回图文信息,显示距离本手机端最近一位技师的功能,你们自己也可以思考一下怎么做,嘻嘻)
5.终于到了最后一个,也是最复杂的一个,就是文本消息。
因为这里我还做了一些打通我们公司其它项目的功能,如快速注册帐号通道等。这里就涉及到了这上一篇讲到了“盒子模型”(这名字是我自己随便起的呀),因为微信服务器端是不会记住你上次输入了什么,到了哪个步骤,所以我只好通过自己的服务器,把微信客户端的操作用数据表登记下来。
我对文本消息的处理流程主要是:先检查数据库中登记步骤的数据表(下面称其为‘盒子’)是否有数据,如果有先进行操作流程;如果是空盒子,就判断来源的字符是否是特殊字符 【这里的特殊字符的意思是,比如我现在想进入注册流程,就输入’zc'(注册)字符,想退出流程,就输入’tc'(退出),想返回到上一步就输入’fh’(返回)。】,如果是特殊字符,如:输入了‘zc’(注册),程序就会到数据表中,一条数据,其中字符包括如:1.用户id:xxxxx,2.特殊字符:‘zc’,3.现在的步骤流程到哪步了:1 (当下一次输入的时候就修改为2,以此类推)   4.需要保存的数据内容:暂时为空(当下一步用户输入帐号名后就用这字段保存下来就可以了)。
(PS:上面数据表中的第一个字段,用户id,如果你之前有研究过微信的消息接口指南,你会看过有个参数值:FromUserName(发送方帐号),这个作为身份标识)
当你输入完‘zc’这个特殊字符后,再次输入文本消息的时候,你就可以去做数据库搜索这个用户id是否在表中有数据,如果有就查找出它现在是到了哪个步骤流程了,把需要保存的数据保存下来。最后当你注册完成时,可以把这条记录删除。
在这个流程中,你还可以设计出返回(fh)到上一步的操作,退出这个注册流程(tc)等等。你就自己思考吧。
假如你输入字符时,数据表中又没有你这个用户id的数据,你就相当于退出了这个盒子模型,继续下面的逻辑判断就可以了。
WeChatAction.class.php
<?php
// 微信公众平台微美主控制器
// author 微美 TIM
// Date 2013.8.17
class WeChatAction{
private $wechat;
private $charArr = array(‘zc’,’dl’,’tc’,’fh’,’bz’); //流程操作的特殊字符合集(注册,登录,退出,返回,帮助)
private $musicArr=array(‘ge’,’歌’,’音乐’,’歌曲’,’mp3′,’gequ’,’yinyue’);  //音乐的字符合集
private $count_content=0; //统计图文的数量
private $url=”http://webeauty.cc”;
//构造函数
public function __construct($wechat){
$this->wechat=$wechat;
$this->action();
}
//控制器
private function action(){
switch ($this->wechat->type){
case ‘text’:    //文本消息
$this->textEvent();
break;
case ‘image’:  //图片消息
$this->imageEvent();
break;
case ‘location’: //地理位置消息
$this->locationEvent();
break;
case ‘event’: //事件推送
$this->attentionEvent();
break;
case ‘link’: //链接消息
$this->linkEvent();
break;
}
}
//响应文件事件
private function textEvent(){
//先检查盒子是否有数据,如果有先进行操作流程;如果是空盒子,就判断来源的字符是否是特殊字符
$specialChars=new SpecialChars($this->wechat->keyword,$this->wechat->fromUsername);
$check=$specialChars->checkInBox();
if ($check){
$this->InBoxEvent($specialChars);
}else{
$this->EmptyBoxEvent($specialChars);
}
}
//有盒子数据事件
private function InBoxEvent($specialChars){
$specialChars->run(true);
$echoData=$specialChars->getEchoData();
$count=0;
if (is_array($echoData)){ //如果是数组形式就显示图文列表
foreach ($echoData as $obj){
$arr[]=array($obj->realname,$obj->manifesto.’ 手机号码:’.phone,$obj->manifesto,artificer_face,’http://webeauty.cc’);
$count++;
}
$this->wechat->fun_xml(“news”,$arr,array($count,0));
}else{ //普通显示单文本
$arr=array($echoData);
$this->wechat->fun_xml(“text”,$arr,array(0));
}
}
//空盒子事件
private function EmptyBoxEvent($specialChars){
if (in_array($this->wechat->keyword, $this->charArr)){ //流程操作
$specialChars->run(false);
$echoStr=$specialChars->getEchoData();
$arr=array($echoStr);
$this->wechat->fun_xml(“text”,$arr,array(0));
}elseif (in_array($this->wechat->keyword, $this->musicArr)){ //歌曲的字符
$arr=array(“烟雨蒙蒙”,”烟雨蒙蒙-赵薇”,”http://webeauty.cc/weixin/mp3/yanyu.mp3″,”http://webeauty.cc/weixin/mp3/yanyu.mp3″);
$this->wechat->fun_xml(“music”,$arr,array(1,0));
}else{
$arr=array(‘微美:发现美-定制美-分享美!全国最大美容健康服务预约平台。 &#x0A;1、点击“美容”或“健康”,发送您的位置信息,微美可以给您随机推荐离您最近的美容健康服务信息; &#x0A;2、点击“美丽资讯”,查看微美每天给您推荐的美容健康小知识; &#x0A;3、点击“下载客户端”下载微美的手机移动客户端; &#x0A;4、加入微美,请点击“联系我们”’);
$this->wechat->fun_xml(“text_link”,$arr,array(0));
}
}
//响应图片事件
private function imageEvent(){
$rand = rand(1,3); //随机数,产生一些随机事件
switch ($rand){
case ‘1’:
$arr=array(‘这张图,不错嘛!’);
$this->wechat->fun_xml(“text”,$arr,array(0));
break;
case ‘2’:
$arr=array(‘这图一般般罗!’);
$this->wechat->fun_xml(“text”,$arr,array(0));
break;
case ‘3’:
$arr=array(‘一看这图,我就知道,你是一位爱美之人!’);
$this->wechat->fun_xml(“text”,$arr,array(0));
break;
}
}
//响应地理位置事件
private function locationEvent(){
$x=$this->wechat->location_x; //纬度 小
$y=$this->wechat->location_y;
距离学院的距离:
$url=”http://api.map.baidu.com/telematics/v3/distance?waypoints={$y},{$x};113.364521798776,23.139754122778;&ak=A0398903fd821c39a8ff76cb4be2aeed”;
$fc=file_get_contents($url);
$sxl=simplexml_load_string(stripslashes($fc));
$distance=$sxl->results->distance;
$arr=array(“微美官方地址与您的位置:{$distance}米”);
$this->wechat->fun_xml(“text”,$arr,array(0));
//随机获取150公里范围内的技师
}
private function attentionEvent(){
switch ($this->wechat->event){
case ‘subscribe’:  //关注
$arr=array(‘如果您是美容美发、化妆美甲、健康养生、运动健身、医疗护理等美容健康服务行业的从业者或机构,关注微美,即可获得价值120元的微美大礼包!如果您不是以上行业的从业者,您也可以推荐您身边从事美容健康行业的亲人或朋友关注微美,感谢您的关注与支持!更多详情请咨询:400-008-0611’);
$this->wechat->fun_xml(“text”,$arr,array(0)); //如果是文字链接,记得第一个参数为text_link
break;
case ‘unsubscribe’:    //取消关注
$arr=array(‘感谢您一如既往的关注与支持,如果您希望重新关注微美,只需搜索“微美”或“wwbeauty”即可找到我们。’);
$this->wechat->fun_xml(“text”,$arr,array(0));
break;
case “CLICK”: //自定义菜单的点击事件
switch ($this->wechat->eventkey)
{
case “sort_beauty”: //点击了一级栏目:美容 返回发送地理位置信息的文字说明
$this->clickPreviousMenu();
break;
case “beauty_info”: //更多->“美丽资讯”
$this->beautyInfo();
break;
case “help”: //更多->“使用帮助”
$arr=array(‘微美:发现美-定制美-分享美!全国最大美容健康服务预约平台。 &#x0A;1、点击“美容”或“健康”,发送您的位置信息,微美可以给您随机推荐离您最近的美容健康服务信息; &#x0A;2、点击“美丽资讯”,查看微美每天给您推荐的美容健康小知识; &#x0A;3、点击“下载客户端”下载微美的手机移动客户端; &#x0A;4、加入微美,请点击“联系我们”’);
$this->wechat->fun_xml(“text_link”,$arr,array(0));
break;
case “download”: //更多->“下载客户端”
$arr=array(‘安卓客户端 &lt;a href=&quot;http://webeauty.cc/wmeirong_android.apk&quot;&gt;下载&lt;/a&gt; &#x0A; &#x0A;苹果客户端 &lt;a href=&quot;https://itunes.apple.com/cn/app/wei-mei-mei-rong-mei-zhuang/id694047994?mt=8&quot;&gt;下载&lt;/a&gt;’);
$this->wechat->fun_xml(“text_link”,$arr,array(0));
break;
case “contact”: //更多->“联系我们”
$arr=array(‘广州微美企业管理咨询有限公司 &#x0A;地址:广州市天河区中山大道中140号华港商务大厦1330-1331 电话:400-008-0611’);
$this->wechat->fun_xml(“text_link”,$arr,array(0));
break;
default:
break;
}
break;
default:
$contentStr = “receive a new event: “.$object->Event;
break;
}
}
//响应链接事件
private function linkEvent(){
$arr=array(‘这个链接不错的嘛!!’);
$this->wechat->fun_xml(“text”,$arr,array(0));
}
//点击一级菜单“美容”的事件
private function clickPreviousMenu(){
$arr=array(‘1.点击左下方“小键盘”&#x0A;2.点击“+”号键&#x0A;3.点击“位置”&#x0A;4.完成定位后点击“发送”’);
$this->wechat->fun_xml(“text_link”,$arr,array(0));
//数据库操作
}
//美丽资讯
private function beautyInfo(){
//。。。。代码。。。。。
//通过数据库查找出你的文章列表(需要文章标题,缩略图即可),弄成一个数组传进去即可,这里的$allContent就是我从数据库查找出来的文章列表,按照你们自己的需要,sql中limit 限制一下条数就可以了
foreach ($allContent as $key=>$obj){ //循环刚刚的数组,重组一下数据
if ($key>0) $obj->thumbnail=’/weixin/images/webeauty.jpg’;
$arr[]=array($obj->title,$obj->info,$this->url.$obj->thumbnail,’http://webeauty.cc/weixin/news/news.php?id=’.$obj->id);
$this->count_content+=1;
}
$this->wechat->fun_xml(“news”,$arr,array($this->count_content,0));
}
}
?>