【php】微信公衆帳號開發接口--消息回覆

一、簡介

微信公衆平臺提供了三種消息回覆的格式,即文本回復、圖文回覆和音樂回覆,在這裏我想跟大家分享下自己的體會,以供讀者使用。


二、文本回復

 文本回復xml 結構

  1. <xml>  
  2. <ToUserName><![CDATA[toUser]]></ToUserName>  
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>  
  4. <CreateTime>12345678</CreateTime>  
  5. <MsgType><![CDATA[text]]></MsgType>  
  6. <Content><![CDATA[content]]></Content>  
  7. </xml>  
說明:ToUserName表示接收消息方帳號,即發送請求消息的用戶。填寫的值是$fromUsername = $postObj->FromUserName


我們可以將該結構封裝成函數,在需要回覆文本的地方直接調用:

  1. function response_text($object,$content)  
  2. {  
  3.     $textTpl = "<xml>  
  4.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  5.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  6.                 <CreateTime>".time()."</CreateTime>  
  7.                 <MsgType><![CDATA[text]]></MsgType>  
  8.                 <Content><![CDATA[%s]]></Content>  
  9.                 <FuncFlag>%d</FuncFlag>  
  10.                 </xml>";  
  11.     $resultStr = sprintf($textTpl$object->FromUserName, $object->ToUserName, $content$flag);  
  12.     return $resultStr;  
  13. }  
說明:sprintf函數根據格式textTpl,依次輸入參數。


實際程序調用上述函數

實現普通文本回復:

  1. public function handleText($postObj)  
  2. {  
  3.         $keyword = trim($postObj->Content);  
  4.    
  5.         if(!empty$keyword ))  
  6.         {  
  7.             $contentStr = "微信公衆平臺-普通文本回復功能源代碼";  
  8.             $resultStr = _response_text($postObj,$contentStr);  
  9.             echo $resultStr;  
  10.         }else{  
  11.             echo "Input something...";  
  12.         }  
  13. }  
說明:trim 是爲了去掉字符串首尾的空格

實現關注時回覆:

  1. public function handleEvent($object)  
  2. {  
  3.         $from_MsgType = $object->Event;  
  4.         if ($from_MsgType == "subscribe")          
  5.         {   
  6.             $contentStr = "感謝您關注【你的帳號名】"."\n"."微信號:your account";  
  7.         }  
  8.          
  9.         $resultStr = _response_text($object$contentStr);  
  10.         return $resultStr;  
  11. }  
說明:"感謝您關注【你的帳號名】"."\n"."微信號:your account"。本行代碼中插入了一個換行符,我們採用'.'拼接兩個字符串

三、圖文消息回覆

圖文回覆xml 結構

  1. <xml>  
  2. <ToUserName><![CDATA[toUser]]></ToUserName>  
  3. <FromUserName><![CDATA[fromUser]]></FromUserName>  
  4. <CreateTime>12345678</CreateTime>  
  5. <MsgType><![CDATA[news]]></MsgType>  
  6. <ArticleCount>1</ArticleCount>  
  7. <Articles>  
  8. <item>  
  9. <Title><![CDATA[title1]]></Title>  
  10. <Description><![CDATA[description1]]></Description>  
  11. <PicUrl><![CDATA[picurl]]></PicUrl>  
  12. <Url><![CDATA[url]]></Url>  
  13. </item>  
  14. </Articles>  
  15. <FuncFlag>0</FuncFlag>  
  16. </xml>  
說明:

ToUserName 接收方帳號(收到的OpenID)
FromUserName 開發者微信號
CreateTime 消息創建時間 (整型)
MsgType news
可以看出,前四個參數與文本消息相同,不同之處在於MsgType 由text 變爲news了。

ArticleCount 圖文消息個數,限制爲10條以內。此處爲1,表示有單圖文消息
Articles 多條圖文消息信息,默認第一個item爲大圖,注意,如果圖文數超過10,則將會無響應
Title 圖文消息標題
Description 圖文消息描述
PicUrl 圖片鏈接,支持JPG、PNG格式,較好的效果爲大圖360*200,小圖200*200
Url 點擊圖文消息跳轉鏈接

