一、簡介
微信公衆平臺提供了三種消息回覆的格式,即文本回復、圖文回覆和音樂回覆,在這裏我想跟大家分享下自己的體會,以供讀者使用。
二、文本回復
文本回復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”