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

微信回復原理:

當普通微信用戶向公眾賬號發(fā)送消息時,微信服務器首先收到用戶發(fā)送的消息;

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

疑問一:為何使用$GLOBALS["HTTP_RAW_POST_DATA"]保存POST過來的數據,而非$_POST數組?

回答:

POST只能保存標準的數據類型,對于XML、SOAP或Application/Octet-steam之類的內容則無法解析。

而$GLOBALS["HTTP_RAW_POST_DATA"]和$_POST是一樣的,如果POST過來的數據PHP能夠識別,則可以用$GLOBALS["HTTP_RAW_POST_DATA"]來接收。

疑問二:simplexml_load_file()各參數和返回值是什么?

回答:

參數含義

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

class:用來指定新對象,通常設置為"SimpleXMLElement",生成一個簡單XML元素的類。

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

ns:一般省略

is_prefix:一般省略

函數執(zhí)行完成后返回SimpleXMLElement類的一個對象。

功能:公眾號只接受文字消息,且做出相應的文字回復。

<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(); 

//校驗方法 

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(){ 

//獲取微信服務器POST請求中的數據 

$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 = "請輸入關鍵字";//消息為空 

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

echo $info; 

}else{ 

echo ""; 

exit; 

}</span>

功能:公眾號只接受圖片消息,且做出相應的文字回復。

<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(); 

//校驗方法 

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[image]]></MsgType> 

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

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

<MsgId>1234567890123456</MsgId> 

</xml> 

*/

public function responseMsg(){ 

//獲取微信服務器POST請求中的數據 

$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 = "請發(fā)送圖片";//消息為空 

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

echo $info; 

}else{ 

echo ""; 

exit; 

}</span>

以上是小編給大家分享的微信消息自動回復下所遇到的坑的相關知識,希望對大家有所幫助!

更多信息請查看網絡編程
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權所有:易賢網