《微信公众平台开发最佳实践》——3.2 发送被动响应消息

简介:

本节书摘来自华章出版社《微信公众平台开发最佳实践》一 书中的第3章,第3.2节,作者:方倍工作室,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 发送被动响应消息

微信公众账号能够回复用户发送的六种类型的消息:文本、图片、语音、视频、音乐、图文。其中图文又可分为单图文和多图文。下面将分别介绍这几种消息。

3.2.1 文本消息

微信公众账号向用户回复文本消息的示例如图3-7所示。

9410ca95a9a335a282cd0e08736bfec64db93263

微信公众账号回复用户文本消息时的XML数据格式如下所示:

<xml>
    <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_
ruZGsfk]]></ToUserName>
    <FromUserName><![CDATA[gh_680bdefc8c5d]]></From
UserName>
    <CreateTime>1359036631</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[【深圳】天气实况 温度:27℃ 湿度:59% 风速:东北风3级
 11月03日 周日 27℃~23℃ 小雨 东北风4-5级 11月04日 周一 26℃~21℃ 阵雨 微风 11月05日 周二 27℃~22℃ 阴 微风]]></Content>
</xml>```
公众账号回复文本消息的参数及描述如表3-7所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/c9659db909a7ba92129d4777f39d6df2f81c3d7a.png" width="" height="">
</div>

####3.2.2 图片消息
微信公众账号向用户回复图片消息的示例如图3-8所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/cb9bfc166eda2762da2363da62f167f7eb0dbbc6.png" width="" height="">
</div>

微信公众账号回复用户图片消息时的XML数据格式如下所示:

<ToUserName><![CDATA[oDeOAjj54GvEkkgCV2d7QV4-

JLMc]]>

<FromUserName><![CDATA[gh_ba6050bc0be7]]></From

UserName>

<CreateTime>1392133855</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[huNJ_LxG8vmFunz2Hjeb73X1IS02pu0jslBK24HAhSqi3bw2ZTCCYwKU2PaIer5n]]></MediaId>
</Image>

`
公众账号回复图片消息的参数及描述如表3-8所示。

52e493388a0cd1f1672b37335c1ffb3d98b45e90

3.2.3 语音消息

微信公众账号向用户回复语音消息的示例如图3-9所示。

e940b9df2c303bb640b815d0e27d56b8a937e988

微信公众账号回复用户语音消息时的XML数据格式如下所示:

<xml>
    <ToUserName><![CDATA[oDeOAjj54GvEkkgCV2d7QV4-
JLMc]]></ToUserName>
    <FromUserName><![CDATA[gh_ba6050bc0be7]]></From
UserName>
    <CreateTime>1392133779</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <Voice>
    <MediaId><![CDATA[ZKqseDPkTJ4dttQqNm_UPzoIHImELr
otOYjyALGJcdRZ2XcMQ6drvVabf5Dyr_Yx]]></MediaId>
    </Voice>
</xml>```
公众账号回复语音消息的参数及描述如表3-9所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/a0cd43bc91f6cd4e78fcbf5ef81fbcd9b06bb31e.png" width="" height="">
</div>

####3.2.4 视频消息
微信公众账号向用户回复视频消息的示例如图3-10所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/a2a7771f6cdedb4d81d32aaade665791f43c260e.png" width="" height="">
</div>

微信公众账号回复用户视频消息的XML数据格式如下所示:

<ToUserName><![CDATA[oDeOAjj54GvEkkgCV2d7QV4-

JLMc]]>

<FromUserName><![CDATA[gh_ba6050bc0be7]]></From

UserName>

<CreateTime>1392133911</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<Video>
<MediaId><![CDATA[sFH7kkZ8I-9ioYPWwLzy47pg3AWXMR

4h0cr05asJdS8Pq3TlNTWpukrFjE-iPfgv]]>

<ThumbMediaId><![CDATA[9UMnGcFgaKD1ReW3c3gLerY-

c0zsrZtj0Vd6ZXWDmy9IYLyp-D5_blWTRU0pwihI]]>

<Title><![CDATA[Title]]></Title>
<Description><![CDATA[Description]]></Description>
</Video>

`

公众账号回复视频消息的参数及描述如表3-10所示。

65413ad9e4e934c2c7d8d581a15a8d18eee22b3e

3.2.5 音乐消息

