程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 微信公眾平台開發(十) 消息回復總結,公眾平台

微信公眾平台開發(十) 消息回復總結,公眾平台

編輯:關於PHP編程

微信公眾平台開發(十) 消息回復總結,公眾平台


原文地址:http://www.cnblogs.com/mchina/p/3364377.html

一、簡介

微信公眾平台提供了三種消息回復的格式,即文本回復、音樂回復和圖文回復,在這一篇文章中,我們將對這三種消息回復的格式做一下簡單講解,然後封裝成函數,以供讀者使用。

二、思路分析

對於每一個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 模擬點歌測試

回復音樂測試成功。


微信公眾平台開發者模式回復圖文消息代碼,要全套的最好有文字說明的

$resultStr="<xml>\n <ToUserName><![CDATA[".$fromUsername."]]></ToUserName>\n <FromUserName><![CDATA[".$toUsername."]]></FromUserName>\n <CreateTime>".time()."</CreateTime>\n <MsgType><![CDATA[news]]></MsgType>\n <ArticleCount>1</ArticleCount>\n <Articles>\n <item>\n <Title><![CDATA["標題"]]></Title> \n <Description><![CDATA[詳情請點擊閱讀全文]]></Description>\n <PicUrl><![CDATA[".$picurl["roster_pic"]."]]></PicUrl>\n <Url><![CDATA[".'www.baidu.com'."]]></Url>\n </item>\n </Articles>\n <FuncFlag>0</FuncFlag>\n </xml>";echo $resultStr;$resultStr = sprintf($newsTpl, $fromUsername, $toUsername, time(), $msgType, $title,$desription);看了下你的這句$newsTpl應該是一個已經定義好的模版,後面是替換的參數所以可以查看下模版是否正確
給你個我代碼裡面用到的例子吧,具體裡面字符串的話自己替換
希望您能采納!謝謝

 

怎在微信公眾平台自動回復中設置圖文並存的消息回復?

在“高級功能“——”編輯者模式“——關鍵詞回復”——“選圖文”

二自動回復裡面想是圖文的話 需要進“開發者模式” 只不過開發者模式是需要接口的
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved