微信消息管理之被动回复用户消息

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。


首先处理用户发过来的消息,然后根据消息服务器做出相应的响应。

  1. public function responseMsg(){  
  2.     //get post data, May be due to the different environments  
  3.     $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];   //用户端发来的数据  
  4.       
  5.     //if (!empty($postStr)){  
  6.     /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, 
  7.        the best way is to check the validity of xml by yourself */  
  8.     libxml_disable_entity_loader(true);  
  9.     //通过simplexml进行数据解析,转换为对象  
  10.     $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);     
  11.       
  12.       
  13.     switch($postObj->MsgType){              //用户发送的消息类型  
  14.          case "event":   
  15.             $this->_doEvent($postObj);   
  16.             break;  
  17.          case "text":   
  18.             $this->_doText($postObj);   
  19.             break;  
  20.          case "image":   
  21.             $this->_doImage($postObj);   
  22.             break;  
  23.          case "voice":   
  24.             $this->_doVoice($postObj);   
  25.             break;  
  26.          case "music":   
  27.             $this->_doMusic($postObj);   
  28.             break;  
  29.         case "location":   
  30.             $this->_doLocation($postObj);   
  31.             break;  
  32.          default:   
  33.             break;  
  34.     }    
  35.              
  36. }  

1.文本消息
  1. //文本消息  
  2. private function _doText($postObj){  
  3.       
  4.     $fromUsername = $postObj->FromUserName;  
  5.     $toUsername = $postObj->ToUserName;  
  6.     $keyword = trim($postObj->Content);  
  7.     $time = time();  
  8.     $textTpl = "<xml>  
  9.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  10.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  11.                 <CreateTime>%s</CreateTime>  
  12.                 <MsgType><![CDATA[%s]]></MsgType>  
  13.                 <Content><![CDATA[%s]]></Content>  
  14.                 <FuncFlag>0</FuncFlag>  
  15.                 </xml>";               
  16.     $msgType = "text";  
  17.       
  18.     switch($keyword){  
  19.         case '初音科技':  
  20.             $contentStr = "提供一流的技术支持!!";  
  21.             break;  
  22.         case 'PHP':  
  23.             $contentStr = "最美的语言!!";  
  24.             break;  
  25.         case '图文':  
  26.             $newsArr = array(  
  27.                     array(  
  28.                     'Title'=>'初音科技,专为高端网络定制',  
  29.                     'Description'=>'初音科技,做一个品牌影响一个行业!',  
  30.                     'PicUrl'=>'http://edu.zbxiaochengxu.com/o_1b9pjfv6i1111gp69pp1m45sd7q.jpg',  
  31.                     'Url'=>'http://mp.weixin.qq.com/s?__biz=MzA4NTkzMzI0Ng==&mid=2652036751&idx=2&sn=641c21e3831c094cdaf40e115c9eaee6&scene=0#wechat_redirect',  
  32.                 ),  
  33.                 array(  
  34.                     'Title'=>'初音科技,专为高端网络定制',  
  35.                     'Description'=>'初音科技,做一个品牌影响一个行业!',  
  36.                     'PicUrl'=>'http://qfenxiang.chuyin.net.cn/weixinopen/images/0.jpg',  
  37.                     'Url'=>'http://mp.weixin.qq.com/s?__biz=MzA4NTkzMzI0Ng==&mid=2652036751&idx=2&sn=641c21e3831c094cdaf40e115c9eaee6&scene=0#wechat_redirect',  
  38.                 )  
  39.             );  
  40.             $this->_replayNews($postObj,$newsArr);   
  41.             break;  
  42.         default:  
  43.             $contentStr = "启军测试微信公众号响应!!";  
  44.             break;  
  45.     }   
  46.       
  47.     $resultStr = sprintf($textTpl$fromUsername$toUsername$time$msgType$contentStr);  
  48.     echo $resultStr;      
  49. }  

2.图片消息
  1. //回复图片消息  
  2. private function _doImage($postObj,$mediaId){  
  3.       
  4.     //$contentStr = "您发送的是图片信息!消息类型为:".$postObj->PicUrl."\nMediaId为:".$postObj->MediaId;  
  5.     if$postObj->MsgType == 'image'){  
  6.         $mediaId = $postObj->MediaId;  
  7.     }  
  8.       
  9.     $fromUsername = $postObj->FromUserName;  
  10.     $toUsername = $postObj->ToUserName;  
  11.     $time = time();  
  12.     $imageTpl = "<xml>  
  13.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  14.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  15.                 <CreateTime>%s</CreateTime>  
  16.                 <MsgType><![CDATA[%s]]></MsgType>  
  17.                 <Image>  
  18.                 <MediaId><![CDATA[%s]]></MediaId>  
  19.                 </Image>  
  20.                 </xml>";  
  21.     $msgType = "image";  
  22.       
  23.     //$this->_replayText($postObj,$contentStr);  
  24.     $resultStr = sprintf($imageTpl,$fromUsername,$toUsername,$time,$msgType,$mediaId);  
  25.     echo $resultStr;  
  26. }  

