在公衆號提交URL和token驗證時,微信服務器將發送GET請求到我們在公衆號上填寫的URL中,會帶有四個參數:簽名signature,時間戳timestrap,隨機數nonce和echostr隨機字符串,我們在公衆號發送時間或者time時,微信服務器會將帶有簽名,時間戳,隨機數三個參數訪問開發者的URL,同時將XML消息POST到URL上。而消息不包含echostr這個變量,所以響應responseMsg方法。我們利用XML數據包進行信息的傳遞。
<?php
define("TOKEN","weixin");//定義token常量,在公衆號裏填寫的和這個應該一致。
$wechatObj=new wechatCallbackapiTest();//實例化
if(isset($_GET["echostr"])){//如果GET請求包含了echostr,執行valid方法,在這裏面又調用了checksignature,檢測簽名
$wechatObj->valid();//調用valid函數
}else{
$wechatObj->responseMsg();//否則調用回覆信息函數
}
//微信回調api類
class wechatCallbackapiTest{
public function valid(){
$echoStr=$_GET["echostr"];//獲得隨機字符串
if($this->checkSignature()){//檢測簽名
echo $echostr;
exit;
}
}
private function checkSignature(){//檢測簽名
$signature=$_GET["singature"];//獲的簽名
$timesatmp=$_GET["timestamp"];//獲得時間戳
$nonce=$_GET["nonce"];//獲得隨機數
$token=TOKEN;//前邊已經定義過這個常量
$tmpArr=array($signature,$timestamp,$nonce);//將前面或得到的三個值裝進數組
sort($tmpArr);//進行字典排序
$tmpStr=implode($tmpArr);//將數組轉化爲字符串
$tmpStr=sha1($tmpStr);//進行sha1加密
if($tmpStr==$singature){如果加密之後的結果和簽名一致
return true;//返回真
}else{
return false;
}
}
public function responseMsg(){
$postStr=$GLOBALS["HTTP_RAW_POST_DATA"];//原始的POST數據
if(!empty($postStr)){//post的數據非空的話,將數據載入對象SimpleXMLElement,
$postObj=simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);//,LIBXML_NOCDATA表示將CDATA合併爲文本節點
//獲取XML類對象的值,並且賦給新的變量,其中發送方變爲接收方,接收方變爲發送方
$fromUserName=$postObj->FromUserName;
$toUserName=$postObj->ToUserName;
$keyword=trim($postObj->Content);
$time=time();
//構造回覆的XML數據包
$textTpl="<xml>
<ToUserName><![CDATA[$s]]></ToUserName>
<FromUserName><![CDATA[$s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[$s]]></MsgType>
<Content><![CDATA[$s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if($keyword=="時間"||$keyword=="time"){//判斷關鍵字
$msgType="text";//回覆消息類型爲text
$content=data("Y-m-d H:i:s",time());//內容爲年月日時分秒
$result=sprintf($textTpl,$fromeUserName,$ToUserName,$time,$msgType,$content);//封裝回復的XML數據包,向微信服務器進行輸出
echo $result;
}else{
echo " ";
exit;
}
}
}
}
?>
學會了這個之後,掌握原理,之後就可以進一步進行開發了。