• 微信公众平台开发(十) 消息回复总结——用其xml模板


    一、简介

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

    二、思路分析

    对于每一个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 = "感谢您关注【卓锦苏州】"."
    "."微信号: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 模拟点歌测试

    回复音乐测试成功。

    六、完整代码获取

    请访问 乐思乐享 官方论坛

    URLhttp://pan.baidu.com/s/1c0s3Jby

    七、关注

    请关注 卓锦苏州 微信公众帐号,卓锦苏州 基于BAE 平台开发,针对于主流的微信功能进行开发测试。

    您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。

    1. 登录微信客户端,通讯录 -> 添加朋友 -> 查找公众号 -> zhuojinsz,查找并关注。

    2. 扫描二维码:

    卓锦苏州 功能列表:

  • 相关阅读:
    ABP AsyncHelper.RunSync 内部实现
    ABP 扩展 OrganizationUnit 数据实体(新增字段)
    ABP 调用 PUT 接口报错 405 Method Not Allowed
    ABP 扩展 Role 数据实体(新增字段)
    C# EntityFramework 自定义数据库表名(一)
    EPPlus.Core(OfficeOpenXml) 获取 Excel 数据集合
    C# 获取文件并将文件按创建/修改时间排序
    C# 计算两个日期之间的月份数(差值)
    C# Split 方法扩展支持双引号
    教你在 C# 代码中写出带高亮关键字的注释
  • 原文地址:https://www.cnblogs.com/AmilyWilly/p/5242204.html
Copyright © 2020-2023  润新知