当用户给公众号发送消息时,需要公众号自动智能的响应相应的消息,这就是被动回复消息。发送消息的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[https://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[https://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[https://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[https://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】
关注就有豪礼相送哦,源码、工具、文档应有尽有 你的扫码便是我前进的动力,扫码、扫码、扫码
======================================================================