[微信开发五]--图文消息回复

我们回复用户的消息类型有多种,可以是简单的文字回复,也可以是音乐回复,或者是图文信息回复(不能只回复一张图片,一定要夹带着文字)。为什么本篇我就只将图文回复呢?原因有多个:
1、音乐回复我没搞过;
2、文字回复前一篇说过;
3、图文回复个人觉得偏难了点,所以重点讲;
4、博主又要凑博客篇数了...(没错,答对了)


--------------------------
1、在开始讲解图文消息回复之前,我要补讲一些东西:在示例代码讲解的那篇博客里,我下面这段代码跳过去了:
  1. $textTpl = "<xml>  
  2.             <ToUserName><![CDATA[%s]]></ToUserName>  
  3.             <FromUserName><![CDATA[%s]]></FromUserName>  
  4.             <CreateTime>%s</CreateTime>  
  5.             <MsgType><![CDATA[%s]]></MsgType>  
  6.             <Content><![CDATA[%s]]></Content>  
  7.             <FuncFlag>0</FuncFlag>  
  8.             </xml>";  

$textTpl这货怎么看起来如此眼熟?没错,我们在回复用户的文字消息( 注意是文字消息)时,都会用到它,如下面这句:
  1. $msgType = "text";  
  2. $contentStr = "感谢您的关注,回复“1”查看博主ID;回复“2”查看博主爱好";  
  3. $resultStr = sprintf($textTpl$fromUsername$toUsername$time$msgType$contentStr);  
  4. echo $resultStr;  

它的作用就是将我们要发给用户的文字消息合成为xml格式文本,这个文本里包含用户的OpenID,公众号的ID,系统时间,消息类型,回复的文字内容。那么,什么是xml格式呢?

XML是一种简单的数据存储语言,它要求每一个标签都有开始和结束标记,可以进行嵌套,它里面的每个字段(就是每种信息)都必须以<>开头,</>结尾,如下:
  1. <xml>  
  2. <content>  
  3. <id>博主ID</id>  
  4. <age>博主年龄</age>  
  5. </content>  
  6. </xml>  
xml简单分析到这里, 下面回过头来继续看$textTpl这个变量
  1. $textTpl = "<xml>//这里表明是xml格式  
  2.             <ToUserName><![CDATA[%s]]></ToUserName>//存储微信公众号的ID  
  3.             <FromUserName><![CDATA[%s]]></FromUserName>//存储用户OpenID  
  4.             <CreateTime>%s</CreateTime>//存储系统时间  
  5.             <MsgType><![CDATA[%s]]></MsgType>//存储消息类型  
  6.             <Content><![CDATA[%s]]></Content>//存储要发送到消息内容  
  7.             <FuncFlag>0</FuncFlag>//是否星标(别管这个)  
  8.             </xml>";  

恩,上面的代码注释还算比较好理解吧, 可能唯一不理解的就是[CDATA[%S]]这货是什么玩意,CDATA表示不转义,不理解也没事,主要还是看%s,它表示要转换成字符串的数据类型。翻译成白话文就是%s表示一个刚出生的婴儿,这个婴儿的类型的字符串类型(可以理解为女的),我们都知道婴儿刚出生时全部信息都是一片空白,没有姓名,没有户口之类的,这就是%s的含义,表示一片空白,等待你来开发如下面这句:
<Content><![CDATA[%s]]></Content>
此时Content里是没有内容的,所以就需要我们来传送内容进入,怎么传呢?用 sprintf()这个函数,它的格式如下:
sprintf(baby,$name,$country,...);
第一个参数baby表示将要被传送内容的xml格式变量(婴儿),将$name传给baby中第一个出现%s的位置,将$country传给第2个出现%s的位置,以此类推


最后我们再回过头来看下这句:
  1. $resultStr = sprintf($textTpl$fromUsername$toUsername$time$msgType$contentStr);  
  2. echo $resultStr;  
是不是知道怎么回事了? $textTpl就是xml格式变量,接下来将$fromUsername传给textTpl,然后是tuUsername,然后...,最后将全新的textTpl传给resultStr这个变量,然后发送给用户。

2、下面进入正题,如何回复图文消息。
下面是回复图文消息的一些格式:

        

也可以点击这个链接查看: 点击打开链接