微信公众账号向用户回复音乐消息的示例如图3-11所示。

9b90a909cdf3b66956e91abce2ccd96b0070e7b5
.

微信公众账号回复用户音乐消息时的XML数据格式如下所示:

<xml>
    <ToUserName><![CDATA[ollB4jqgdO_cRnVXk_wRnSywgtQ8]]></ToUserName>
    <FromUserName><![CDATA[gh_b629c48b653e]]></FromUserName>
    <CreateTime>1372310544</CreateTime>
    <MsgType><![CDATA[music]]></MsgType>
    <Music>
        <Title><![CDATA[最炫民族风]]></Title>
        <Description><![CDATA[凤凰传奇]]></Description>
        <MusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></MusicUrl>
        <HQMusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></HQMusicUrl>
    </Music>
</xml>```
公众账号回复音乐消息的参数及描述如表3-11所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/2499035eefea1cedb775079681cef1f8221c56db.png" width="" height="">
</div>

####3.2.6 图文消息
图文信息可以分为单图文和多图文,它们实现的代码是一样的,但在显示方式有细微区别。
微信公众账号向用户回复单图文消息的示例如图3-12所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/08d3c954c0b3c399f9ceac34004c6d1b550cc976.png" width="" height="">
</div>.


微信公众账号回复用户单图文消息的XML数据格式如下所示:

<ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
<FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
<CreateTime>1359011899</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>1</ArticleCount>
<Articles>
    <item>
        <Title><![CDATA[[苹果产品信息查询]]></Title>
        <Description><![CDATA[序列号:USE IMEI NUMBER
                             ??IMEI号:358031058974471
                             设备名称:iPhone 5C
                             设备颜色:
                             设备容量:
                             激活状态:已激活
                             电话支持:未过期[2014-01-13]
                             硬件保修:未过期[2014-10-14]
                             生产工厂:中国]]>
        </Description>
     <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
        <Url><![CDATA[]]></Url>
    </item>
</Articles>

`
微信公众账号向用户回复多图文消息的示例如图3-13所示。

16d96c3dff14cb298b47c994302da1e1ed55c797

微信公众账号回复用户多图文消息时的XML数据格式如下所示:

<xml>
    <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
    <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
    <CreateTime>1359011829</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <Content><![CDATA[]]></Content>
    <ArticleCount>5</ArticleCount>
    <Articles>
        <item>
            <Title><![CDATA[  【深圳】实况 温度:6℃ 湿度:62﹪ 风速:东北风2级]]> </Title>
            <Description><![CDATA[]]></Description>
    <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
        <Title><![CDATA[建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。]]></Title>
            <Description><![CDATA[]]></Description>
        <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
            <Title><![CDATA[02月12日 周三 10℃~6℃ 阴 微风]]></Title>
            <Description><![CDATA[]]></Description>
        <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
            <Title><![CDATA[02月13日 周四 11℃~7℃ 小雨 微风]]></Title>
            <Description><![CDATA[]]></Description>
        <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
        <item>
        <Title><![CDATA[02月14日 周五 11℃~8℃ 小雨 东北风3-4级]]></Title>
            <Description><![CDATA[]]></Description>
        <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
            <Url><![CDATA[]]></Url>
        </item>
    </Articles>
