測試文件c7.php代碼:
~~~
<?php
define('TOKEN','zhangyouwu');//定義token
$obj=new Weixin();//實例化函數
if(!isset($_GET['echostr'])){//如果隨機字符串不存在
$obj->receive();
}else{
$obj->checkSignature();//調用函數中的方法
}
class Weixin{
public function checkSignature()
{
$signature = $_GET["signature"];//加密簽名
$timestamp = $_GET["timestamp"];//時間戳
$nonce = $_GET["nonce"];//隨機數
$token = TOKEN;
$tmpArr = array($token,$timestamp, $nonce);//組成新數組
sort($tmpArr, SORT_STRING);//重新排序
$tmpStr = implode( $tmpArr );//轉換成字符串
$tmpStr = sha1( $tmpStr );//再將字符串加密
if( $tmpStr==$signature ){
echo $_GET['echostr'];
}else{
return false;
}
}
public function receive(){
$obj=$GLOBALS['HTTP_RAW_POST_DATA'];//接受消息
$postSql=simplexml_load_string($obj,'SimpleXMLElement',LIBXML_NOCDATA);
$this->logger("接受:\n".$obj);
if(!empty($postSql)){
switch(trim($postSql->MsgType)){
case "text":
$result=$this->receiveText($postSql);
if(!empty($result)){
echo $result;
}else{
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
echo $result=sprintf($xml,$postSql->FromUserName,$postSql->ToUserName,time(),$postSql->MsgType,"沒有這條文本信息(⊙o⊙)…");
}
}
}
}
private function receiveText($postSql){
$content=trim($postSql->Content);
if(strstr($content,"你好")){//strstr模糊匹配
$xml="<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$result=sprintf($xml,$postSql->FromUserName,$postSql->ToUserName,time(),$postSql->MsgType,"hello");
return $result;
}
}
private function logger($content){//存儲日志
$logSize=100000;//定義日志大小
$log="log.txt";//定義日志名字
if(file_exists($log)&&filesize($log)>$logSize){//如果日志存在并且大于定義的大小
unlink($log);//刪除
}
//文件寫入1.名字2.內容,+時間防止重復3.內容往后加而不是覆蓋
file_put_contents($log,date('H:i:s')." ".$content."\n",FILE_APPEND);
}
}
?>
~~~
測試

日志中的記錄