上面描述的很详细了, 这里需要注意单图的时候会显示描述(Descripition),而多图不会显示描述。第一张为item大图,像素为640x320,下面的item图片为小图,像素为80x80,Url为图片的链接,所以在这之前我们需要事先将图片上面到SAE服务器上(要不然你图片的链接哪来?)。
下面我先搞个回复单图的模式,先配置图文消息的xml,类似文本消息的$textTpl。
  1. $imageTpl = "<xml>  
  2.             <ToUserName><![CDATA[%s]]></ToUserName>  
  3.             <FromUserName><![CDATA[%s]]></FromUserName>  
  4.             <CreateTime>%s</CreateTime>  
  5.             <MsgType><![CDATA[news]]></MsgType>//消息类型为news(图文)  
  6.             <ArticleCount>1</ArticleCount>//图文数量为1(单图文)  
  7.             <Articles>  
  8.             <item>//第一张图文消息  
  9.             <Title><![CDATA[%s]]></Title> //标题  
  10.             <Description><![CDATA[]]></Description>//描述为空(懒得描述)  
  11.             <PicUrl><![CDATA[%s]]></PicUrl>//打开前的图片链接地址  
  12.             <Url><![CDATA[%s]]></Url>//点击进入后显示的图片链接地址  
  13.             </item>  
  14.             </Articles>  
  15.             </xml> ";  

好了,图文消息的回复模板已经搞好了,接下来就是将图片消息的标题,图片等信息填满了,代码如下:
  1. $title = "哎呦我去,又下雨了";//标题  
  2. $PicUrl = "http://1.star530.sinaapp.com/weather.jpg";//图片链接  
  3. $Url = "http://1.star530.sinaapp.com/weather.jpg";//打开后的图片链接  
  4. $resultStr = sprintf($imageTpl$fromUsername$toUsername$time$title$PicUrl,$Url);  
  5. echo $resultStr;  
运行效果如下:


恩,就是这样,完整的代码如下:
  1. public function responseMsg()  
  2.     {  
  3.         //get post data, May be due to the different environments  
  4.         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  
  5.   
  6.   
  7.         //extract post data  
  8.         if (!empty($postStr)){  
  9.                   
  10.                 $postObj = simplexml_load_string($postStr'SimpleXMLElement', LIBXML_NOCDATA);  
  11.                 $fromUsername = $postObj->FromUserName;  
  12.                 $toUsername = $postObj->ToUserName;  
  13.                 $keyword = trim($postObj->Content);  
  14.                 $time = time();  
  15.                 $textTpl = "<xml>  
  16.                             <ToUserName><![CDATA[%s]]></ToUserName>  
  17.                             <FromUserName><![CDATA[%s]]></FromUserName>  
  18.                             <CreateTime>%s</CreateTime>  
  19.                             <MsgType><![CDATA[%s]]></MsgType>  
  20.                             <Content><![CDATA[%s]]></Content>  
  21.                             <FuncFlag>0</FuncFlag>  
  22.                             </xml>";       
  23.                       
  24.                 $imageTpl = "<xml>  
  25.                             <ToUserName><![CDATA[%s]]></ToUserName>  
  26.                             <FromUserName><![CDATA[%s]]></FromUserName>  
  27.                             <CreateTime>%s</CreateTime>  
  28.                             <MsgType><![CDATA[news]]></MsgType>//消息类型为news(图文)  
  29.                             <ArticleCount>1</ArticleCount>//图文数量为1(单图文)  
  30.                             <Articles>  
  31.                             <item>//第一张图文消息  
  32.                             <Title><![CDATA[%s]]></Title> //标题  
  33.                             <Description><![CDATA[]]></Description>//描述为空(懒得描述)  
  34.                             <PicUrl><![CDATA[%s]]></PicUrl>//打开前的图片链接地址  
  35.                             <Url><![CDATA[%s]]></Url>//点击进入后显示的图片链接地址  
  36.                             </item>  
  37.                             </Articles>  
  38.                             </xml> ";  
  39.               
  40.                 if(!empty$keyword ))  
  41.                 {  
  42.                     $title = "哎呦我去,又下雨了";//标题  
  43.                     $PicUrl = "http://1.star530.sinaapp.com/weather.jpg";//图片链接  
  44.                     $Url = "http://1.star530.sinaapp.com/weather.jpg";//打开后的图片链接  
  45.                     $resultStr = sprintf($imageTpl$fromUsername$toUsername$time$title$PicUrl,$Url);  
  46.                     echo $resultStr;  
  47.                 }else{  
  48.                     echo "Input something...";  
  49.                 }  
  50.                   
  51.         }else {  
  52.             echo "";  
  53.             exit;  
  54.         }  
  55.     }  
  56. }  

好了,就这样。

本来是安排一周的时间将微信这个系列教程写完的,结果因为各种原因只完成了十篇。所以呢,就先写到这吧,等下次有抽出时间再继续吧...

后会有期~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值