一、简介
微信公众平台提供了三种消息回复的格式,即文本回复、图文回复和音乐回复,在这里我想跟大家分享下自己的体会,以供读者使用。
二、文本回复
文本回复xml 结构
- <xml>
- <ToUserName><![CDATA[toUser]]></ToUserName>
- <FromUserName><![CDATA[fromUser]]></FromUserName>
- <CreateTime>12345678</CreateTime>
- <MsgType><![CDATA[text]]></MsgType>
- <Content><![CDATA[content]]></Content>
- </xml>
我们可以将该结构封装成函数,在需要回复文本的地方直接调用:
- function response_text($object,$content)
- {
- $textTpl = "<xml>
- <ToUserName><![CDATA[%s]]></ToUserName>
- <FromUserName><![CDATA[%s]]></FromUserName>
- <CreateTime>".time()."</CreateTime>
- <MsgType><![CDATA[text]]></MsgType>
- <Content><![CDATA[%s]]></Content>
- <FuncFlag>%d</FuncFlag>
- </xml>";
- $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, $content, $flag);
- return $resultStr;
- }
实际程序调用上述函数
实现普通文本回复:
- public function handleText($postObj)
- {
- $keyword = trim($postObj->Content);
- if(!empty( $keyword ))
- {
- $contentStr = "微信公众平台-普通文本回复功能源代码";
- $resultStr = _response_text($postObj,$contentStr);
- echo $resultStr;
- }else{
- echo "Input something...";
- }
- }
实现关注时回复:
- public function handleEvent($object)
- {
- $from_MsgType = $object->Event;
- if ($from_MsgType == "subscribe")
- {
- $contentStr = "感谢您关注【你的帐号名】"."\n"."微信号:your account";
- }
- $resultStr = _response_text($object, $contentStr);
- return $resultStr;
- }
三、图文消息回复
图文回复xml 结构
- <xml>
- <ToUserName><![CDATA[toUser]]></ToUserName>
- <FromUserName><![CDATA[fromUser]]></FromUserName>
- <CreateTime>12345678</CreateTime>
- <MsgType><![CDATA[news]]></MsgType>
- <ArticleCount>1</ArticleCount>
- <Articles>
- <item>
- <Title><![CDATA[title1]]></Title>
- <Description><![CDATA[description1]]></Description>
- <PicUrl><![CDATA[picurl]]></PicUrl>
- <Url><![CDATA[url]]></Url>
- </item>
- </Articles>
- <FuncFlag>0</FuncFlag>
- </xml>
ToUserName | 是 | 接收方帐号(收到的OpenID) |
FromUserName | 是 | 开发者微信号 |
CreateTime | 是 | 消息创建时间 (整型) |
MsgType | 是 | news |
ArticleCount | 是 | 图文消息个数,限制为10条以内。此处为1,表示有单图文消息 |
Articles | 是 | 多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应 |
Title | 否 | 图文消息标题 |
Description | 否 | 图文消息描述 |
PicUrl | 否 | 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200 |
Url | 否 | 点击图文消息跳转链接 |
单图文消息
如果只是发送单图文消息,我们已经可以直接调用函数,传入参数即可实现首次关注发送单图文消息,完整代码如下:
- private function transmitNews($object, $ArticleCount, $Title,
- $Description, $PicUrl, $Url, $flag = 0)
- {
- $newsTpl = "<xml>
- <ToUserName><![CDATA[%s]]></ToUserName>
- <FromUserName><![CDATA[%s]]></FromUserName>
- <CreateTime>".time()."</CreateTime>
- <MsgType><![CDATA[news]]></MsgType>
- <ArticleCount>%s</ArticleCount>
- <Articles>
- <item>
- <Title><![CDATA[%s]]></Title>
- <Description><![CDATA[%s]]></Description>
- <PicUrl><![CDATA[%s]]><PicUrl>
- <Url><![CDATA[%s]]></Url>
- </item>
- </Articles>
- <FuncFlag>%d</FuncFlag>
- </xml>";
- $resultStr = sprintf($newsTpl, $object->FromUserName,
- $object->ToUserName, $ArticleCount, $Title, $Description,
- $PicUrl, $Url, $flag);
- return $resultStr;
- }
多图文消息
多图文消息与单图文消息基本类似,在标签<item>...</item>之后在插入一个或者多个<item>...</item>。
在讨论多图文之前,我们先对单图文消息结构做一些变动。此时我们将消息结构分解为三层,头部,主体,尾部,如下所示:
- $newsTplHead = "<xml>
- <ToUserName><![CDATA[%s]]></ToUserName>
- <FromUserName><![CDATA[%s]]></FromUserName>
- <CreateTime>%s</CreateTime>
- <MsgType><![CDATA[news]]></MsgType>
- <ArticleCount>2</ArticleCount>
- <Articles>";
- $newsTplBody1 = "<item>
- <Title><![CDATA[%s]]></Title>
- <Description><![CDATA[%s]]></Description>
- <PicUrl><![CDATA[%s]]></PicUrl>
- <Url><![CDATA[%s]]></Url>
- </item>";
- $newsTplBody2 = "<item>
- <Title><![CDATA[%s]]></Title>
- <Description><![CDATA[%s]]></Description>
- <PicUrl><![CDATA[%s]]></PicUrl>
- <Url><![CDATA[%s]]></Url>
- </item>";
- $newsTplFoot = "</Articles>
- <FuncFlag>0</FuncFlag>
- </xml>";
此时,调用单图文消息函数可以修改为:
- //输出图文消息
- private function transmitSingalNews($object, $newsContent)
- {
- $newsTplHead = "<xml>
- <ToUserName><![CDATA[%s]]></ToUserName>
- <FromUserName><![CDATA[%s]]></FromUserName>
- <CreateTime>".time()."</CreateTime>
- <MsgType><![CDATA[news]]></MsgType>
- <ArticleCount>1</ArticleCount>
- <Articles>";
- $newsTplBody = " <item>
- <Title><![CDATA[%s]]></Title>
- <Description><![CDATA[%s]]></Description>
- <PicUrl><![CDATA[%s]]><PicUrl>
- <Url><![CDATA[%s]]></Url>
- </item>";
- $newsTplFoot = "</Articles>
- <FuncFlag>%d</FuncFlag>
- </xml>";
- //图文消息开头
- //$bodyCount = 1;
- $head = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName);
- //图文消息内容
- $Title = $newsContent['Title'];
- $Description = $newsContent['Description'];
- $PicUrl = $newsContent['PicUrl'];
- $Url = $newsContent['Url'];
- $body = sprintf($newsTplBody, $Title, $Description, $PicUrl, $Url);
- $FuncFlag = 0;
- $foot = sprintf($newsTplFoot, $FuncFlag);
- return $head.$body.$foot;
- }
那么,只需要将newsContent数组设置为多维数组,循环载入数组参数值到newsTplBody中,即可实现自动回复单图文消息
稍作改动即可实现多图文消息,如下所示:
- //输出多图文消息
- private function transmitMultiNews($object, $newsContent)
- {
- $newsTplHead = "<xml>
- <ToUserName><![CDATA[%s]]></ToUserName>
- <FromUserName><![CDATA[%s]]></FromUserName>
- <CreateTime>".time()."</CreateTime>
- <MsgType><![CDATA[news]]></MsgType>
- <ArticleCount>%d</ArticleCount>
- <Articles>";
- $newsTplBody = "<item>
- <Title><![CDATA[%s]]></Title>
- <Description><![CDATA[%s]]></Description>
- <PicUrl><![CDATA[%s]]></PicUrl>
- <Url><![CDATA[%s]]></Url>
- </item>";
- $newsTplFoot = "</Articles>
- <FuncFlag>%d</FuncFlag>
- </xml>";
- //图文消息开头
- $bodyCount = count($newsContent);
- $head = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName,
- $bodyCount);
- //图文消息主要内容
- foreach ($newsContent as $key=>$value)
- {
- $body.=sprintf($newsTplBody, $value['Title'], $value['Description'],
- $value['PicUrl'], $value['Url']);
- }
- $FuncFlag = 0;
- $foot = sprintf($newsTplFoot, $FuncFlag);
- return $head.$body.$foot;
- }
我们采用foreeach语句对数组遍历。
foreach()有两种用法:
- 1: foreach(array_name as $value) {
- statement;
- }
这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。
例如,foreach($newsContent as $value)即表示将数组$newsContent的值赋给$value,从而我们可以在sprintf函数中引用变量$value向消息模板$newsTplBody传值。
- 2:foreach(array_name as $key => $value) {
- statement;
- }
这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如newsContent['Title']= 'String'中的“TItle”