3.语音消息
  1. //回复语音消息  
  2. private function _doVoice($postObj,$mediaId){  
  3.       
  4.       
  5.     if$postObj->MsgType == 'voice'){  
  6.         //$mediaId = $postObj->MediaId;  
  7.         $contentStr = "您发送的是语音信息!\n你说的是:".$postObj->Recognition;  
  8.         $this->_replayText($postObj,$contentStr);  
  9.         exit();  
  10.     }  
  11.       
  12.     $fromUsername = $postObj->FromUserName;  
  13.     $toUsername = $postObj->ToUserName;  
  14.     $time = time();  
  15.     $voiceTpl = "<xml>  
  16.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  17.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  18.                 <CreateTime>%s</CreateTime>  
  19.                 <MsgType><![CDATA[%s]]></MsgType>  
  20.                 <Voice>  
  21.                 <MediaId><![CDATA[%s]]></MediaId>  
  22.                 </Voice>  
  23.                 </xml>";  
  24.     $msgType = "voice";  
  25.       
  26.     $resultStr = sprintf($voiceTpl,$fromUsername,$toUsername,$time,$msgType,$mediaId);  
  27.     echo $resultStr;  
  28.       
  29. }  

4.音乐消息
  1. //音乐消息  
  2. private function _doMusic($postObj){  
  3.       
  4.     $fromUsername = $postObj->FromUserName;  
  5.     $toUsername = $postObj->ToUserName;  
  6.     $time = time();  
  7.     $musicTpl = "<xml>  
  8.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  9.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  10.                 <CreateTime>%s</CreateTime>  
  11.                 <MsgType><![CDATA[%s]]></MsgType>  
  12.                 <Music>  
  13.                 <Title><![CDATA[%s]]></Title>  
  14.                 <Description><![CDATA[%s]]></Description>  
  15.                 <MusicUrl><![CDATA[%s]]></MusicUrl>  
  16.                 <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>  
  17.                 </Music>  
  18.                 </xml>";               
  19.     $msgType = "music";  
  20.     $title = "还魂门";  
  21.     $desc = "电视剧<老九门>主题曲";  
  22.     $url = "http://qfenxiang.chuyin.net.cn/weixinopen/musics/music.mp3";  
  23.     $hqurl = "http://qfenxiang.chuyin.net.cn/weixinopen/musics/music.mp3";  
  24.           
  25.     $resultStr = sprintf($musicTpl,$fromUsername,$toUsername,$time,$msgType,$title,$desc,$url,$hqurl,$contentStr);  
  26.     echo $resultStr;  
  27. }  

5.图文消息
  1. //[封装]图文回复  
  2. private function _replayNews($postObj,$newsArr){  
  3.       
  4.     if( !is_array($newsArr) || sizeof($newsArr)<1 ){  
  5.         $newsArr = array(  
  6.             array(  
  7.                 'Title'=>'全民创业蒙的就是你,来一盆冷水吧!',  
  8.                 'Description'=>'全民创业已经如火如荼,然而创业是一个非常自我的过程,它是一种生活方式的选择。从外部的推动有助于提高创业的存活率,但是未必能够提高创新的成功率。',  
  9.                 'PicUrl'=>'http://yun.topthink.com/Uploads/Editor/2015-07-30/55b991cad4c48.jpg',  
  10.                 'Url'=>'http://www.topthink.com/topic/11991.html',  
  11.             )  
  12.         );  
  13.     }  
  14.       
  15.     $itemStr = '';  
  16.     foreach($newsArr as $item){  
  17.         $newsData = '<item>  
  18.                         <Title><![CDATA[%s]]></Title>   
  19.                         <Description><![CDATA[%s]]></Description>  
  20.                         <PicUrl><![CDATA[%s]]></PicUrl>  
  21.                         <Url><![CDATA[%s]]></Url>  
  22.                     </item>';  
  23.         $itemStr .= sprintf($newsData,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);  
  24.     }  
  25.       
  26.     $fromUsername = $postObj->FromUserName;  
  27.     $toUsername = $postObj->ToUserName;  
  28.     $time = time();  
  29.     $newsTpl = '<xml>  
  30.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  31.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  32.                 <CreateTime>%s</CreateTime>  
  33.                 <MsgType><![CDATA[%s]]></MsgType>  
  34.                 <ArticleCount>%s</ArticleCount>  
  35.                 <Articles>'.$itemStr.'</Articles>  
  36.                 </xml>';  
  37.     $msgType = 'news';  
  38.     $count = count($newsArr);  
  39.       
  40.     $resultStr = sprintf($newsTpl,$fromUsername,$toUsername,$time,$msgType,$count,$str);  
  41.     echo $resultStr;      
  42. }  

微信消息管理之被动回复用户消息