当前位置:主页 > 微信开发 > 微信订阅号 >

微信被动回复单条、多条图文消息开发

栏目:微信订阅号 来源: 微信小程序开发网 阅读: 2016-12-08
  当我们关注一个微信公众号后,会收到这个微信公众号推送一些图文消息,有单条图文消息,也有多条图文消息,如下所图所示:

多条图文消息

多图文

单条图文消息

单条图文消息

  本教程将介绍如何开发单条图文消息和多条图文消息,但是,要注意因为现在讲的都是基础知识,所以,将以如下方式来开发单条和多条图文消息。

  1)所有图片都要事先上传到开发者服务器images目录里面,所有用到的图片标题和描述都是手工固定写好的而不是从数据库里面获取的,因为,我们主要是学习微信的基础开发,所以,不从数据库里面取数据来返回给用户,如果在以后的开发中可以把图片等信息通过后台系统上传到数据库服务器,例如,通过网站管理系统把图片、标题和描述等都上传到服务器并保存到数据库表中。

  2)当微信用户发送“单条新闻”或“多条新闻”后,就会返回单条或者多条图文,因为,这是在学习微信公众号基本的开发,所以,使用微信用户发送关键词的方式来返回图文信息,本教程主要是为了后面的接口开发打基础,如果以后学习了接口的话,当然,就不用微信用户发送“关键词”才返回图文消息,而是主动推送图文消息,例如,上面提供的二张图片一个是cctv的微信公众号,一个是别外一家公司的微信公众号,这上面的图文是每天主动推给公众号粉丝的,而并,粉丝们并没有发送任何关键词,像这样的功能以后学习了接口后我们就可以做到,现在我们主要是学习推送图文消息的基本技术,所以,需要发送关键词。

被动回复图文消息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>




注意:

  1)图文消息个数,限制为10条以内,如果图文数超过10,则将会无响应 :我们在做微信开发的时候,并不是每次都随便回复无数条图文消息,而是有限制的,之所以限制是因为手机上面看图文一方面如果太多的话效果也不好,另一方面太多也会增加腾讯服务器负担,所以,官方限制每次10条以内,一个公众号的粉丝对您的图文再感兴趣,如果太多的话一般也不会去全部阅读完,发送太多图文反而不仅增加您的工作量,还有可能引起粉丝们的反感,所以,每次发个3条5条的更能增加用户体验。

  2)若是回复的多条图文,则第一条(即第一个item)为大图(请看上面提供的图例)类似网站上面的头条,其它的item为大图下面的小图,图片的最佳尺寸是大图360*200,小图200*200。另外,图片链接,支持JPG、PNG格式,所以,我们在制作图片时千万不要做成其它格式的图片例如gif等。

  3)PicUrl和Url的区别:PicUrl指的是图片的链接,也就是图片的具体地址,例如,http://www.phpos.net/images/a.jpg;Url是微信用户点击图片时的打开的网址,完整的一张图片代码为:
<a href="http://www.phpos.net"><img src="http://www.phpos.net/images/a.jpg"></a>


  通过这个完整的图片html代码就可以区别开PicUrl和Url了。

  4)因为,本教程是通过发送关键词来回复图文给粉丝的,而且,图文消息也没有接收消息xml模板,所以,使用“文本”xml来把关键词发送给开发者服务器。



以下是开发代码:

  因为,回复的单条和多条图文xml模板代码比较多,所以,我们把这些xml代码放到文件common.php里面的数组中,然后,在使用模板时直接调用这个数组$tmp_arr里面对应模板即可。

common.php文件里面的代码:

<?php
    $tmp_arr = array(
    'text' => <<<XML
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>
XML
,
    'singlenews' => <<<XML
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
</xml>
XML
,
    'newses' => <<<XML
<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>4</ArticleCount>
<Articles>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
<item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
</Articles>
</xml>
XML
);


  请注意,上面的数组单元之间的逗号要在单独一行,否则,会出错。

单图文和多图文回复代码是:

<?php

require_once 'common.php';
$wechatObj->responseMsg();

class wechatCallbackapiTest
{

public function responseMsg(){

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

if (!empty($postStr)){

        libxml_disable_entity_loader(true);
        //加载 postStr 字符串
          $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
        $fromUsername = $postObj->FromUserName;
        $toUsername = $postObj->ToUserName;
        $keyword = trim($postObj->Content);
        $time = time();
        global $tmp_arr;

switch($postObj->MsgType)
   {

case 'text':

    if($keyword == '单条新闻')
    {
            //这里处理的是返回单条的图文消息
        $title = '百度新闻中心';
        $decription = '百度新闻中心的描述';
        $PicUrl = 'http://www.phpos.net/image/logo.png';
        $Url = 'http://news.baidu.com';
        $resultStr = sprintf($tmp_arr['singlenews'], $fromUsername, $toUsername, $time, $title, $decription, $PicUrl, $Url);
        echo $resultStr;

//处理返回多条(常见的4条)图文消息
//把要返回的图文信息,放入到一个二维数组中,便于管理

elseif ($keyword == '多条新闻') {

$news_arr = array(
    'news1' => array('title' => '百度新闻消息', 'decription' => '百度新闻消息描述', 'PicUrl' => 'http://www.phpos.net/image/logo.png', 'Url' => 'http://news.baidu.com'),
    'news2' =>array('title' => '新浪新闻消息', 'decription' => '新浪新闻消息描述', 'PicUrl' => 'http://www.phpos.net/image/news1.png', 'Url' => 'http://news.sina.com.cn'),
    'news3' =>array('title' => '腾讯新闻消息', 'decription' => '腾讯新闻消息描述', 'PicUrl' => 'http://www.phpos.net/image/news2.png', 'Url' => 'http://news.qq.com'),
    'news4' =>array('title' => '搜狐新闻消息', 'decription' => '搜狐新闻消息描述', 'PicUrl' => 'http://www.phpos.net/image/news3.png', 'Url' => 'http://news.sohu.com'));
$resultStr = sprintf($tmp_arr['newses'], $fromUsername, $toUsername, $time, $news_arr['news1']['title'], $news_arr['news1']['decription'], $news_arr['news1']['PicUrl'], $news_arr['news1']['Url'], $news_arr

['news2']['title'], $news_arr['news2']['decription'], $news_arr['news2']['PicUrl'], $news_arr['news2']['Url'], $news_arr['news3']['title'], $news_arr['news3']['decription'], $news_arr['news3']['PicUrl'],

$news_arr['news3']['Url'], $news_arr['news4']['title'], $news_arr['news4']['decription'], $news_arr['news4']['PicUrl'], $news_arr['news4']['Url']);
echo $resultStr;
      }
    }
    break;
    }
  }
}
}

?>


  最后,再次提醒一下,回复的标题、描述、图片路径都可以保存到数据库表里面,然后,写段程序查询出来就可以了,这样比较灵活,而上面是固定手工写好的,实际开发中肯定不会这样手工写标题什么的,还有微信用户也不用发送关键词,而是微信公众号主动推送,上面只是开发的示例,知道具体开发的流程,便于以后学习微信接口开发。