第三篇文章已经讲解了如何封装请求信息,现在将介绍如何使用请求消息。
首先我们针对接收到的每种消息定义自己的请求消息处理器,先定义基类处理器:

/** * 消息处理基类 * @author Administrator * */ abstract class AbstractMessageProcessor {   public $requestMessage ;//消息请求对象 AbstractBaseRequestMessage的子类    public $time ;//响应请求时间    /**    *     * @param $requestMessage 类型为:AbstractBaseRequestMessage   */   public function __construct($requestMessage){     $this->requestMessage = $requestMessage;        $this->time = time();   } /**    * 处理消息    * @param $message    */   abstract  public function processMessage();

}

然后大家可根据自己需求自行实现自己的请求消息处理器,我的实现如下,比较简单的业务功能:

/** * 文本消息处理器 * @author Administrator * */class TextMessageProcessor extends AbstractMessageProcessor {   /**    * @param unknown_type $message   */   public function processMessage() {                    if(!empty( $this->requestMessage->keyword ))                    {                           if(strpos($this->requestMessage->keyword, "天气") !== false){                            $ctity = str_replace("天气","",$this->requestMessage->keyword);                            if(!empty($ctity)){

                              $message = getWeather($ctity);                                MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $message);

                            }else {                                 $message = "请回复格式:\n 天气+地点,例如:天气成都 ";                                 MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $message);                            }

                        }else if(strpos($this->requestMessage->keyword, "翻译") !== false){

                            $ctity = str_replace("翻译","",$this->requestMessage->keyword);                            if(!empty($ctity)){

                               $message = tanslate($ctity);                              MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, $message);

                            }else {                                  $message = "请回复格式:\n 翻译+要翻译的词 ";                                   MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $message);                            }

                        }else if("1" == $this->requestMessage->keyword){                                 $message = "主菜单:\n 翻译:翻译+要翻译的词\n天气预报:天气+地点  \n 笑话:2 \n搞笑图片 3\n 主菜单:1";                                 MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $message);

                        } else if("2" == $this->requestMessage->keyword){                              $message =getjoke();                                  MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $message);                        }else if("3" == $this->requestMessage->keyword){                            sendJokeImage($this->requestMessage->fromUsername, $this->requestMessage->toUsername);                        }else if("4" == $this->requestMessage->keyword){                             $mediaId = "n7HVI2spZKcafRBTErrgm-ptqdY_F5MzSueTLJch1TpeM8l07hITsoZlM5BuPfg7";//是记录在微信服务器中的id 不能是本地服务器的图片资源{$this->requestMessage->basePath}/res/images/erweima.jpg" ;                              MessageUtil::sendImageMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  "n7HVI2spZKcafRBTErrgm-ptqdY_F5MzSueTLJch1TpeM8l07hITsoZlM5BuPfg7");                        }else if("5" == $this->requestMessage->keyword){                             $title = "愿得一人心(剧场版)-李行亮,雨宗林";                             $description = ",愿得一人心(剧场版)在线试听,MP3免费下载,愿得一人心(剧场版)歌词下载_百度音乐-听到极致";                             $musicUrl="{$this->requestMessage->basePath}/res/music/父亲.mp3";                              $hQMusicUrl=$musicUrl;                               $thumbMediaId = "";                                MessageUtil::sendMusicMessage($this->requestMessage->fromUsername,$this->requestMessage->toUsername,$title,$description,$musicUrl,$hQMusicUrl,null);                        }else if("6" == $this->requestMessage->keyword){                                   MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $this->requestMessage->fromUsername);                        }else{                                $message = talk($this->requestMessage->keyword);                                    MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, $message);                        }

                   }else{                         MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, "input some thing...");                   } }

}/** * Event类型消息处理器 * @author Administrator * */class EventMessageProcessor extends AbstractMessageProcessor {  /**    *     */   public function processMessage() {

                        if($this->requestMessage->customEvent == "subscribe"){                            $picUlr = "{$this->requestMessage->$requestMessage->basePath}/res/images/erweima.jpg" ;                           $url = "{$this->requestMessage->$requestMessage->basePath}/res/images/erweima.jpg" ;                          $description = "你好,欢迎关注程序员.\n主菜单:\n翻译:翻译+要翻译的词\n天气预报:天气+地点 \n笑话:2\n搞笑图片: 3\n主菜单:1";                         $title = "欢迎关注程序员";                            MessageUtil::sendOneTextImageMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,$title,$description, $picUlr,$url);                         }else if($this->requestMessage->customEvent == "CLICK") {                         switch ($this->requestMessage->eventKey){                               case "key_dpdz" : {                             $message="<a href ='http://api.map.baidu.com/geocoder?address=成都五块石客运站&output=html&src=hanfei|shuiguo'>我的位置</a>";                                MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $message);                              break ;                               }                             case  "key_rxsg" : {                                $picUlr = "http://mmbiz.qpic.cn/mmbiz/lp77EI7LTyp9C6bGT7zxlASgSGibIbTpRFwuruZFgnvDQlPIv7rAZ7ibAV6vCl6dgc1dgIMiaic3icbFcctvccMh0ibA/0" ;                                $url = "http://mp.weixin.qq.com/s?__biz=MzA4NjM5NDQyOQ==&mid=201608824&idx=1&sn=c96cab1d0fb61a174c617a02099651b9#rd" ;                               $description = "蓝莓营养价值 ①花青素:\n是一种非常重要的植物水溶性色素,属于纯天然的抗衰老营补充剂,是目前人类发现的最有效的抗氧化生物活性剂。②总酸和有机酸:具有广泛的生物学活性,特别在抗肿瘤等方面作用突出。";                                $title = "热销水果信息";                                 MessageUtil::sendOneTextImageMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, $title,$description, $picUlr,$url);                                  break ;                               }                         }

                         }   }

}/** * 图片类型消息处理器 * @author Administrator * */class ImageMessageProcessor extends AbstractMessageProcessor{    /**    *     */   public function processMessage() {        $message = "你发送的是图片";        MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, $message); }

}/** * 声音类型消息处理器 * @author Administrator * */class VoiceMessageProcessor extends AbstractMessageProcessor{    /**    *     */   public function processMessage() {        $message = "你发送的是声音";       MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, $message);  }

}/** * 视频类型消息 * @author Administrator * */class VideoMessageProcessor extends AbstractMessageProcessor{   /**    *     */   public function processMessage() {        $message = "你发送的视频";        MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, $message);  }

}/** * 地理位置消息类型 * @author Administrator * */class LocationMessageProcessor extends AbstractMessageProcessor{  /**    *     */   public function processMessage() {        $message = "你发送的地理位置";        MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername,  $message);   }

}/** * 连接类型消息 * @author Administrator * */class LinkMessageProcessor extends AbstractMessageProcessor{    /**    *     */   public function processMessage() {        $message = "你发送的是连接";        MessageUtil::sendTextMessage($this->requestMessage->fromUsername, $this->requestMessage->toUsername, $message); }

}