單圖文消息

如果只是發送單圖文消息,我們已經可以直接調用函數,傳入參數即可實現首次關注發送單圖文消息,完整代碼如下:

  1. private function transmitNews($object$ArticleCount$Title,  
  2.             $Description$PicUrl$Url$flag = 0)  
  3. {  
  4.     $newsTpl = "<xml>  
  5.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  6.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  7.                 <CreateTime>".time()."</CreateTime>  
  8.                 <MsgType><![CDATA[news]]></MsgType>  
  9.                 <ArticleCount>%s</ArticleCount>  
  10.                 <Articles>  
  11.                 <item>  
  12.                 <Title><![CDATA[%s]]></Title>  
  13.                 <Description><![CDATA[%s]]></Description>  
  14.                 <PicUrl><![CDATA[%s]]><PicUrl>  
  15.                 <Url><![CDATA[%s]]></Url>  
  16.                 </item>  
  17.                 </Articles>  
  18.                 <FuncFlag>%d</FuncFlag>  
  19.                 </xml>";      
  20.     $resultStr = sprintf($newsTpl$object->FromUserName,   
  21.         $object->ToUserName, $ArticleCount$Title$Description,   
  22.         $PicUrl$Url$flag);  
  23.     return $resultStr;        
  24. }  
具體步驟,請參考青龍老賊的文章

多圖文消息

多圖文消息與單圖文消息基本類似,在標籤<item>...</item>之後在插入一個或者多個<item>...</item>。

在討論多圖文之前,我們先對單圖文消息結構做一些變動。此時我們將消息結構分解爲三層,頭部,主體,尾部,如下所示:

  1. $newsTplHead = "<xml>  
  2.                 <ToUserName><![CDATA[%s]]></ToUserName>  
  3.                 <FromUserName><![CDATA[%s]]></FromUserName>  
  4.                 <CreateTime>%s</CreateTime>  
  5.                 <MsgType><![CDATA[news]]></MsgType>  
  6.                 <ArticleCount>2</ArticleCount>  
  7.                 <Articles>";  
  8. $newsTplBody1 = "<item>  
  9.                 <Title><![CDATA[%s]]></Title>  
  10.                 <Description><![CDATA[%s]]></Description>  
  11.                 <PicUrl><![CDATA[%s]]></PicUrl>  
  12.                 <Url><![CDATA[%s]]></Url>  
  13.                 </item>";  
  14.   
  15. $newsTplBody2 = "<item>  
  16.                 <Title><![CDATA[%s]]></Title>  
  17.                 <Description><![CDATA[%s]]></Description>  
  18.                 <PicUrl><![CDATA[%s]]></PicUrl>  
  19.                 <Url><![CDATA[%s]]></Url>  
  20.                 </item>";  
  21.   
  22. $newsTplFoot = "</Articles>   
  23.                 <FuncFlag>0</FuncFlag>   
  24.                 </xml>";  

