‘公众号’ 被动回复 “用户” 发送的六种类型的消息
其中图文可分为‘单图文’和‘多图文’
- 回复文本消息
- 回复图片消息
- 回复语音消息
- 回复视频消息
- 回复音乐消息
- 回复图文消息
请注意:
- 当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。
- 严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
- 微信服务器在将用户的消息发给公众号服务器后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。
- 关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。
一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试
”:
- 开发者在5秒内未回复任何内容
- 开发者回复了异常数据,比如JSON数据等
- 另外,请注意,回复图片(不支持gif动图)等多媒体消息时需要预先通过素材管理接口上传临时素材到微信服务器,
- 可以使用素材管理中的临时素材,
- 也可以使用永久素材
一、回复文本消息
<xml>
<ToUserName>
< ![CDATA[toUser] ]>
</ToUserName>
<FromUserName>
< ![CDATA[fromUser] ]>
</FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>
< ![CDATA[text] ]>
</MsgType>
<Content>
< ![CDATA[你好] ]>
</Content>
</xml>
二、回复图片消息
<xml>
<ToUserName>
< ![CDATA[toUser] ]>
</ToUserName>
<FromUserName>
< ![CDATA[fromUser] ]>
</FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>
< ![CDATA[image] ]>
</MsgType>
<Image>
<MediaId>
< ![CDATA[media_id] ]>
</MediaId>
</Image>
</xml>
三、回复语音消息
<xml>
<ToUserName>
< ![CDATA[toUser] ]>
</ToUserName>
<FromUserName>
< ![CDATA[fromUser] ]>
</FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>
< ![CDATA[voice] ]>
</MsgType>
<Voice>
<MediaId>
< ![CDATA[media_id] ]>
</MediaId>
</Voice>
</xml>
四、回复视频消息
<xml>
<ToUserName>
< ![CDATA[toUser] ]>
</ToUserName>
<FromUserName>
< ![CDATA[fromUser] ]>
</FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>
< ![CDATA[video] ]>
</MsgType>
<Video>
<MediaId>
< ![CDATA[media_id] ]>
</MediaId>
<Title>
< ![CDATA[title] ]>
</Title>
<Description>
< ![CDATA[description] ]>
</Description>
</Video>
</xml>
五、回复音乐消息
<xml>
<ToUserName>
< ![CDATA[toUser] ]>
</ToUserName>
<FromUserName>
< ![CDATA[fromUser] ]>
</FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>
< ![CDATA[music] ]>
</MsgType>
<Music>
<Title>
< ![CDATA[TITLE] ]>
</Title>
<Description>
< ![CDATA[DESCRIPTION] ]>
</Description>
<MusicUrl>
< ![CDATA[MUSIC_Url] ]>
</MusicUrl>
<HQMusicUrl>
< ![CDATA[HQ_MUSIC_Url] ]>
</HQMusicUrl>
<ThumbMediaId>
< ![CDATA[media_id] ]>
</ThumbMediaId>
</Music>
</xml>
六、回复图文消息
<xml>
<ToUserName>
< ![CDATA[toUser] ]>
</ToUserName>
<FromUserName>
< ![CDATA[fromUser] ]>
</FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>
< ![CDATA[news] ]>
</MsgType>
<ArticleCount>2</ArticleCount>
<Articles>
<item>
<Title>
< ![CDATA[title1] ]>
</Title>
<Description>
< ![CDATA[description1] ]>
</Description>
<PicUrl>
< ![CDATA[picurl] ]>
</PicUrl>
<Url>
< ![CDATA[url] ]>
</Url>
</item>
<item>
<Title>
< ![CDATA[title] ]>
</Title>
<Description>
< ![CDATA[description] ]>
</Description>
<PicUrl>
< ![CDATA[picurl] ]>
</PicUrl>
<Url>
< ![CDATA[url] ]>
</Url>
</item>
</Articles>
</xml>
实例图片
实例代码如下
<?php
//
// 响应用户消息
// 微信公众账号响应给用户的不同消息类型
//
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
//用户发送的消息类型判断
switch ($RX_TYPE)
{
case "text": //回复文本消息
$result = $this->receiveText($postObj);
break;
case "image": //回复单图文、多图文消息
$result = $this->receiveImage($postObj);
break;
case "voice": //回复音乐消息
$result = $this->receiveVoice($postObj);
break;
case "video":
$result = $this->receiveVideo($postObj);
break;
default:
$result = "unknow msg type: ".$RX_TYPE;
break;
}
echo $result;
}else {
echo "";
exit;
}
}
private function receiveText($object)
{
$keyword = trim($object->Content);
if($keyword == "文本"){ //回复文本消息
$content = "这是个文本消息";
$result = $this->transmitText($object, $content);
}
else if($keyword == "图文" || $keyword == "单图文"){ //回复单图文消息
$content = array();
$content[] = array("Title"=>"单图文标题",
"Description"=>"单图文内容",
"PicUrl"=>"http://dq095.applinzi.com/1.jpg",
"Url" =>"http://dq095.applinzi.com/1.jpg");
$result = $this->transmitNews($object, $content);
}
else if($keyword == "多图文"){ //回复多图文消息
$content = array();
$content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"http://dq095.applinzi.com/3.png", "Url" =>"http://dq095.applinzi.com/3.png");
$content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://dq095.applinzi.com/4.png", "Url" =>"http://dq095.applinzi.com/4.png");
$content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://dq095.applinzi.com/6.png", "Url" =>"http://dq095.applinzi.com/6.png");
$result = $this->transmitNews($object, $content);
}
else if($keyword == "音乐"){ //回复音乐消息
$content = array("Title"=>"欢乐颂",
"Description"=>"贝多芬",
"MusicUrl"=>"http://dq095.applinzi.com/欢乐颂.mp3",
"HQMusicUrl"=>"http://dq095.applinzi.com/欢乐颂.mp3");
$result = $this->transmitMusic($object, $content);
}
return $result;
}
private function receiveImage($object) //回复图片消息
{
$content = array("MediaId"=>$object->MediaId);
$result = $this->transmitImage($object, $content);;
return $result;
}
private function receiveVoice($object) //回复语音消息
{
$content = array("MediaId"=>$object->MediaId);
$result = $this->transmitVoice($object, $content);;
return $result;
}
private function receiveVideo($object) //回复视频消息
{
$content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");
$result = $this->transmitVideo($object, $content);;
return $result;
}
/*
* 回复文本消息
*/
private function transmitText($object, $content)
{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
/*
* 回复图片消息
*/
private function transmitImage($object, $imageArray)
{
$itemTpl = "<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>";
$item_str = sprintf($itemTpl, $imageArray['MediaId']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
/*
* 回复语音消息
*/
private function transmitVoice($object, $voiceArray)
{
$itemTpl = "<Voice>
<MediaId><![CDATA[%s]]></MediaId>
</Voice>";
$item_str = sprintf($itemTpl, $voiceArray['MediaId']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
/*
* 回复视频消息
*/
private function transmitVideo($object, $videoArray)
{
$itemTpl = "<Video>
<MediaId><![CDATA[%s]]></MediaId>
<ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
</Video>";
$item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
/*
* 回复图文消息
*/
private function transmitNews($object, $arr_item)
{
if(!is_array($arr_item))
return;
$itemTpl = " <item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str = "";
foreach ($arr_item as $item)
$item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
$newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";
$result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item));
return $result;
}
/*
* 回复音乐消息
*/
private function transmitMusic($object, $musicArray)
{
$itemTpl = "<Music>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<MusicUrl><![CDATA[%s]]></MusicUrl>
<HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";
$item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
return $result;
}
}
?>