当用户给公众号发送消息时,需要公众号自动智能的响应相应的消息,这就是被动回复消息。发送消息的XML数据格式我们需要明白该如何写,各个参数的意义是什么,本节主要讲解发送消息中的被动回复消息。下面的内容看不懂的请移步:微信公众平台开发(1)入门教程
1、回复图片消息
关于回复文本消息入门教程中已经提到,此处不再赘述。回复图片消息的XML数据格式如下:
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml>
参数说明:
参数 是否必须 说明
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间 (整型)
MsgType 是 image
MediaId 是 通过素材管理接口上传多媒体文件,得到的id。(如:1wrAlWQg02Wc2-z5imqt9K4wzyrugukmMQFCh0tXmixRWKCOIe3Gh9YQa7WjJpeB)(不理解的请看)
回复图片消息示例代码:
index.php(完整代码下载)
<?php /** * 作者:smalle * 网址:http://blog.csdn.net/oldinaction * 微信公众号:smallelife */ //定义 token define("TOKEN", "smalle"); //实例化对象 $wechatObj = new wechatCallbackapiTest(); //调用函数 if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ libxml_disable_entity_loader(true);//防止文件泄漏 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $msgType = $postObj->MsgType; $media_id = $postObj->MediaId; $keyword = trim($postObj->Content); $time = time(); if( $msgType == 'image' ) { $itemTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> <Image> <MediaId><![CDATA[%s]]></MediaId> </Image> </xml>"; $result = sprintf($itemTpl, $fromUsername, $toUsername, $time, $media_id); echo $result; }else{ echo "Input something..."; } }else { echo ""; exit; } } private function checkSignature() { if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
代码分析:
- 第39行【$msgType = $postObj->MsgType;】:获取用户发送的消息类型,系统从接受的XML数据包中可以获取,如果是文本型则为"text",如果为图片类型则为"image"。
- 第40行【$media_id = $postObj->MediaId;】:当用户发送一个图片、语音、视频,系统都可以从接受的XML数据包中获取对应的MediaId(此MediaId是相应多媒体的唯一标识符)
- 第40-56行【if( $msgType == 'image' ) {$itemTpl = "<xml>......echo $result;}】:意为当用户发过来的数据类型是image,则将此图片回复给用户
效果展示:
2、回复语音消息
其原理同回复图片消息,此处不再赘述,不懂的可以在博文下方留言。回复语音消息的XML数据格式如下:
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <Voice> <MediaId><![CDATA[%s]]></MediaId> </Voice> </xml>
参数说明:
参数 是否必须 说明
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间戳 (整型)
MsgType 是 语音,voice
MediaId 是 通过素材管理接口上传多媒体文件,得到的id
3、回复视频消息
其原理同回复图片消息,此处不再赘述,不懂的可以在博文下方留言。回复视频消息的XML数据格式如下:
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[video]]></MsgType> <Video> <MediaId><![CDATA[%s]]></MediaId> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> </Video> </xml>
参数说明:
参数 是否必须 说明
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间 (整型)
MsgType 是 video
MediaId 是 通过素材管理接口上传多媒体文件,得到的id
Title 否 视频消息的标题
Description 否 视频消息的描述
4、回复音乐消息
回复音乐消息的XML数据格式如下:
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[music]]></MsgType> <Music> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <MusicUrl><![CDATA[%s]]></MusicUrl> <HQMusicUrl><![CDATA[%s]]></HQMusicUrl> <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId> </Music> </xml>
参数说明:
参数 是否必须 说明
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间 (整型)
MsgType 是 music
Title 否 音乐标题
Description 否 音乐描述
MusicURL 否 音乐链接
HQMusicUrl 否 高质量音乐链接,WIFI环境优先使用该链接播放音乐
ThumbMediaId 是 缩略图的媒体id,通过素材管理接口上传多媒体文件,得到的id
至于ThumbMediaId参数,必须是通过微信认证的服务号才能得到,普通的服务号与订阅号可以忽略该参数,也就是说,在回复给微信服务器的XML中可以不包含ThumbMediaId参数。
回复音乐消息示例代码:
index.php(完整代码下载)
<?php /** * 作者:smalle * 网址:http://blog.csdn.net/oldinaction * 微信公众号:smallelife */ //定义 token define("TOKEN", "smalle"); //实例化对象 $wechatObj = new wechatCallbackapiTest(); //调用函数 if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ libxml_disable_entity_loader(true);//防止文件泄漏 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); if( $keyword == '听歌' ) { $itemTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Music> <Title><![CDATA[讲不出再见]]></Title> <Description><![CDATA[演唱:谭咏麟]]></Description> <MusicUrl><![CDATA[http://smalle.sinaapp.com/jbczj-tyl.mp3]]></MusicUrl> <HQMusicUrl><![CDATA[http://smalle.sinaapp.com/jbczj-tyl.mp3]]></HQMusicUrl> </Music> </xml>"; $msgtype = 'music'; $result = sprintf($itemTpl, $fromUsername, $toUsername, $time, $msgtype); echo $result; } }else { echo ""; exit; } } private function checkSignature() { if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
效果展示:
5、回复图文消息
回复图文消息的XML数据格式如下:
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[微信开发教程哪里有?]]></Title> <Description><![CDATA[要看就看Smalle微信开发系列教程,网址:http://blog.csdn.net/oldinaction]]></Description> <PicUrl><![CDATA[http://img.my.csdn.net/uploads/201508/23/1440327708_6632.gif]]></PicUrl> <Url><![CDATA[http://blog.csdn.net/oldinaction]]></Url> </item> <item> <Title><![CDATA[那么Smalle的微信公众号是?]]></Title> <Description><![CDATA[这个你就问对人了,请记住Smalle微信公众号:smallelife]]></Description> <PicUrl><![CDATA[http://img.my.csdn.net/uploads/201508/20/1440071066_3117.jpg]]></PicUrl> <Url><![CDATA[http://www.2345.com/?k381740148]]></Url> </item> </Articles> </xml>
参数说明:
参数 是否必须 说明
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间 (整型)
MsgType 是 news
ArticleCount 是 图文消息个数,限制为10条以内
Articles 是 多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应
Title 否 图文消息标题
Description 否 图文消息描述(如果是单图文此参数才有效,多图文的话设置了也不会显示出来)
PicUrl 否 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
Url 否 点击图文消息跳转链接
回复图文消息示例代码:
index.php(完整代码下载)
<?php /** * 作者:smalle * 网址:http://blog.csdn.net/oldinaction * 微信公众号:smallelife */ //定义 token define("TOKEN", "smalle"); //实例化对象 $wechatObj = new wechatCallbackapiTest(); //调用函数 if (isset($_GET['echostr'])) { $wechatObj->valid(); }else{ $wechatObj->responseMsg(); } class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; exit; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if (!empty($postStr)){ libxml_disable_entity_loader(true);//防止文件泄漏 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); if( $keyword == '图文' ) { $itemTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[微信开发教程哪里有?]]></Title> <Description><![CDATA[要看就看Smalle微信开发系列教程,网址:http://blog.csdn.net/oldinaction]]></Description> <PicUrl><![CDATA[http://img.my.csdn.net/uploads/201508/23/1440327708_6632.gif]]></PicUrl> <Url><![CDATA[http://blog.csdn.net/oldinaction]]></Url> </item> <item> <Title><![CDATA[那么Smalle的微信公众号是?]]></Title> <Description><![CDATA[这个你就问对人了,请记住Smalle微信公众号:smallelife]]></Description> <PicUrl><![CDATA[http://img.my.csdn.net/uploads/201508/20/1440071066_3117.jpg]]></PicUrl> <Url><![CDATA[http://www.2345.com/?k381740148]]></Url> </item> </Articles> </xml>"; $result = sprintf($itemTpl, $fromUsername, $toUsername, $time); echo $result; } }else { echo ""; exit; } } private function checkSignature() { if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
效果展示:
======================================================================
关注【Smalle】【微信公众号:smallelife】 捐赠【Smalle】【微信公众号:smallelife】
关注就有豪礼相送哦,源码、工具、文档应有尽有 你的扫码便是我前进的动力,扫码、扫码、扫码
======================================================================