微信公眾平台開發訊息回覆摘要介紹

高洛峰
發布: 2017-03-06 09:38:30
原創
1449 人瀏覽過

一、簡介

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

二、思路分析

#對於每一個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 &#39;responseText.func.inc.php&#39;;
登入後複製

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[&#39;title&#39;];
$desc = $newsContent[&#39;description&#39;];
$picUrl = $newsContent[&#39;picUrl&#39;];
$url = $newsContent[&#39;url&#39;];
$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 &#39;responseNews.func.inc.php&#39;;
登入後複製

4.4.2 建立陣列並傳入

在主檔案中,只需要向_response_news() 函式中傳入一個陣列和$postObj 即可。

$record=array(
&#39;title&#39; =>&#39;山塘街&#39;,
&#39;description&#39; =>&#39;山塘街东起阊门渡僧桥,西至苏州名胜虎丘山的望山桥,长约七里,所以苏州俗语说“七里山塘到虎丘”...&#39;,
&#39;picUrl&#39; => &#39;http://thinkshare.duapp.com/images/suzhou.jpg&#39;,
&#39;url&#39; =>&#39;http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000046&itemidx=1&sign=9e7707d5615907d483df33ee449b378d#wechat_redirect&#39;
);

$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[&#39;title&#39;], $value[&#39;description&#39;], $value[&#39;picUrl&#39;], $value[&#39;url&#39;]);
}
登入後複製


说明:$newsContent 是从主文件传入函数的图文数组。

4.6.4 拼接并返回


return $header.$body.$footer;
登入後複製


将以上内容写到一个函数里,命名为 _response_multiNews() 函数,以供下面调用测试。

4.7 测试多图文

4.7.1 在主文件中引入回复多图文的函数文件


require_once &#39;responseMultiNews.func.inc.php&#39;;
登入後複製


4.7.2 创建多维数组并传入

$record[0]=array(
    &#39;title&#39; =>&#39;观前街&#39;,
    &#39;description&#39; =>&#39;观前街位于江苏苏州市区,是成街于清朝时期的百年商业老街,街上老店名店云集,名声远播海内外...&#39;,
    &#39;picUrl&#39; => &#39;http://joythink.duapp.com/images/suzhou.jpg&#39;,
    &#39;url&#39; =>&#39;http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000052&itemidx=1&sign=90518631fd3e85dd1fde7f77c04e44d5#wechat_redirect&#39;
);
......
$record[11]=array(
    &#39;title&#39; =>&#39;平江路&#39;,
    &#39;description&#39; =>&#39;平江路位于苏州古城东北,是一条傍河的小路,北接拙政园,南眺双塔,全长1606米,是苏州一条历史攸久的经典水巷。宋元时候苏州又名平江,以此名路...&#39;,
    &#39;picUrl&#39; => &#39;http://joythink.duapp.com/images/suzhouScenic/pingjianglu.jpg&#39;,
    &#39;url&#39; =>&#39;http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=10000056&itemidx=1&sign=ef18a26ce78c247f3071fb553484d97a#wechat_redirect&#39;
);
$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, &#39;Far Away From Home&#39;, &#39;Groove Coverage&#39;, &#39;far away from home&#39;),
(10002, &#39;The Dawn&#39;, &#39;Dreamtale&#39;, &#39;the dawn&#39;),
(20002, &#39;董小姐&#39;, &#39;宋冬野&#39;, &#39;董小姐&#39;),
(20001, &#39;左边&#39;, &#39;杨丞琳&#39;, &#39;左边&#39;);
登入後複製


5.4.2 _response_music() 函数编写

A. 引入数据库操作文件


require_once(&#39;mysql_bae.func.php&#39;);
登入後複製


B. 数据库操作及数据处理

$query = "SELECT * FROM tbl_music WHERE music_name LIKE &#39;%$musicKeyword%&#39;";
$result = _select_data($query);
$rows = mysql_fetch_array($result, MYSQL_ASSOC);
$music_id = $rows[music_id];
登入後複製

注: $musicKeyword 为从主文件传入的歌曲名关键字,这里使用模糊查询,只取第一条数据。

C. 判断是否查询到


if($music_id <> &#39;&#39;)
{
    $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 &#39;responseText.func.inc.php&#39;;
登入後複製


B. 调用


if(!empty( $keyword ))
{
    $resultStr = _response_music($postObj,$keyword);
    if($resultStr <> &#39;&#39;)
    {
        echo $resultStr;
    }else
    {
        echo _response_text($postObj,"未查询到【".$keyword."】的歌曲信息!");    
    }
    
}
登入後複製


说明:如果查询到歌曲信息,则返回所得信息,如果未查询到,则调用 _response_text() 函数返回文本信息。

5.5 模拟点歌测试

微信公眾平台開發訊息回覆摘要介紹

回复音乐测试成功。 

更多微信公眾平台開發訊息回覆摘要介紹相关文章请关注PHP中文网!

 



相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板