PHP微信開(kāi)發(fā)之微信消息自動(dòng)回復(fù)下所遇到的坑
來(lái)源:易賢網(wǎng) 閱讀:1170 次 日期:2016-08-24 14:27:49
溫馨提示:易賢網(wǎng)小編為您整理了“PHP微信開(kāi)發(fā)之微信消息自動(dòng)回復(fù)下所遇到的坑”,方便廣大網(wǎng)友查閱!

微信回復(fù)原理:

當(dāng)普通微信用戶向公眾賬號(hào)發(fā)送消息時(shí),微信服務(wù)器首先收到用戶發(fā)送的消息;

然后將用戶信息和消息打包成XML格式的數(shù)據(jù)包,再將這個(gè)XML數(shù)據(jù)包通過(guò)POST方法提交到開(kāi)發(fā)者設(shè)置的URL上。

疑問(wèn)一:為何使用$GLOBALS["HTTP_RAW_POST_DATA"]保存POST過(guò)來(lái)的數(shù)據(jù),而非$_POST數(shù)組?

回答:

POST只能保存標(biāo)準(zhǔn)的數(shù)據(jù)類型,對(duì)于XML、SOAP或Application/Octet-steam之類的內(nèi)容則無(wú)法解析。

而$GLOBALS["HTTP_RAW_POST_DATA"]和$_POST是一樣的,如果POST過(guò)來(lái)的數(shù)據(jù)PHP能夠識(shí)別,則可以用$GLOBALS["HTTP_RAW_POST_DATA"]來(lái)接收。

疑問(wèn)二:simplexml_load_file()各參數(shù)和返回值是什么?

回答:

參數(shù)含義

string:需要處理的XML字符串。

class:用來(lái)指定新對(duì)象,通常設(shè)置為"SimpleXMLElement",生成一個(gè)簡(jiǎn)單XML元素的類。

options:指定附加的Libxml參數(shù),通常設(shè)置為常量LIBXML_NOCDATA,表示把CDATA設(shè)置為文本節(jié)點(diǎn)。

ns:一般省略

is_prefix:一般省略

函數(shù)執(zhí)行完成后返回SimpleXMLElement類的一個(gè)對(duì)象。

功能:公眾號(hào)只接受文字消息,且做出相應(yīng)的文字回復(fù)。

<span style="font-family:Courier New;font-size:14px;"><?php 

define("TOKEN","weixin"); 

$weixinObj = new Wechat(); 

$weixinObj->valid(); 

class Wechat{ 

public function valid(){ 

$echoStr = $_GET['echostr']; 

//如果是第一次接入 

if($this->checkSignature() && $echoStr ){ 

echo $echoStr; 

exit; 

}else{ 

$this->responseMsg(); 

//校驗(yàn)方法 

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; 

/* 普通文本消息 

<xml> 

<ToUserName><![CDATA[toUser]]></ToUserName> 

<FromUserName><![CDATA[fromUser]]></FromUserName> 

<CreateTime>1348831860</CreateTime> 

<MsgType><![CDATA[text]]></MsgType> 

<Content><![CDATA[this is a test]]></Content> 

</xml> 

*/

public function responseMsg(){ 

//獲取微信服務(wù)器POST請(qǐng)求中的數(shù)據(jù) 

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 

if( !empty($postStr) ){ 

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 

$fromUser = $postObj->FromUserName; 

$toUser = $postObj->ToUserName; 

$keyword = trim($postObj->Content); 

$time = time(); 

$template = "<xml> 

<ToUserName><![CDATA[%s]]></ToUserName> 

<FromUserName><![CDATA[%s]]></FromUserName> 

<CreateTime>%s</CreateTime> 

<MsgType><![CDATA[%s]]></MsgType> 

<Content><![CDATA[%s]]></Content> 

</xml>"; 

if( strtolower($postObj->MsgType)!='text' ){ 

$msgType = "text"; 

$content = "我只接受文本消息"; 

}else{ 

$msgType = "text"; 

if( !empty($keyword) ){ 

$content = "您發(fā)送的消息是:".$postObj->Content; 

}else{ 

$content = "請(qǐng)輸入關(guān)鍵字";//消息為空 

$info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); 

echo $info; 

}else{ 

echo ""; 

exit; 

}</span>

功能:公眾號(hào)只接受圖片消息,且做出相應(yīng)的文字回復(fù)。

<span style="font-family:Courier New;font-size:14px;"><?php 

define("TOKEN","weixin"); 

$weixinObj = new Wechat(); 

$weixinObj->valid(); 

class Wechat{ 

public function valid(){ 

$echoStr = $_GET['echostr']; 

//如果是第一次接入 

if($this->checkSignature() && $echoStr ){ 

echo $echoStr; 

exit; 

}else{ 

$this->responseMsg(); 

//校驗(yàn)方法 

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; 

/* 接收?qǐng)D片消息格式 

<xml> 

<ToUserName><![CDATA[toUser]]></ToUserName> 

<FromUserName><![CDATA[fromUser]]></FromUserName> 

<CreateTime>1348831860</CreateTime> 

<MsgType><![CDATA[image]]></MsgType> 

<PicUrl><![CDATA[this is a url]]></PicUrl> 

<MediaId><![CDATA[media_id]]></MediaId> 

<MsgId>1234567890123456</MsgId> 

</xml> 

*/

public function responseMsg(){ 

//獲取微信服務(wù)器POST請(qǐng)求中的數(shù)據(jù) 

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 

if( !empty($postStr) ){ 

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 

$fromUser = $postObj->FromUserName; 

$toUser = $postObj->ToUserName; 

$time = time(); 

$msgType= $postObj->MsgType; 

$picUrl = $postObj->PicUrl; 

$mediaId = $postObj->MediaId; 

$template = "<xml> 

<ToUserName><![CDATA[%s]]></ToUserName> 

<FromUserName><![CDATA[%s]]></FromUserName> 

<CreateTime>%s</CreateTime> 

<MsgType><![CDATA[%s]]></MsgType> 

<Content><![CDATA[%s]]></Content> 

</xml>"; 

if( strtolower($msgType)!='image' ){ 

$msgType = "text"; 

$content = "我只接受圖片消息"; 

}else{ 

$msgType = "text"; 

if( !empty( $picUrl ) ){ 

$content = "圖片鏈接為:".$picUrl."\n"; 

$content .= "媒體id:".$mediaId; 

}else{ 

$content = "請(qǐng)發(fā)送圖片";//消息為空 

$info = sprintf($template, $fromUser, $toUser, $time, $msgType, $content); 

echo $info; 

}else{ 

echo ""; 

exit; 

}</span>

以上是小編給大家分享的微信消息自動(dòng)回復(fù)下所遇到的坑的相關(guān)知識(shí),希望對(duì)大家有所幫助!

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)