此時,調用單圖文消息函數可以修改爲:
  1. //輸出圖文消息  
  2.     private function transmitSingalNews($object$newsContent)  
  3.     {  
  4.         $newsTplHead = "<xml>  
  5.                     <ToUserName><![CDATA[%s]]></ToUserName>  
  6.                     <FromUserName><![CDATA[%s]]></FromUserName>  
  7.                     <CreateTime>".time()."</CreateTime>  
  8.                     <MsgType><![CDATA[news]]></MsgType>  
  9.                     <ArticleCount>1</ArticleCount>  
  10.                     <Articles>";  
  11.         $newsTplBody = "    <item>  
  12.                     <Title><![CDATA[%s]]></Title>  
  13.                     <Description><![CDATA[%s]]></Description>  
  14.                     <PicUrl><![CDATA[%s]]><PicUrl>  
  15.                     <Url><![CDATA[%s]]></Url>  
  16.                     </item>";  
  17.         $newsTplFoot = "</Articles>  
  18.                     <FuncFlag>%d</FuncFlag>  
  19.                     </xml>";      
  20.           
  21.         //圖文消息開頭  
  22.         //$bodyCount = 1;  
  23.         $head = sprintf($newsTplHead$object->FromUserName, $object->ToUserName);  
  24.   
  25.         //圖文消息內容  
  26.         $Title = $newsContent['Title'];  
  27.         $Description = $newsContent['Description'];  
  28.         $PicUrl = $newsContent['PicUrl'];  
  29.         $Url = $newsContent['Url'];  
  30.         $body = sprintf($newsTplBody$Title$Description$PicUrl$Url);  
  31.   
  32.         $FuncFlag = 0;  
  33.         $foot = sprintf($newsTplFoot$FuncFlag);  
  34.   
  35.         return $head.$body.$foot;         
  36.     }  

那麼,只需要將newsContent數組設置爲多維數組,循環載入數組參數值到newsTplBody中,即可實現自動回覆單圖文消息

稍作改動即可實現多圖文消息,如下所示:

  1. //輸出多圖文消息  
  2.     private function transmitMultiNews($object$newsContent)  
  3.     {  
  4.         $newsTplHead = "<xml>  
  5.                     <ToUserName><![CDATA[%s]]></ToUserName>  
  6.                     <FromUserName><![CDATA[%s]]></FromUserName>  
  7.                     <CreateTime>".time()."</CreateTime>  
  8.                     <MsgType><![CDATA[news]]></MsgType>  
  9.                     <ArticleCount>%d</ArticleCount>  
  10.                     <Articles>";  
  11.         $newsTplBody = "<item>  
  12.                     <Title><![CDATA[%s]]></Title>  
  13.                     <Description><![CDATA[%s]]></Description>  
  14.                     <PicUrl><![CDATA[%s]]></PicUrl>  
  15.                     <Url><![CDATA[%s]]></Url>  
  16.                     </item>";  
  17.         $newsTplFoot = "</Articles>  
  18.                     <FuncFlag>%d</FuncFlag>  
  19.                     </xml>";      
  20.         //圖文消息開頭  
  21.         $bodyCount = count($newsContent);  
  22.         $head = sprintf($newsTplHead$object->FromUserName, $object->ToUserName,  
  23.                         $bodyCount);  
  24.   
  25.         //圖文消息主要內容  
  26.         foreach ($newsContent as $key=>$value)  
  27.         {  
  28.             $body.=sprintf($newsTplBody$value['Title'], $value['Description'],  
  29.                         $value['PicUrl'], $value['Url']);  
  30.         }  
  31.   
  32.         $FuncFlag = 0;  
  33.         $foot = sprintf($newsTplFoot$FuncFlag);  
  34.   
  35.         return $head.$body.$foot;         
  36.           
  37.     }  

我們採用foreeach語句對數組遍歷。
foreach()有兩種用法:

  1. 1: foreach(array_name as $value)    {       
  2.   
  3. statement;    
  4.   
  5. }  

這裏的array_name是你要遍歷的數組名,每次循環中,array_name數組的當前元素的值被賦給$value,並且數組內部的下標向下移一步,也就是下次循環回得到下一個元素。

例如,foreach($newsContent as $value)即表示將數組$newsContent的值賦給$value,從而我們可以在sprintf函數中引用變量$value向消息模板$newsTplBody傳值。

  1. 2:foreach(array_name as $key => $value)    {       
  2.   
  3.   statement;      
  4.   
  5. }   

這裏跟第一種方法的區別就是多了個$key,也就是除了把當前元素的值賦給$value外,當前元素的鍵值也會在每次循環中被賦給變量$key。鍵值可以是下標值,也可以是字符串。比如newsContent['Title']= 'String'中的“TItle”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章