前面写到我们怎样获取微信发送过来的xml数据包,获得用户发送的消息以及各种操作行为。那么我们应该怎样回复用户呢?
回复主要分为六种
①回复文本消息
XML结构是这样的,回复文字的时候如果保存的文本消息中有实体标签记得要用htmlspecialchars_decode转化一下。
public function makeText($text='') { $CreateTime = time(); $textTpl = "<xml> <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> <CreateTime>{$CreateTime}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; return sprintf($textTpl,$text); }
②回复图片信息
这是回复图片的XML结构,回复图片的media_id需要通过接口上传素材才能获得。
public function makePic($MediaId='') { $CreateTime = time(); $textTpl = "<xml> <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> <CreateTime>{$CreateTime}</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml>"; return sprintf($textTpl,$MediaId); }
③回复语音
回复语音的XML结构基本与图片类似,media_id也是通过接口上传素材获得的。
public function makeVoice($MediaId=""){ $CreateTime= time(); $textTpl = " <xml> <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> <CreateTime>{$CreateTime}</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <Voice> <MediaId><![CDATA[%s]]></MediaId> </Voice> </xml> "; return sprintf($textTpl,$MediaId); }
④回复视频消息
回复视频的XML结构,其中标题和描述并非是必须的,可以选择不写。
public function makeVideo($mediaId="",$title="",$desc=""){ $createtime=time(); $textTpl=" <xml> <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> <CreateTime>{$createtime}</CreateTime> <MsgType><![CDATA[video]]></MsgType> <Video> <MediaId><![CDATA[%s]]></MediaId> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> </Video> </xml> "; return sprintf($textTpl,$mediaId,$title,$desc); }
如箭头所示,如果加了标题和描述就会显示在这里。如果有实体标签,也要转义一下,否则就直接输出实体标签了。
⑤回复音乐消息
回复音乐的XML结构稍微有点多,但是很多不是必须的,如果填写了带实体标签的字符串,一定要转化一下。
public function makeMusic($mediaId="",$title="",$desc="",$url="",$hqurl=""){ $createtime=time(); $textTpl=" <xml> <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> <CreateTime>{$createtime}</CreateTime> <MsgType><![CDATA[music]]></MsgType> <Music> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <MusicUrl><![CDATA[%s]]></MusicUrl> <HQMusicUrl><![CDATA[%s]]></HQMusicUrl> <ThumbMediaId><![CDATA[%s]]></ThumbMediaId> </Music> </xml> "; return sprintf($textTpl,$title,$desc,$url,$hqurl,$mediaId); }
回复音乐中其他的注释都很清楚,但是这个缩略图media_id描述的不是很清楚,作者使用了上传缩略图接口上传了图片,也写在了里面,但是貌似没什么用。如果有知道的童鞋们,还望告知下。
⑥回复图文消息
回复图文在回复中的XML是最复杂的,也最容易出错。在Articles中的这段是最重要的,其中所有的字符串最好都转化一下,以防万一。
public function makeNews($newsData=array()) { $CreateTime = time(); $newTplHeader = "<xml> <ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName> <FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName> <CreateTime>{$CreateTime}</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>%s</ArticleCount><Articles>"; $newTplItem = "<item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item>"; $newTplFoot = "</Articles> </xml>"; $Content = ''; $itemsCount = count($newsData['items']); $itemsCount = $itemsCount < 10 ? $itemsCount : 10;//微信公众平台图文回复的消息一次最多10条 if ($itemsCount) { foreach ($newsData['items'] as $key => $item) { if ($key<=9) { $Content .= sprintf($newTplItem,$item['title'],$item['description'],$item['picurl'],$item['url']); } } } $header = sprintf($newTplHeader,$itemsCount); $footer = sprintf($newTplFoot); return $header . $Content . $footer; }
这个方法适合于回复所有类型的图文,只要传入一个数组就会拼接成要回复的图文模式,这个里面的字符串也是需要对实体标签解码的
总之,无论微信返回什么,代码里的一点点小错误就会导致“该公众号暂时无法提供服务,请稍后再试”,而你根本不知道你做错了什么。所以写这个的时候要严谨,尽量避免小错误,可以节省大量的时间。