然后创建消息处理器的工厂类:

/** * 消息处理器工厂类 * @author Administrator * */class MessageProcessFactory {  /**    * 创建处理器工厂方法   * @param 得到请求解析的xml对象 $postObj   */   static function createMessageProcess($postObj) {      $messageType = $postObj->MsgType;     switch ($messageType){            case "event":{              return  new EventMessageProcessor(new EventRequestMessage($postObj));         }         case "text" :{              return  new TextMessageProcessor(new TextRequsetMessage($postObj));           }         case "image":{              return  new ImageMessageProcessor(new ImageRequestMessage($postObj));         }         case "voice" :{             return  new VoiceMessageProcessor(new VoiceMessageProcessor($postObj));           }         case "video":{              return  new VideoMessageProcessor(new VideRequestMessage($postObj));          }         case "location" :{              return  new LocationMessageProcessor(new LocationRequestMessage($post));          }         case "link":{               return  new LinkMessageProcessor(new LinkMessageProcessor($postObj));         }         default:{             return  new TextMessageProcessor(new TextRequsetMessage($postObj));           }     } }}

到此请求和响应消息基本封装完毕,如需可仔细扩充。最后看看如何处接收请求,只需在最开始的index.php中的responseMsg方法中加入如下代码,

  public function responseMsg()    {     //get post data, May be due to the different environments     $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];         //extract post data       if (!empty($postStr)){

                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);                $messageProcessor = MessageProcessFactory::createMessageProcess($postObj);                if($messageProcessor!=null){                    $messageProcessor->processMessage();                }

        }else {           echo "";            exit;        }    }

完整的index.php代码:

define("TOKEN", "weixin");$wechatObj = new wechatCallbackapiTest();$wechatObj->responseMsg();

class wechatCallbackapiTest{    public function valid()    {        $echoStr = $_GET["echostr"];

        //valid signature , option        if($this->checkSignature()){            echo $echoStr;            exit;        }    }

    public function responseMsg()    {       //get post data, May be due to the different environments     $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];         //extract post data       if (!empty($postStr)){

                  $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);                $messageProcessor = MessageProcessFactory::createMessageProcess($postObj);                if($messageProcessor!=null){                    $messageProcessor->processMessage();                }

        }else {           echo "";            exit;        }    }

