一、前言
学习微信公众号开发错误姿势——文档从头到尾先看一遍,正确姿势——直接进入开始开发,demo撸起来。
二、消息回复
+ 在粉丝给公众号发消息的过程中,微信服务器会将post消息的xml数据包到开发者填写的服务器URL上, 可以通过查看微信开发文档中的消息管理中的接受消息部分,来了解粉丝发送的不同的消息类型对应的不同的xml数据格式。
知道微信服务器发送的xml格式是什么样的,我们就知道发送过来的xml包含了哪些数据。在给粉丝回复消息之前就可以先判断再做相应的回复。
+ 粉丝收到公众号的回复这个过程,服务器返回给微信服务器的同样也是一个xml数据,查看发送消息-被动回复消息部分就可以查看到具体的不同类型消息对应的不同的xml数据
消息回复代码(回复消息类型:文本、图片、图文、音乐):
//3.依据接口文档实现业务逻辑 public function responseMsg() { //获取微信推送过来的post数据(xml数据) $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ //simplexml_load_string() 函数把XML字符串载入对象中。 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $picUrl = $postObj->PicUrl; $msgId = $postObj->MsgId; $mediaId = $postObj->MediaId; $event = strtolower($postObj->MsgType); $msgType = "text"; $msgType2 = "image"; $msgType3 = "music"; $msgType4 = "news"; $time = time(); //返回给用户文本类型数据 $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <Event><![CDATA[subscribe]]></Event> <FuncFlag>0</FuncFlag> </xml>"; //返回给用户图片类型数据 $textTp2 = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml> "; //给用户发送音乐 $arrMusic = array( array( 'title'=>'约定', 'description'=>'陈奕迅', 'musicurl'=>'http://odnc53sha.bkt.clouddn.com/yueding.mp3', 'hqmusicurl'=>'http://odnc53sha.bkt.clouddn.com/yueding.mp3' ), array( 'title'=>'沙龙', 'description'=>'陈奕迅', 'musicurl'=>'http://odnc53sha.bkt.clouddn.com/shalong.mp3', 'hqmusicurl'=>'http://odnc53sha.bkt.clouddn.com/shalong.mp3' ), ); $textTp3 ="<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Music> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <MusicUrl><![CDATA[%s]]></MusicUrl> <HQMusicUrl><![CDATA[%s]]></HQMusicUrl> </Music> <FuncFlag>0</FuncFlag> </xml> "; //发送图文消息 $arr = array( array( 'title'=>'13级精英班', 'description'=>'13级', 'picurl'=>'http://odnc53sha.bkt.clouddn.com/jy.jpg', 'url'=>'http://www.imooc.com', ), ); $textTp4 = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <ArticleCount>".count($arr)."</ArticleCount> <Articles>"; foreach($arr as $k=>$v) { $textTp4 .= "<item> <Title><![CDATA[".$v['title']."]]></Title> <Description><![CDATA[".$v['description']."]]></Description> <PicUrl><![CDATA[".$v['picurl']."]]></PicUrl> <Url><![CDATA[".$v['url']."]]></Url> </item>"; } $textTp4 .= " </Articles> </xml>"; $arr2 = array( array( 'title'=>'2016年3月新闻发布系统项目答辩', 'description'=>'2015年寒假新闻发布系统项目答辩', 'picurl'=>'', 'url'=>'http://www.imooc.com', ), array( 'title'=>'13级精英班2016年1月第一次聚餐', 'description'=>'', 'picurl'=>'', 'url'=>'http://www.imooc.com', ), array( 'title'=>'2016年3月第一批同学出校实习第二次聚餐', 'description'=>'', 'picurl'=>'', 'url'=>'http://www.imooc.com', ), ); $textTp5 .= "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <ArticleCount>".count($arr2)."</ArticleCount> <Articles>"; foreach($arr2 as $k=>$v) { $textTp5 .= "<item> <Title><![CDATA[".$v['title']."]]></Title> <Description><![CDATA[".$v['description']."]]></Description> <PicUrl><![CDATA[".$v['picurl']."]]></PicUrl> <Url><![CDATA[".$v['url']."]]></Url> </item>"; } $textTp5 .= " </Articles> </xml>"; //事件推送,粉丝关注时推送的消息 sprintf函数是用来制定模板类型,即指定按照哪个xml格式来传数据 if($event == "event") { $contentStr = "欢迎关注"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } //粉丝发送的文本信息 if($event == "text") { if($keyword == "约定"|| $keyword == "沙龙") { foreach($arrMusic as $k=>$v) { if($v['title'] == $keyword) { // $resultStr2 = sprintf($textTp3, $fromUsername, $toUsername, $time, $msgType3); $resultStr2 = sprintf($textTp3, $fromUsername, $toUsername, $time, $msgType3, $v['title'], $v['description'], $v['musicurl'], $v['hqmusicurl']); echo $resultStr2; break; } } } if($keyword == "精英班") { $this->responseTuWen($textTp4, $fromUsername, $toUsername, $time, $msgType4, $keyword); } if($keyword == "精英班日常") { $this->responseTuWen($textTp5, $fromUsername, $toUsername, $time, $msgType4, $keyword); } else { $this->responseText($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr, $keyword); } } //发送和粉丝一样的图片 else if($event == "image") { $this->responseImage($textTp2, $fromUsername, $toUsername, $time, $msgType2, $mediaId); } }else{ echo ""; exit; } } //给粉丝发送文本信息 public function responseText($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr,$keyword) { switch($keyword) { case '三围' : $contentStr ="我木有三围,你有吗?"; break; case '帅哥' : $contentStr ="我是萌妹子,好伐"; break; case '多高': $contentStr = "比你高~"; break; case '女神': $contentStr = "你也长的很好看啊~"; break; case 'i love you': $contentStr = "I love you too 么么~"; break; case '这是什么': $contentStr = "这是我的个人公众号啊~和其他公众号类似"; break; case '?' : $contentStr = '送你一串时间:'.date("Y-m-d H:i:s",time()); break; default : $contentStr = $keyword; break; } $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; } //给粉丝发送图片信息 public function responseImage($textTp2, $fromUsername, $toUsername, $time, $msgType2, $mediaId) { $resultStr2 = sprintf($textTp2, $fromUsername, $toUsername, $time, $msgType2, $mediaId); echo $resultStr2; } //给粉丝发送图文消息 public function responseTuWen($textTp4, $fromUsername, $toUsername, $time, $msgType4, $keyword) { $resultStr2 = sprintf($textTp4, $fromUsername, $toUsername, $time, $msgType4, $keyword); echo $resultStr2; }
代码未优化,只供参考。