當普通微信用戶向公衆賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上。服務器在解析此數據包,獲取相關參數的值從而做出回覆。接收普通消息主要包括:文本消息、圖片消息、語音消息、視頻消息、小視頻消息、地理位置消息、鏈接消息。XML數據包結構和相關參數如下:
1、文本消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType text
Content 文本消息內容
MsgId 消息id,64位整型
那麼這些參數該如何獲取呢,示例代碼如下:
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;
$createTime = $postObj->CreateTime;
$msgType = $postObj->MsgType;
$content = $postObj->Content;
$msgId = $postObj->MsgId;
if($msgType == 'text'){
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$time = time();
$contentStr = "您發的是消息包含以下信息:\n發信人OpenID:".$fromUsername."\n收信人微信號:".$toUsername."\n發信時間:".$createTime."\n消息類型:".$msgType."\n消息內容:".$content."\n消息ID:".$msgId;
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
echo $resultStr;
}else{
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$time = time();
$contentStr = "您發的消息類型不是文本。而是".$msgType;
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
echo $resultStr;
}
}
}
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;
}
}
}
?>
效果預覽:
代碼分析:
- 第32-42行【$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];......$msgId = $postObj->MsgId;】:實現獲取用戶發送過來的消息數據。
- 第43-55行【if($msgType == 'text'){......echo $resultStr;】:實現的是被動回覆文本消息給用戶
2、圖片消息
使用方法同文本消息,此處不再贅述,不懂得話可以在博文後面留言。
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[http://blog.csdn.net/oldinaction]]></PicUrl>
<MediaId><![CDATA[media_id]]></MediaId>
<MsgId>1234567890123456</MsgId>
</xml>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType image
PicUrl 圖片鏈接
MediaId 圖片消息媒體id,可以調用多媒體文件下載接口拉取數據。
MsgId 消息id,64位整型
3、語音消息
使用方法同文本消息,此處不再贅述,不懂得話可以在博文後面留言。
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType 語音爲voice
MediaId 語音消息媒體id,可以調用多媒體文件下載接口拉取數據。
Format 語音格式,如amr,speex等
MsgID 消息id,64位整型
請注意,開通語音識別後,用戶每次發送語音給公衆號時,微信會在推送的語音消息XML數據包中,增加一個Recongnition字段(注:由於客戶端緩存,開發者開啓或者關閉語音識別功能,對新關注者立刻生效,對已關注用戶需要24小時生效。開發者可以重新關注此帳號進行測試)。開啓語音識別後的語音XML數據包如下:
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recognition><![CDATA[騰訊微信團隊]]></Recognition>
<MsgId>1234567890123456</MsgId>
</xml>
多出的字段中,Format爲語音格式,一般爲amr,Recognition爲語音識別結果,使用UTF8編碼。
4、視頻消息
使用方法同文本消息,此處不再贅述,不懂得話可以在博文後面留言。
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType 視頻爲video
MediaId 視頻消息媒體id,可以調用多媒體文件下載接口拉取數據。
ThumbMediaId 視頻消息縮略圖的媒體id,可以調用多媒體文件下載接口拉取數據。
MsgId 消息id,64位整型
5、小視頻消息
使用方法同文本消息,此處不再贅述,不懂得話可以在博文後面留言。
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[shortvideo]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType 小視頻爲shortvideo
MediaId 視頻消息媒體id,可以調用多媒體文件下載接口拉取數據。
ThumbMediaId 視頻消息縮略圖的媒體id,可以調用多媒體文件下載接口拉取數據。
MsgId 消息id,64位整型
6、地理位置消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml>
參數 描述
ToUserName 開發者微信號
FromUserName 發送方帳號(一個OpenID)
CreateTime 消息創建時間 (整型)
MsgType location
Location_X 地理位置維度
Location_Y 地理位置經度
Scale 地圖縮放大小
Label 地理位置信息
MsgId 消息id,64位整型
當用戶給公衆賬號發送位置時,便可以獲取相應的地理位置信息。部分示例代碼如下:
index.php(完整代碼下載)
$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;
$j = $postObj->Location_Y;//經度
$w = $postObj->Location_X;//緯度
$label = $postObj->Label;//地理位置信息
if($msgType == 'location'){
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
$time = time();
$contentStr = "您的位置信息如下:\n經度:".$j."\n緯度:".$w."\n地理位置信息:".$label;
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
echo $resultStr;
}else{
echo '';
}
}
效果展示:
現在你可能覺得這一小串數字沒什麼用,到後面我會分享一些關於位置信息的小案例,那個時候就起作用了。
7、鏈接消息
使用方法同文本消息,此處不再贅述,不懂得話可以在博文後面留言。
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[公衆平臺官網鏈接]]></Title>
<Description><![CDATA[公衆平臺官網鏈接]]></Description>
<Url><![CDATA[url]]></Url>
<MsgId>1234567890123456</MsgId>
</xml>
參數 描述
ToUserName 接收方微信號
FromUserName 發送方微信號,若爲普通用戶,則是一個OpenID
CreateTime 消息創建時間
MsgType 消息類型,link
Title 消息標題
Description 消息描述
Url 消息鏈接
MsgId 消息id,64位整型
======================================================================
關注【Smalle】【微信公衆號:smallelife】 捐贈【Smalle】【微信公衆號:smallelife】
關注就有豪禮相送哦,源碼、工具、文檔應有盡有 你的掃碼便是我前進的動力,掃碼、掃碼、掃碼
======================================================================