1. 程式人生 > >PHP微信定製開發-介面配置校驗

PHP微信定製開發-介面配置校驗

縱觀微信公眾平臺開發的各類書籍,基本上微信定製開發都是從微信訊息開始的,主要是伺服器被動回覆訊息這塊為主,這個模組也算微信的核心,這次將以驗證微信訊息來自微信伺服器為例,分享下我的程式碼

一  入口的切入點

我們知道做微信開發需要處理來自使用者、微信伺服器的各類的訊息,查閱微信文件可總結出的規律是 驗證訊息來自微信伺服器為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的,就忍不住多囉嗦一下