您的位置:首页 > 移动开发 > 微信开发

微信公众平台开发【发送消息】被动回复消息

2015-08-21 20:44 344 查看
当用户给公众号发送消息时,需要公众号自动智能的响应相应的消息,这就是被动回复消息。发送消息的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】

关注就有豪礼相送哦,

源码、

工具、

文档应有尽有


你的扫码便是我前进的动力,

扫码、

扫码、

扫码

===================================





===================================



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: