菜鸟笔记
提升您的技术认知

微信公众平台开发 消息回复总结-ag真人游戏

阅读 : 292

一、简介

微信公众平台提供了三种消息回复的格式,即文本回复、音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用。

二、思路分析

对于每一个post请求,开发者在响应包中返回特定xml结构,对该消息进行响应(现支持回复文本、图文、语音、视频、音乐)。

三、文本回复

3.1 文本回复xml 结构

 <xml>
 <tousername>touser]]>tousername>
 <fromusername>fromuser]]>fromusername>
 <createtime>12345678createtime>
 <msgtype>text]]>msgtype>
 <content>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 = "
                
                
                %s
                
                
                %d
                ";
    $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>touser]]>tousername>
 <fromusername>fromuser]]>fromusername>
 <createtime>12345678createtime>
 <msgtype>news]]>msgtype>
 <articlecount>2articlecount>
 <articles>
 <item>
 <title>title1]]>title> 
 <description>description1]]>description>
 <picurl>picurl]]>picurl>
 <url>url]]>url>
 item>
 <item>
 <title>title]]>title>
 <description>description]]>description>
 <picurl>picurl]]>picurl>
 <url>url]]>url>
 item>
 articles>
 xml> 

4.2 结构说明

类似文本回复的格式,只需要在相应的位置填上对应的内容就可以回复图文信息了。

4.3 具体实施

图文回复可以是单图文,也可以是多图文,这里我们先以单图文的案例来引导读者,然后再引出多图文。

我们将回复图文的xml 结构分解成为以下三个结构,图文头,图文体,图文尾,图文体就是图文回复时看到的标题,描述,图片url和原文url。

$newstplhead = "<xml>
                <tousername>%s]]>tousername>
                <fromusername>%s]]>fromusername>
                <createtime>%screatetime>
                <msgtype>news]]>msgtype>
                <articlecount>1articlecount>
                <articles>";
$newstplbody = "<item>
                <title>%s]]>title> 
                <description>%s]]>description>
                <picurl>%s]]>picurl>
                <url>%s]]>url>
                item>";
$newstplfoot = "articles>
                <funcflag>0funcflag>
                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 测试多图文结果

点击进入查看

测试多图文成功。

五、音乐回复

微信还提供了一种消息回复的格式,即音乐回复,下面我们编写程序测试一下。

注意:由于音乐ag真人试玩娱乐的版权的问题,现在很少有回复音乐的api,开放的api 查询出来的音乐信息也有很多是不正确的。所以在这里,我们上传几首音乐到自己的服务器空间测试。

本地文件:

测试是否能够正常播放:

5.1 音乐回复xml 结构

 <xml>
 <tousername>touser]]>tousername>
 <fromusername>fromuser]]>fromusername>
 <createtime>12345678createtime>
 <msgtype>music]]>msgtype>
 <music>
 <title>title]]>title>
 <description>description]]>description>
 <musicurl>music_url]]>musicurl>
 <hqmusicurl>hq_music_url]]>hqmusicurl>
 music>
 xml>

5.2 结构说明

5.3 具体实施

我们先做一个固定的歌曲回复来引导读者,然后再引出更高级别的歌曲查询回复。

5.3.1 在xml 结构的相应位置插入相应数据

<music>
<title>far away from home]]>title>
<description>groove coverage]]>description>
<musicurl>http://thinkshare.duapp.com/music/10001.mp3]]>musicurl>
<hqmusicurl>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 模拟点歌测试

回复音乐测试成功。 

六、完整代码获取

请访问 乐思乐享 官方论坛

urlhttp://pan.baidu.com/s/1c0s3jby

网站地图