·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> php网站开发 >> 微信公众平台开发(十) 消息回复总结

微信公众平台开发(十) 消息回复总结

作者:佚名      php网站开发编辑:admin      更新时间:2022-07-23
微信公众平台开发(十) 消息回复总结原文地址: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 循环出数组的内容并赋予图文体,并进行拼接