到此一个简单php微信公众号工具包开发完成,等有时间将写更详细的教程,最后附一张图片,源码下载地址[url]http://download.csdn.net/detail/ybhanxiao/7223847[/url]
[img]http://dl2.iteye.com/upload/attachment/0096/3535/8140ce70-fdb5-343d-8fbc-332ec33af04f.png[/img]

php开发微信公众账号开发包开发教程五之请求响应处理相关推荐

  1. 新浪云python开发_python,flask,SAE(新浪云),搭建开发微信公众账号

    将我们的服务器放在新浪云上,搭建微信公众账号,下面的代码将实现获取微信token,实现最简单的消息对话(用户说什么,我们回复什么). 因为网上有的代码有错,所以将这个传上来供大家借鉴 注意,代码中的空 ...

  2. java微信接收消息_使用Java开发微信公众平台(二)——消息的接收与响应

    上一篇文章中,我们学习了使用Java语言开发微信公众平台的第一部分--环境搭建与开发接入.那么,本篇文章,我们将在此基础上,学习[消息的接收与响应].喜欢本文,请点击下方喜欢按钮呗!❤️ 当然,我们在 ...

  3. python 微信二次开发_python微信公众账号二次开发

    微信公众号开发网址:https://mp.weixin.qq.com/ 注意:申请公众账号后,系统需要一天的审核时间后,才能进行二次开发: 创建步骤: 1.申请免费且支持python的服务器,新浪云s ...

  4. 微信公众账号开发文档

    官方文档链接 http://mp.weixin.qq.com/wiki/index.php?title=MediaWiki:Sidebar&diff=prev&oldid=151#.E ...

  5. 微信jsapi支付获取code_微信开发之微信公众平台开发之JSAPI公众号支付

    本文将带你了解微信开发微信公众平台开发之JSAPI公众号支付,希望本文对大家学微信有所帮助. 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.co ...

  6. java 开发微型公众账号应用

    当是想做一个微型公众平台的应用在网上找了好长时间,基本上全都是PHP开发微信公众账号,对Java开发微信公众账号的介绍的很少,又不想重新在电脑上整一个PHP的开发环境所以自己研究使用java做微型公众 ...

  7. 用java开发微信公众号:测试公众号与本地测试环境搭建(一)

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...

  8. 大齐玩转微信公众账号系列(四):微信公众账号开发入门(原理)

    本系列属作者原创,请尊重作者的劳动成果,转载请注明出处 , 谢谢! 我的博客地址:[url]http://blog.csdn.net/qicong7[/url] [b][color=red][size ...

  9. php微信公众号开发难吗,PHP微信公众号开发的两种模式

    微信现在已经深入到每个家庭,每个人至少人手一个账号是确定的,所以开发公众号也是很普遍的,今天爱站技术频道小编为大家带来的是PHP微信公众号开发的两种模式,感兴趣的小伙伴们可以参考下面的介绍. 学习步骤 ...

最新文章

  1. 爬取豆瓣电影排名前250部电影并且存入Mongo数据库
  2. CentOS7 续续
  3. html如何引入less,VueJS如何引入css或者less文件的一些坑
  4. Java中的观察者设计模式-示例教程
  5. Golang遇到的问题记录
  6. 纯CSS3实现lightbox+图像轮播
  7. Swift和Object-C的区别和优缺点
  8. SPDK/PMDK/VTune Amplifier 2019中国峰会顺利落幕
  9. pygame安装教程(window)
  10. 系统安装部署系列教程(四):制作PE系统
  11. Easyx——基于easyx的c语言简单动画入门
  12. 28岁大爷都能看懂261页前端面试题宝典
  13. LeetCode455分发饼干
  14. Excl2016密码忘记 破解办法
  15. 前端常用得CSS代码分享
  16. cf自动退出服务器,win7登录穿越火线CF后自动退出四种解决方法
  17. 如何制作手机上图文并茂的加密电子书?
  18. more than one file was found with os independent path'com/unionpay/blepayservice/'
  19. 国微大学php,国微CMS学校网站系统(学校版) v20191205
  20. 智能手机系统Windows mobile和Symbian的选择

热门文章

  1. oepncv 移动目标追踪, 背景消除法,MOG,KNN
  2. OpenCV之Python学习笔记
  3. 关于ionic环境卸载
  4. 常用排序算法稳定性、时间复杂度分析
  5. EXCEL表格-系统时间及进度自动记录工具制作
  6. MySQL——创建数据库和数据表
  7. Vue element 自定义表单验证(验证联系方式、邮箱、邮政编码)
  8. Ubuntu系统修改用户名
  9. U盘能识别,但不显示盘符,磁盘管理器也看不到
  10. 0805的高频绕线电感有什么特征