</xml>```
公众账号回复图文消息的参数及描述如表3-12所示。

<div style="text-align: center"><img src="https://yqfile.alicdn.com/372c4cc00a3c6ce93de3e25a35d9bf3caa583fca.png" width="" height="">
</div>

在单图文消息中,标题、描述、图片分开显示在各处,图片为大图。在多图文信息中,每条信息将只显示标题内容,描述字段中的内容将不显示,第一条消息标题与图片层叠,显示在上方,从第二条消息开始,对应的图片显示为小图。
####3.2.7 案例
本节将以上六种类型的响应消息通过代码实现,以便读者理解。代码如下所示:

<?php
//
// 响应用户消息
// 微信公众账号响应给用户的不同消息类型
//

define("TOKEN", "weixin");

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {

$wechatObj->responseMsg();

}else{

$wechatObj->valid();

}

class wechatCallbackapiTest
{

public function valid()
{
    $echoStr = $_GET["echostr"];
    if($this->checkSignature()){
        echo $echoStr;
        exit;
    }
}

private function checkSignature()
{
    $signature = $_GET["signature"];
    $timestamp = $_GET["timestamp"];
    $nonce = $_GET["nonce"];
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr);
    $tmpStr = implode($tmpArr);
    $tmpStr = sha1($tmpStr);

    if($tmpStr == $signature){
        return true;
    }else{
        return false;
    }
}

public function responseMsg()
{
    $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $RX_TYPE = trim($postObj->MsgType);

        //用户发送的消息类型判断
        switch ($RX_TYPE)
        {
            case "text":
                $result = $this->receiveText($postObj);
                break;
            case "image":
                $result = $this->receiveImage($postObj);
                break;
            case "voice":
                $result = $this->receiveVoice($postObj);
                break;
            case "video":
                $result = $this->receiveVideo($postObj);
                break;
            default:
                $result = "unknow msg type: ".$RX_TYPE;
                break;
        }
        echo $result;
    }else {
        echo "";
        exit;
    }
}

private function receiveText($object)
{
    $keyword = trim($object->Content);

    if($keyword == "文本"){
        //回复文本消息
        $content = "这是个文本消息";
        $result = $this->transmitText($object, $content);
    }
    else if($keyword == "图文" || $keyword == "单图文"){
        //回复单图文消息
        $content = array();
        $content[] = array("Title"=>"单图文标题", 
                            "Description"=>"单图文内容", 
"PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", 
"Url" =>"http://m.cnblogs.com/?u= txw1958");
        $result = $this->transmitNews($object, $content);
    }
    else if($keyword == "多图文"){
        //回复多图文消息
        $content = array();
        $content[] = array("Title"=>"多图文1标题", "Description"=>"", 

"PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");

     $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
     $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
        $result = $this->transmitNews($object, $content);

    }
    else if($keyword == "音乐"){
        //回复音乐消息
        $content = array("Title"=>"最炫民族风", 
        "Description"=>"歌手:凤凰传奇", 
        "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3",
        "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
        $result = $this->transmitMusic($object, $content);
    }
    
    return $result;
}

private function receiveImage($object)
{
    //回复图片消息 
    $content = array("MediaId"=>$object->MediaId);
    $result = $this->transmitImage($object, $content);;
    return $result;
}

private function receiveVoice($object)
{
    //回复语音消息 
    $content = array("MediaId"=>$object->MediaId);
    $result = $this->transmitVoice($object, $content);;
    return $result;
}

private function receiveVideo($object)
{
    //回复视频消息 
    $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=> $object->ThumbMediaId, "Title"=>"", "Description"=>"");
    $result = $this->transmitVideo($object, $content);;
    return $result;
}  

/*
 * 回复文本消息
 */
private function transmitText($object, $content)
{
    $textTpl = "<xml>

%s
%s
%s
text
%s
";

    $result = sprintf($textTpl, $object->FromUserName, $object-> ToUserName, time(), $content);
    return $result;
}

/*
 * 回复图片消息
 */
private function transmitImage($object, $imageArray)
{
    $itemTpl = "<Image>
<MediaId><![CDATA[%s]]></MediaId>

";

    $item_str = sprintf($itemTpl, $imageArray['MediaId']);

    $textTpl = "<xml>

%s
%s
%s
image
$item_str
";

    $result = sprintf($textTpl, $object->FromUserName, $object-> ToUserName, time());
    return $result;
}

/*
 * 回复语音消息
 */
private function transmitVoice($object, $voiceArray)
{
    $itemTpl = "<Voice>
<MediaId><![CDATA[%s]]></MediaId>

";

    $item_str = sprintf($itemTpl, $voiceArray['MediaId']);

    $textTpl = "<xml>

%s
%s
%s
voice
$item_str
";

    $result = sprintf($textTpl, $object->FromUserName, $object-> ToUserName, time());
    return $result;
}

/*
 * 回复视频消息
 */
private function transmitVideo($object, $videoArray)
{
    $itemTpl = "<Video>
<MediaId><![CDATA[%s]]></MediaId>
<ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>

";

    $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray 

['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);

    $textTpl = "<xml>

%s
%s
%s
video
$item_str
";

    $result = sprintf($textTpl, $object->FromUserName, $object-> ToUserName, time());
    return $result;
}

/*
 * 回复图文消息
 */
private function transmitNews($object, $arr_item)
{
    if(!is_array($arr_item))
        return;

    $itemTpl = "    <item>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
</item>

";

    $item_str = "";
    foreach ($arr_item as $item)
        $item_str .= sprintf($itemTpl, $item['Title'], $item ['Description'], $item['PicUrl'], $item['Url']);

    $newsTpl = "<xml>

%s
%s
%s
news
]]></Content><br><ArticleCount>%s</ArticleCount><br><Articles><br>$item_str</Articles><br></xml>";</p><pre><code> $result = sprintf($newsTpl, $object-&gt;FromUserName, $object-&gt; ToUserName, time(), count($arr_item)); return $result; } /* * 回复音乐消息 */ private function transmitMusic($object, $musicArray) { $itemTpl = &quot;&lt;Music&gt; &lt;Title&gt;&lt;![CDATA[%s]]&gt;&lt;/Title&gt; &lt;Description&gt;&lt;![CDATA[%s]]&gt;&lt;/Description&gt; &lt;MusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/MusicUrl&gt; &lt;HQMusicUrl&gt;&lt;![CDATA[%s]]&gt;&lt;/HQMusicUrl&gt;</code></pre><p></Music>";</p><pre><code> $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray ['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']); $textTpl = &quot;&lt;xml&gt;</code></pre><p><ToUserName><![CDATA[%s
%s
%s
music
$item_str
";

    $result = sprintf($textTpl, $object->FromUserName, $object-> ToUserName, time());
    return $result;
}

}
?>`
在上面的代码中,回复文本、图文(包括单图文和多图文)、音乐三种消息,是使用直接构造响应消息类型实现的,而图片、语音、视频三种消息需要MediaId参数,在这里直接使用用户发送过来的消息中的MediaId,然后组装成响应消息回复

