微信公众平台提供了三种消息回复的格式,即文本回复、图文回复和音乐回复,在这里我想跟大家分享下自己的体会,以供读者使用。
<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> <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; }
稍作改动即可实现多图文消息,如下所示:
//输出多图文消息 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; }
1: foreach(array_name as $value) { statement; }
例如,foreach($newsContent as $value)即表示将数组$newsContent的值赋给$value,从而我们可以在sprintf函数中引用变量$value向消息模板$newsTplBody传值。
2:foreach(array_name as $key => $value) { statement; }