<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();//將11行的class類例項化
$wechatObj->valid();//使用-》訪問類中valid方法,用來驗證開發模式
//11--23行程式碼為簽名及介面驗證。
class wechatCallbackapiTest
{
public function valid()//驗證介面的方法
{
$echoStr = $_GET["echostr"];//從微信使用者端獲取一個隨機字元賦予變數echostr
//valid signature , option訪問地61行的checkSignature簽名驗證方法,如果簽名一致,輸出變數echostr,完整驗證配置介面的操作
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
//公有的responseMsg的方法,是我們回覆微信的關鍵。以後的章節修改程式碼就是修改這個。
public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//將使用者端放鬆的資料儲存到變數postStr中,由於微信端傳送的都是xml,使用postStr無法解析,故使用$GLOBALS["HTTP_RAW_POST_DATA"]獲取
//extract post data如果使用者端資料不為空,執行30-55否則56-58
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//將postStr變數進行解析並賦予變數postObj。simplexml_load_string()函式是php中一個解析XML的函式,SimpleXMLElement為新物件的類,LIBXML_NOCDATA表示將CDATA設定為文字節點,CDATA標籤中的文字XML不進行解析
$fromUsername = $postObj->FromUserName;//將微信使用者端的使用者名稱賦予變數FromUserName
$toUsername = $postObj->ToUserName;//將你的微信公眾賬號ID賦予變數ToUserName
$keyword = trim($postObj->Content);//將使用者微信發來的文字內容去掉空格後賦予變數keyword
$time = time();//將系統時間賦予變數time
//構建XML格式的文字賦予變數textTpl,注意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>";
//39行,%s表示要轉換成字元的資料型別,CDATA表示不轉義
//40行為微信來源方
//41行為系統時間
//42行為回覆微信的資訊型別
//43行為回覆微信的內容
//44行為是否星標微信
//XML格式文字結束符號
if(!empty( $keyword ))//如果使用者端微信發來的文字內容不為空,執行46--51否則52--53
{
$msgType = "text";//回覆文字資訊型別為text型,變數型別為msgType
$contentStr = "Welcome to wechat world!";//我們進行文字輸入的內容,變數名為contentStr,如果你要更改回覆資訊,就在這兒
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);//將XML格式中的變數分別賦值。注意sprintf函式
echo $resultStr;//輸出回覆資訊,即傳送微信
}else{
echo "Input something...";//不傳送到微信端,只是測試使用
}
}else {
echo "";//回覆為空,無意義,除錯用
exit;
}
}
//簽名驗證程式 ,checkSignature被18行呼叫。官方加密、校驗流程:將token,timestamp,nonce這三個引數進行字典序排序,然後將這三個引數字串拼接成一個字串驚喜shal加密,開發者獲得加密後的字串可以與signature對比,表示該請求來源於微信。
private function checkSignature()
{
$signature = $_GET["signature"];//從使用者端獲取簽名賦予變數signature
$timestamp = $_GET["timestamp"];//從使用者端獲取時間戳賦予變數timestamp
$nonce = $_GET["nonce"]; //從使用者端獲取隨機數賦予變數nonce
$token = TOKEN;//將常量token賦予變數token
$tmpArr = array($token, $timestamp, $nonce);//簡歷陣列變數tmpArr
sort($tmpArr, SORT_STRING);//新建排序
$tmpStr = implode( $tmpArr );//字典排序
$tmpStr = sha1( $tmpStr );//shal加密
//tmpStr與signature值相同,返回真,否則返回假
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>