相关文章
|
4月前
|
小程序 PHP
微信公众号开发(一)打通服务器与微信之间的通信
说来惭愧PHP做了这么久,好像就没有从头开发过一个微信公众号,这次刚好有机会从头接入开发一个完整的公众号,也不能说完整,但是这些微信的接口我基本上都试一试~看看大概是什么情况。 首先:打通服务器与微信之间的通信。
55 0
|
1月前
|
开发者
微信公众平台开发基本配置
微信公众平台开发基本配置
86 0
|
1月前
|
移动开发 JavaScript
微信公众号H5开发,在微信浏览器打开H5,无法一键下载图片
微信公众号H5开发,在微信浏览器打开H5,无法一键下载图片
35 0
|
3月前
|
XML Go 数据格式
【微信公众号开发】基于golang的公众号开发——接入消息自动回复接口
【微信公众号开发】基于golang的公众号开发——接入消息自动回复接口
134 0
|
4月前
|
小程序 PHP 开发者
微信公众号开发(八)生成带参数二维码,以及将二维码下载至本地
微信的二维码真是个神奇的东西。在我们开发中,应用也是很多~ 用户扫描带场景值(参数)二维码时,可能推送以下两种事件:
63 1
|
4月前
|
XML 移动开发 小程序
微信公众号开发(七)微信h5跳转小程序及小游戏示例
最近公司做活动,需要从h5页面跳转至微信小游戏。 当时接到这个需求的时候,就在想,这玩意能相互跳转么? 后来百度了一下,还真行。
113 1
|
4月前
|
小程序 PHP
微信公众号开发(六)微信支付(发红包、企业支付到零钱)需要证书请求示例
这里最主要的就是curlpost请求的时候需要带上证书。否则请求会失败。
58 0
|
4月前
|
XML JSON 小程序
微信公众号开发(四)获取用户信息
获取用户信息,微信公众号提供了两种方式:
52 0
|
4月前
|
JSON 小程序 前端开发
微信公众号开发(三)设置底部菜单
填写access_token值,关于如何获取accesstoken值,请参见《微信公众号开发(二)微信公众号的access_token》 最后,将想要设置菜单的json写入body中。
110 0
|
4月前
|
JSON 小程序 数据库
微信公众号开发(二)微信公众号的access_token
微信对用户使用开放了很多的功能,如:自定义菜单接口、客服接口、获取用户信息接口、用户分组接口、群发接口,但是为了保证用户访问这些功能相对安全,每次访问都需要带上一个秘钥去验证身份。那么这个秘钥就是access_token。
68 0

热门文章

最新文章