PHP微信定製開發-介面配置校驗
阿新 • • 發佈:2018-12-22
縱觀微信公眾平臺開發的各類書籍,基本上微信定製開發都是從微信訊息開始的,主要是伺服器被動回覆訊息這塊為主,這個模組也算微信的核心,這次將以驗證微信訊息來自微信伺服器為例,分享下我的程式碼
一 入口的切入點
我們知道做微信開發需要處理來自使用者、微信伺服器的各類的訊息,查閱微信文件可總結出的規律是 驗證訊息來自微信伺服器為GET請求,其他微信訊息的推送是POST請求 , 根據這一規律我們就可以將校驗和訊息推送統一進行處理
二 程式碼的實現
1 php可以通過$_SERVER['REQUEST_METHOD']獲取請求的型別
2 按照流程程式需要校驗signature的有效性並返回正確signature
3 計算signature,php的步驟是 陣列排序、把陣列轉成字串、sha1計算出signature(非常重要)
對於第三部php還算比較簡單,但是像java的話就比較複雜,這裡先貼出php的演算法
function checkSignature() { $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $tmpArr = array( TOKEN, $timestamp, $nonce ); sort($tmpArr, SORT_STRING); $tmpStr = implode($tmpArr); $tmpStr = sha1($tmpStr); if ($tmpStr) { return $tmpStr; } else { return ""; } }
開發者提交資訊後,微信伺服器將傳送GET請求到填寫的伺服器地址URL上,GET請求攜帶引數如下表所示:
引數 | 描述 |
---|---|
signature | 微信加密簽名,signature結合了開發者填寫的token引數和請求中的timestamp引數、nonce引數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字串 |
這個是從微信開發文件上摘抄過來的,給大家做參考,詳細的可查閱微信開發文件
function isValid() { $signature = $_GET["signature"]; if ($signature == $this->checkSignature()) { return true; } else { return false; } }
上述兩個方法我寫到了名為WeixinHandler的類裡面,TOKEN是定義好的常量
define("TOKEN", "weixinCourse");
// 步驟
// 1 判斷請求方法,get請求一般為訊息驗證,post為其他訊息互動
// 2 驗證signature是否正確(訊息來自微信伺服器)
$handler = new WeixinHandler();
$reqMethod = strtolower($_SERVER["REQUEST_METHOD"]);
if ("get" == $reqMethod && !empty($_GET["echostr"])) {
if ($handler->isValid()) {
$echostr = $_GET["echostr"];
echo $echostr;
exit();
}
} else {
//判斷訊息型別,返回"你傳送的是xxx訊息"
$handler->responseMessage();
}
responseMessage用來處理各類的訊息,因為這次主要是入門,這個方法下次的部落格分享會給出來,到這裡校驗訊息來自微信伺服器的功能已經完成了,但是還是需要注意一下幾點
1 填寫的URL需要外網可以訪問且越簡單越好,不建議url為帶引數的形式;可使用花生殼、ngrok等
2 Token必須和程式定義的保持一致
java的訊息校驗可參考這個,因為本人是搞java的,就忍不住多囉嗦一下