一、簡介
微信公眾平臺提供了三種訊息回覆的格式,即文字回復、音樂回覆和圖文回覆,在這一篇文章中,我們將對這三種訊息回覆的格式做一下簡單講解,然後封裝成函式,以供讀者使用。
二、思路分析
對於每一個POST請求,開發者在響應包中返回特定xml結構,對該訊息進行響應(現支援回覆文字、圖文、語音、影片、音樂)。
三、文字回復
3.1 文字回復xml 結構
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[content]]></Content> </xml>
3.2 結構說明
3.3 具體實施
針對上面給出的xml 結構,我們只需要在對應的位置填上內容,然後格式化輸出就可以了。
說明:
ToUserName 位置上填寫的是$fromUsername = $postObj->FromUserName,就是把訊息返回給傳送資訊過來的使用者,即接收方賬號。
FromUserName 位置上填寫的是$toUsername = $postObj->ToUserName,既是開發者微訊號。
這是官方的文字回復,只需例項化它的responseMsg() 方法就可以回覆 “Welcome to wechat world!” 訊息了。
這裡我們稍做修改,返回fromUsername 和toUsername 訊息,便於讀者理解以上的說明。
3.4 測試結果
3.5 封裝成可呼叫的函式
我們可以將上面的內容封裝成函式,在需要回覆文字的地方直接呼叫,方便簡潔,responseText.func.inc.php 程式碼如下。
function _response_text($object,$content){ $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>%d</FuncFlag> </xml>"; $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag); return $resultStr; }
這樣,只要傳入$object 和$content,然後在需要回覆文字的檔案中引入該檔案,然後呼叫 _response_text() 方法,就可以直接回覆文字了。
3.6 測試程式碼
3.6.1 在主檔案中引入回覆文字的函式檔案
require_once 'responseText.func.inc.php';
3.6.2 普通訊息回覆
public function handleText($postObj) { $keyword = trim($postObj->Content); if(!empty( $keyword )) {
$contentStr = "微信公眾平臺-文字回復功能原始碼"; //$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); $resultStr = _response_text($postObj,$contentStr); echo $resultStr; }else{ echo "Input something..."; } }
3.6.3 關注時回覆
public function handleEvent($object) { $contentStr = ""; switch ($object->Event) { case "subscribe": $contentStr = "感謝您關注【卓錦蘇州】"."\n"."微訊號:zhuojinsz"; break; default : $contentStr = "Unknow Event: ".$object->Event; break; } $resultStr = _response_text($object, $contentStr); return $resultStr; }
3.7 測試結果
回覆文字成功。
四、圖文回覆
4.1 圖文回覆xml 結構
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[title1]]></Title> <Description><![CDATA[description1]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> <item> <Title><![CDATA[title]]></Title> <Description><![CDATA[description]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> </Articles> </xml>
4.2 結構說明
類似文字回復的格式,只需要在相應的位置填上對應的內容就可以回覆圖文資訊了。
4.3 具體實施
圖文回覆可以是單圖文,也可以是多圖文,這裡我們先以單圖文的案例來引導讀者,然後再引出多圖文。
我們將回復圖文的xml 結構分解成為以下三個結構,圖文頭,圖文體,圖文尾,圖文體就是圖文回覆時看到的標題,描述,圖片URL和原文URL。
$newsTplHead = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</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>0</FuncFlag> </xml>";
接下來,我們對三段結構分別插入對應內容:
A. $newsTplHead
$header = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName, time());
B. $newsTplBody
$title = $newsContent['title'];
$desc = $newsContent['description'];
$picUrl = $newsContent['picUrl'];
$url = $newsContent['url'];
$body = sprintf($newsTplBody, $title, $desc, $picUrl, $url);
說明:$newsContent 是從主檔案傳入函式的圖文陣列。
C. $newsTplFoot
$FuncFlag = 0;
$footer = sprintf($newsTplFoot, $FuncFlag);
然後將三段進行拼接返回就可以回覆單條圖文了。
return $header.$body.$footer;
將以上內容寫到一個函式里,命名為 _response_news() 函式,以供下面呼叫測試。
4.4 測試程式碼
4.4.1 在主檔案中引入回覆圖文的函式檔案
require_once 'responseNews.func.inc.php';
4.4.2 建立陣列並傳入
在主檔案中,只需要向 _response_news() 函式中傳入一個陣列和$postObj 即可。
$record=array( 'title' =>'山塘街', 'description' =>'山塘街東起閶門渡僧橋,西至蘇州名勝虎丘山的望山橋,長約七里,所以蘇州俗語說“七里山塘到虎丘”...', 'picUrl' => 'http://thinkshare.duapp.com/images/suzhou.jpg', 'url' =>'http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000046&itemidx=1&sign=9e7707d5615907d483df33ee449b378d#wechat_redirect' ); $resultStr = _response_news($postObj,$record); echo $resultStr;
4.5 測試結果
點選進入檢視
單圖文回覆測試成功。
4.6 多圖文回覆
有了上面的引導,讀者應該能夠想到回覆多圖文的思路了,就是將多維陣列中的值迴圈放到相應的位置,然後拼接起來就可以了,下面進行講解。
4.6.1 獲取圖文條數
$bodyCount = count($newsContent);
4.6.2 判斷圖文條數
因為微信限制了回覆的圖文訊息數為10條以內,所以需要判斷圖文條數,如果小於10條,則圖文數等於原來的圖文數,如果大於等於10條,則強制限制為10條。
$bodyCount = $bodyCount < 10 ? $bodyCount : 10;
4.6.3 組織圖文體
圖文頭和圖文尾和上面單圖文一樣,不再贅述,主要是圖文體的組織。
用foreach 迴圈出陣列的內容並賦予圖文體,並進行拼接:
foreach($newsContent as $key => $value){ $body .= sprintf($newsTplBody, $value['title'], $value['description'], $value['picUrl'], $value['url']); }
說明:$newsContent 是從主檔案傳入函式的圖文陣列。
4.6.4 拼接並返回
return $header.$body.$footer;
將以上內容寫到一個函式里,命名為 _response_multiNews() 函式,以供下面呼叫測試。
4.7 測試多圖文
4.7.1 在主檔案中引入回覆多圖文的函式檔案
require_once 'responseMultiNews.func.inc.php';
4.7.2 建立多維陣列並傳入
$record[0]=array( 'title' =>'觀前街', 'description' =>'觀前街位於江蘇蘇州市區,是成街於清朝時期的百年商業老街,街上老店名店雲集,名聲遠播海內外...', 'picUrl' => 'http://joythink.duapp.com/images/suzhou.jpg', 'url' =>'http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000052&itemidx=1&sign=90518631fd3e85dd1fde7f77c04e44d5#wechat_redirect' ); ...... $record[11]=array( 'title' =>'平江路', 'description' =>'平江路位於蘇州古城東北,是一條傍河的小路,北接拙政園,南眺雙塔,全長1606米,是蘇州一條歷史攸久的經典水巷。宋元時候蘇州又名平江,以此名路...', 'picUrl' => 'http://joythink.duapp.com/images/suzhouScenic/pingjianglu.jpg', 'url' =>'http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000056&itemidx=1&sign=ef18a26ce78c247f3071fb553484d97a#wechat_redirect' ); $resultStr = _response_multiNews($postObj,$record); echo $resultStr;
4.8 測試多圖文結果
點選進入檢視
測試多圖文成功。
五、音樂回覆
微信還提供了一種訊息回覆的格式,即音樂回覆,下面我們編寫程式測試一下。
注意:由於音樂版權的問題,現在很少有回覆音樂的API,開放的API 查詢出來的音樂資訊也有很多是不正確的。所以在這裡,我們上傳幾首音樂到自己的伺服器空間測試。
本地檔案:
測試是否能夠正常播放:
5.1 音樂回覆xml 結構
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[music]]></MsgType> <Music> <Title><![CDATA[TITLE]]></Title> <Description><![CDATA[DESCRIPTION]]></Description> <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl> <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl> </Music> </xml>
5.2 結構說明
5.3 具體實施
我們先做一個固定的歌曲回覆來引導讀者,然後再引出更高階別的歌曲查詢回覆。
5.3.1 在xml 結構的相應位置插入相應資料
<Music> <Title><![CDATA[Far Away From Home]]></Title> <Description><![CDATA[Groove Coverage]]></Description> <MusicUrl><![CDATA[http://thinkshare.duapp.com/music/10001.mp3]]></MusicUrl> <HQMusicUrl><![CDATA[http://thinkshare.duapp.com/music/10001.mp3]]></HQMusicUrl> </Music>
5.3.2 測試程式碼
$resultStr = _response_music($postObj,$keyword); echo $resultStr;
5.3.3 測試結果
5.4 模擬點歌
有了上面的簡單案例引導,讀者應該可以想到模擬點歌的具體實現了吧,下面就來簡單介紹一下。
思路:將歌曲程式碼和對應的歌曲名存入資料庫,使用者輸入歌曲名,在資料庫中找到歌曲名對應的歌曲編號,然後就可以生成MusicUrl 回覆使用者了。
5.4.1 建立資料庫
建表語句及資料檔案:
CREATE TABLE IF NOT EXISTS `tbl_music` ( `music_id` int(11) NOT NULL, `music_name` varchar(40) NOT NULL, `music_singer` varchar(40) NOT NULL, `music_lrc` text NOT NULL, PRIMARY KEY (`music_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `tbl_music` (`music_id`, `music_name`, `music_singer`, `music_lrc`) VALUES (10001, 'Far Away From Home', 'Groove Coverage', 'far away from home'), (10002, 'The Dawn', 'Dreamtale', 'the dawn'), (20002, '董小姐', '宋冬野', '董小姐'), (20001, '左邊', '楊丞琳', '左邊');
5.4.2 _response_music() 函式編寫
A. 引入資料庫操作檔案
require_once('mysql_bae.func.php');
B. 資料庫操作及資料處理
$query = "SELECT * FROM tbl_music WHERE music_name LIKE '%$musicKeyword%'"; $result = _select_data($query); $rows = mysql_fetch_array($result, MYSQL_ASSOC); $music_id = $rows[music_id];
注: $musicKeyword 為從主檔案傳入的歌曲名關鍵字,這裡使用模糊查詢,只取第一條資料。
C. 判斷是否查詢到
if($music_id <> '') { $music_name = $rows[music_name]; $music_singer = $rows[music_singer]; $musicUrl = "http://thinkshare.duapp.com/music/".$music_id.".mp3"; $HQmusicUrl = "http://thinkshare.duapp.com/music/".$music_id.".mp3"; $resultStr = sprintf($musicTpl, $object->FromUserName, $object->ToUserName, time(), $music_name, $music_singer, $musicUrl, $HQmusicUrl); return $resultStr; }else{ return ""; }
說明:如果查詢到歌曲資訊,按照xml 結構返回資料;如果未查詢到,則返回空,用於主檔案判斷。
將以上程式碼封裝成 _response_music() 函式並儲存為responseMusic.func.inc.php 檔案供主檔案呼叫。
5.4.3 測試程式碼
A. 引入回覆音樂和回覆文字的函式檔案
//引入回覆音樂的函式檔案 require_once 'responseMusic.func.inc.php'; //引入回覆文字的函式檔案 require_once 'responseText.func.inc.php';
B. 呼叫
if(!empty( $keyword )) { $resultStr = _response_music($postObj,$keyword); if($resultStr <> '') { echo $resultStr; }else { echo _response_text($postObj,"未查詢到【".$keyword."】的歌曲資訊!"); } }
說明:如果查詢到歌曲資訊,則返回所得資訊,如果未查詢到,則呼叫 _response_text() 函式返回文字資訊。
5.5 模擬點歌測試
回覆音樂測試成功。
六、完整程式碼獲取
請訪問 樂思樂享 官方論壇
URL:http://pan.baidu.com/s/1c0s3Jby
七、關注
請關注 卓錦蘇州 微信公眾帳號,卓錦蘇州 基於BAE 平臺開發,針對於主流的微信功能進行開發測試。
您可以關注 卓錦蘇州 公眾帳號進行功能測試,以及獲取新的應用開發。
1. 登入微信客戶端,通訊錄 -> 新增朋友 -> 查詢公眾號 -> zhuojinsz,查詢並關注。
2. 掃描二維碼:
卓錦蘇州 功能列表:
David Camp
我們永遠相信,分享是一種美德 | We Believe, Great People Share Knowledge...