• 【玩转微信公众平台之十】 图文消息回复解说


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


    --------------------------
    1、在開始解说图文消息回复之前。我要补讲一些东西:在演示样例代码解说的那篇博客里。我以下这段代码跳过去了:
    $textTpl = "<xml>
    			<ToUserName><![CDATA[%s]]></ToUserName>
    			<FromUserName><![CDATA[%s]]></FromUserName>
    			<CreateTime>%s</CreateTime>
    			<MsgType><![CDATA[%s]]></MsgType>
    			<Content><![CDATA[%s]]></Content>
    			<FuncFlag>0</FuncFlag>
    			</xml>";

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

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

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



    最后我们再回过头来看下这句:

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

    2、以下进入正题,怎样回复图文消息。

    以下是回复图文消息的一些格式:

            

    也能够点击这个链接查看:点击打开链接

    上面描写叙述的非常具体了,这里须要注意单图的时候会显示描写叙述(Descripition),而多图不会显示描写叙述。

    第一张为item大图。像素为640x320,以下的item图片为小图,像素为80x80,Url为图片的链接。所以在这之前我们须要事先将图片上面到SAEserver上(要不然你图片的链接哪来?)。
    以下我先搞个回复单图的模式,先配置图文消息的xml,相似文本消息的$textTpl。

    $imageTpl = "<xml>
    			<ToUserName><![CDATA[%s]]></ToUserName>
    			<FromUserName><![CDATA[%s]]></FromUserName>
    			<CreateTime>%s</CreateTime>
    			<MsgType><![CDATA[news]]></MsgType>//消息类型为news(图文)
    			<ArticleCount>1</ArticleCount>//图文数量为1(单图文)
    			<Articles>
    			<item>//第一张图文消息
    			<Title><![CDATA[%s]]></Title> //标题
    			<Description><![CDATA[]]></Description>//描写叙述为空(懒得描写叙述)
    			<PicUrl><![CDATA[%s]]></PicUrl>//打开前的图片链接地址
    			<Url><![CDATA[%s]]></Url>//点击进入后显示的图片链接地址
    			</item>
    			</Articles>
    			</xml> ";

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


    恩,就是这样,完整的代码例如以下:
    public function responseMsg()
        {
    		//get post data, May be due to the different environments
    		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
    
    
          	//extract post data
    		if (!empty($postStr)){
                    
                  	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                    $fromUsername = $postObj->FromUserName;
                    $toUsername = $postObj->ToUserName;
                    $keyword = trim($postObj->Content);
                    $time = time();
                    $textTpl = "<xml>
    							<ToUserName><![CDATA[%s]]></ToUserName>
    							<FromUserName><![CDATA[%s]]></FromUserName>
    							<CreateTime>%s</CreateTime>
    							<MsgType><![CDATA[%s]]></MsgType>
    							<Content><![CDATA[%s]]></Content>
    							<FuncFlag>0</FuncFlag>
    							</xml>";     
    					
    				$imageTpl = "<xml>
    							<ToUserName><![CDATA[%s]]></ToUserName>
    							<FromUserName><![CDATA[%s]]></FromUserName>
    							<CreateTime>%s</CreateTime>
    							<MsgType><![CDATA[news]]></MsgType>//消息类型为news(图文)
    							<ArticleCount>1</ArticleCount>//图文数量为1(单图文)
    							<Articles>
    							<item>//第一张图文消息
    							<Title><![CDATA[%s]]></Title> //标题
    							<Description><![CDATA[]]></Description>//描写叙述为空(懒得描写叙述)
    							<PicUrl><![CDATA[%s]]></PicUrl>//打开前的图片链接地址
    							<Url><![CDATA[%s]]></Url>//点击进入后显示的图片链接地址
    							</item>
    							</Articles>
    							</xml> ";
    			
    				if(!empty( $keyword ))
                    {
    					$title = "哎呦我去,又下雨了";//标题
    					$PicUrl = "http://1.star530.sinaapp.com/weather.jpg";//图片链接
    					$Url = "http://1.star530.sinaapp.com/weather.jpg";//打开后的图片链接
    					$resultStr = sprintf($imageTpl, $fromUsername, $toUsername, $time, $title, $PicUrl,$Url);
    					echo $resultStr;
                    }else{
                    	echo "Input something...";
                    }
    				
            }else {
            	echo "";
            	exit;
            }
        }
    }

    好了,就这样。

    本来是安排一周的时间将微信这个系列教程写完的,结果由于各种原因仅仅完毕了十篇。

    所以呢。就先写到这吧,等下次有抽空再继续吧...

    后会有期~~

    尊重原创。转载请注明来源:http://blog.csdn.net/star530/article/details/26139129
  • 相关阅读:
    maven插件安装与使用
    java面试题
    关于java的GC
    技术人员要树立自己的品牌
    为什么IT公司都应该鼓励开源
    你应该坚持写博客 即使没有读者
    计算机基础
    收藏 | 产品经理不可不知的 7 种技术思维
    我讨厌你公事公办的样子
    子序列问题【LIS、LCS、LCIS】
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6737876.html
Copyright © 2020-2023  润新知