一、简介
微信公众平台提供了三种消息回复的格式,即文本回复、图文回复和音乐回复,在这里我想跟大家分享下自己的体会,以供读者使用。
二、文本回复
文本回复xml 结构
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[content]]></Content>
</xml>
说明:ToUserName表示接收消息方帐号,即发送请求消息的用户。填写的值是$fromUsername = $postObj->FromUserName
我们可以将该结构封装成函数,在需要回复文本的地方直接调用:
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;
}
说明:sprintf函数根据格式textTpl,依次输入参数。
实际程序调用上述函数
实现普通文本回复:
public function handleText($postObj)
{
$keyword = trim($postObj->Content);
if(!empty( $keyword ))
{
$contentStr = "微信公众平台-普通文本回复功能源代码";
$resultStr = _response_text($postObj,$contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}
说明:trim 是为了去掉字符串首尾的空格
实现关注时回复:
public function handleEvent($object)
{
$from_MsgType = $object->Event;
if ($from_MsgType == "subscribe")
{
$contentStr = "感谢您关注【你的帐号名】"."\n"."微信号:your account";
}
$resultStr = _response_text($object, $contentStr);
return $resultStr;
}
说明:"感谢您关注【你的帐号名】"."\n"."微信号:your account"。本行代码中插入了一个换行符,我们采用'.'拼接两个字符串
三、图文消息回复
图文回复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”