微信接收普通消息接口


官方文檔地址:https://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html​

當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上。

請注意:

1、關於重試的消息排重,推薦使用msgid排重。
2、微信服務器在五秒內收不到響應會斷掉連接,並且重新發起請求,總共重試三次。假如服務器無法保證在五秒內處理並回復,可以直接回復空串,微信服務器不會對此作任何處理,並且不會發起重試。詳情請見“發送消息-被動回復消息”。
3、為了保證更高的安全保障,開發者可以在公眾平台官網的開發者中心處設置消息加密。開啟加密后,用戶發來的消息會被加密,公眾號被動回復用戶的消息也需要加密(但開發者通過客服接口等API調用形式向用戶發送消息,則不受影響)

消息類型

代碼:

<?php

//
// 接收用戶消息
// 微信公眾賬號接收到用戶的消息類型判斷
//
/*思路:
1.定義token
2.實例化api接口對象
3.如果有$_GET['echostr'],通過驗證后原樣返回,用於接口驗證
4.如果不存在就走responseMsg()
5.如果不存在post數據,打印出空字符串,退出
6.如果有post數據,根據post接收到的字符串將其實例化成一個XML對象
7.根據微信端XML的MsgType屬性判斷用戶輸入的信息類型,返回一個XML對象信息給用戶
*/

define("TOKEN", "zhouqi");

$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;
case "location"://位置消息
$result = $this->receiveLocation($postObj);
break;
case "link": //鏈接消息
$result = $this->receiveLink($postObj);
break;
default:
$result = "unknow msg type: ".$RX_TYPE;
break;
}
echo $result;
}else {
echo "";
exit;
}
}

/*
* 接收文本消息
*/
private function receiveText($object)
{
$content = "你發送的是文本,內容為:".$object->Content;
$result = $this->transmitText($object, $content);
return $result;
}

/*
* 接收圖片消息
*/
private function receiveImage($object)
{
$content = "你發送的是圖片,地址為:".$object->PicUrl;
$result = $this->transmitText($object, $content);
return $result;
}

/*
* 接收語音消息
*/
private function receiveVoice($object)
{
$content = "你發送的是語音,媒體ID為:".$object->MediaId;
$result = $this->transmitText($object, $content);
return $result;
}

/*
* 接收視頻消息
*/
private function receiveVideo($object)
{
$content = "你發送的是視頻,媒體ID為:".$object->MediaId;
$result = $this->transmitText($object, $content);
return $result;
}

/*
* 接收位置消息
*/
private function receiveLocation($object)
{
$content = "你發送的是位置,緯度為:".$object->Location_X.";經度為:".$object->Location_Y.";縮放級別為:".$object->Scale.";位置為:".$object->Label;
$result = $this->transmitText($object, $content);
return $result;
}

/*
* 接收鏈接消息
*/
private function receiveLink($object)
{
$content = "你發送的是鏈接,標題為:".$object->Title.";內容為:".$object->Description.";鏈接地址為:".$object->Url;
$result = $this->transmitText($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;
}
}
?>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM