微信公众平台接口的响应事件文件,接上篇写的微信类,这个主要是响应事件的相关方法,如事件推送,文本,图片,链接,自定义菜单点击…
这个是我在项目中抽取出来的,因为涉及到功能文件比较多,所以我也只好把功能简写出来,不过原理可以跟大家详细说一下。
下面为我项目中的功能说明:
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.17class 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(‘微美:发现美-定制美-分享美!全国最大美容健康服务预约平台。 
1、点击“美容”或“健康”,发送您的位置信息,微美可以给您随机推荐离您最近的美容健康服务信息; 
2、点击“美丽资讯”,查看微美每天给您推荐的美容健康小知识; 
3、点击“下载客户端”下载微美的手机移动客户端; 
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_linkbreak;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(‘微美:发现美-定制美-分享美!全国最大美容健康服务预约平台。 
1、点击“美容”或“健康”,发送您的位置信息,微美可以给您随机推荐离您最近的美容健康服务信息; 
2、点击“美丽资讯”,查看微美每天给您推荐的美容健康小知识; 
3、点击“下载客户端”下载微美的手机移动客户端; 
4、加入微美,请点击“联系我们”’);$this->wechat->fun_xml(“text_link”,$arr,array(0));break;case “download”: //更多->“下载客户端”$arr=array(‘安卓客户端 <a href="http://webeauty.cc/wmeirong_android.apk">下载</a> 
 
苹果客户端 <a href="https://itunes.apple.com/cn/app/wei-mei-mei-rong-mei-zhuang/id694047994?mt=8">下载</a>’);$this->wechat->fun_xml(“text_link”,$arr,array(0));break;case “contact”: //更多->“联系我们”$arr=array(‘广州微美企业管理咨询有限公司 
地址:广州市天河区中山大道中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.点击左下方“小键盘”
2.点击“+”号键
3.点击“位置”
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));}}?>
评论