php开发微信公众账号开发包开发教程五之请求响应处理
第三篇文章已经讲解了如何封装请求信息,现在将介绍如何使用请求消息。
首先我们针对接收到的每种消息定义自己的请求消息处理器,先定义基类处理器:
/** * 消息处理基类 * @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开发微信公众账号开发包开发教程五之请求响应处理相关推荐
- 新浪云python开发_python,flask,SAE(新浪云),搭建开发微信公众账号
将我们的服务器放在新浪云上,搭建微信公众账号,下面的代码将实现获取微信token,实现最简单的消息对话(用户说什么,我们回复什么). 因为网上有的代码有错,所以将这个传上来供大家借鉴 注意,代码中的空 ...
- java微信接收消息_使用Java开发微信公众平台(二)——消息的接收与响应
上一篇文章中,我们学习了使用Java语言开发微信公众平台的第一部分--环境搭建与开发接入.那么,本篇文章,我们将在此基础上,学习[消息的接收与响应].喜欢本文,请点击下方喜欢按钮呗!❤️ 当然,我们在 ...
- python 微信二次开发_python微信公众账号二次开发
微信公众号开发网址:https://mp.weixin.qq.com/ 注意:申请公众账号后,系统需要一天的审核时间后,才能进行二次开发: 创建步骤: 1.申请免费且支持python的服务器,新浪云s ...
- 微信公众账号开发文档
官方文档链接 http://mp.weixin.qq.com/wiki/index.php?title=MediaWiki:Sidebar&diff=prev&oldid=151#.E ...
- 微信jsapi支付获取code_微信开发之微信公众平台开发之JSAPI公众号支付
本文将带你了解微信开发微信公众平台开发之JSAPI公众号支付,希望本文对大家学微信有所帮助. 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.co ...
- java 开发微型公众账号应用
当是想做一个微型公众平台的应用在网上找了好长时间,基本上全都是PHP开发微信公众账号,对Java开发微信公众账号的介绍的很少,又不想重新在电脑上整一个PHP的开发环境所以自己研究使用java做微型公众 ...
- 用java开发微信公众号:测试公众号与本地测试环境搭建(一)
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...
- 大齐玩转微信公众账号系列(四):微信公众账号开发入门(原理)
本系列属作者原创,请尊重作者的劳动成果,转载请注明出处 , 谢谢! 我的博客地址:[url]http://blog.csdn.net/qicong7[/url] [b][color=red][size ...
- php微信公众号开发难吗,PHP微信公众号开发的两种模式
微信现在已经深入到每个家庭,每个人至少人手一个账号是确定的,所以开发公众号也是很普遍的,今天爱站技术频道小编为大家带来的是PHP微信公众号开发的两种模式,感兴趣的小伙伴们可以参考下面的介绍. 学习步骤 ...
最新文章
- 爬取豆瓣电影排名前250部电影并且存入Mongo数据库
- CentOS7 续续
- html如何引入less,VueJS如何引入css或者less文件的一些坑
- Java中的观察者设计模式-示例教程
- Golang遇到的问题记录
- 纯CSS3实现lightbox+图像轮播
- Swift和Object-C的区别和优缺点
- SPDK/PMDK/VTune Amplifier 2019中国峰会顺利落幕
- pygame安装教程(window)
- 系统安装部署系列教程(四):制作PE系统
- Easyx——基于easyx的c语言简单动画入门
- 28岁大爷都能看懂261页前端面试题宝典
- LeetCode455分发饼干
- Excl2016密码忘记 破解办法
- 前端常用得CSS代码分享
- cf自动退出服务器,win7登录穿越火线CF后自动退出四种解决方法
- 如何制作手机上图文并茂的加密电子书?
- more than one file was found with os independent path'com/unionpay/blepayservice/'
- 国微大学php,国微CMS学校网站系统(学校版) v20191205
- 智能手机系统Windows mobile和Symbian的选择