一、簡介
當普通微信用戶向公眾賬號發消息時,微信服務器將用戶發送的消息封裝成XML數據包,通過POST消息發送到開發者的URL上。
微信服務器在五秒內收不到服務器的響應會斷掉連接,並且重新發起請求,總共重試三次。關於重試的消息排重,推薦使用msgid排重。
假如服務器無法保證在五秒內處理並回復,可以直接回復空串,微信服務器不會對此作任何處理,並且不會發起重試。
當前支持如下的普通消息:
- 1 文本消息
- 2 圖片消息
- 3 語音消息
- 4 視頻消息
- 5 地理位置消息
- 6 鏈接消息
二、適用場景
普通微信用戶通過微信給公眾賬號發送的語音,微信服務器即封裝為此語音消息格式發送到開發者URL。服務器接收到此消息后,可以通過解析到的MediaId調用多媒體文件下載接口獲取語音數據,根據解析到的語音文件格式可以對語音進行相應處理。
三、消息格式說明
1 <xml> 2 <ToUserName><![CDATA[toUser]]></ToUserName> 3 <FromUserName><![CDATA[fromUser]]></FromUserName> 4 <CreateTime>1357290913</CreateTime> 5 <MsgType><![CDATA[voice]]></MsgType> 6 <MediaId><![CDATA[media_id]]></MediaId> 7 <Format><![CDATA[Format]]></Format> 8 <MsgId>1234567890123456</MsgId> 9 </xml>
參數 | 描述 |
---|---|
ToUserName | 開發者微信號 |
FromUserName | 發送方帳號(一個OpenID) |
CreateTime | 消息創建時間 (整型) |
MsgType | 語音為voice |
MediaId | 語音消息媒體id,可以調用多媒體文件下載接口拉取數據。 |
Format | 語音格式,如amr,speex等 |
MsgID | 消息id,64位整型 |
四、代碼示例
1 <?php 2 /** 3 * wechat php test 4 */ 5 6 //define your token 7 define("TOKEN", "weixin"); 8 $wechatObj = new wechatCallbackapiTest(); 9 $wechatObj->responseMsg(); 10 11 class wechatCallbackapiTest 12 { 13 public function responseMsg() 14 { 15 //get post data, May be due to the different environments 16 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 17 18 if (!empty($postStr)){ 19 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 20 $MSG_TYPE = trim($postObj->MsgType); 21 22 switch ($MSG_TYPE) { 23 case "text": 24 $resultStr = $this->handleText($postObj); 25 break; 26 case "image": 27 $resultStr = $this->handleImage($postObj); 28 break; 29 case "voice": 30 $resultStr = $this->handleVoice($postObj); 31 break; 32 default: 33 $resultStr = "Unknow message type: " . $MSG_TYPE; 34 break; 35 } 36 //echo $postStr; 37 echo $resultStr; 38 }else { 39 echo ""; 40 exit; 41 } 42 } 43 44 private function handleVoice($postObj) 45 { 46 //獲取語音消息媒體id,可以調用多媒體文件下載接口拉取數據 47 $mediaID = trim($postObj->MediaId); 48 $format = trim($postObj->Format); 49 50 if(!empty($mediaID)){ 51 $contentStr = "MediaId : " . $mediaID ."\n" . "Format : " . $format . "\n"; 52 $resultStr = $this->responseText($postObj, $contentStr); 53 }else{ 54 $resultStr = "MediaId is empty."; 55 } 56 57 return $resultStr; 58 } 59 60 61 private function responseText($object, $content, $flag=0) 62 { 63 $textTpl = "<xml> 64 <ToUserName><![CDATA[%s]]></ToUserName> 65 <FromUserName><![CDATA[%s]]></FromUserName> 66 <CreateTime>%s</CreateTime> 67 <MsgType><![CDATA[text]]></MsgType> 68 <Content><![CDATA[%s]]></Content> 69 <FuncFlag>%d</FuncFlag> 70 </xml>"; 71 $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag); 72 return $resultStr; 73 } 74 75 } 76 77 ?>