微信公眾平台消息接口開發(29)校驗簽名與消息響應合並


微信公眾平台開發 微信公眾平台開發者 微信公眾平台開發模式 簽名校驗 消息響應
作者:方倍工作室
原文:http://www.cnblogs.com/txw1958/archive/2013/05/08/weixin-if29-valid-responseMsg.html 

 

一、問題來源

微信公眾平台在啟用接口的時候使用valid函數進行驗證,

define("TOKEN", "方倍工作室");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

但在驗證完成后,就開始執行對消息的響應,不再使用valid函數,需要把他注釋掉,並且設置成responseMsg()

如下

define("TOKEN", "方倍工作室");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->responseMsg();

這樣操作,其實比較麻煩,因為要回頭來改函數。

 

二、問題分析

為什么要用兩個不同函數來處理呢?這是因為兩個不同的函數執行不同的功能,

當執行valid函數時,提交的是驗證字符串,用於保證url和token填寫提交正確,這個時候微信服務器提交給url的請求是

signature=eded789463180edf6c13691398d0cb4c85fb0e23&echostr=5838479218127813673&stamp=1359100969&nonce=1359376876

而當響應消息的時候,已經可以確定url地址正確了,這時候主要是獲得回復的xml了,這時提交的請求類似如下:

signature=ba7f5cf8aee512037e5a669596f6f64a8e763d7c&timestamp=1368016183&nonce=1368211921

 

二、解決方法

我們回頭來看一下valid函數

    public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

其中有一個_GET變量,那么什么是_GET變量,以下內容來自 http://www.w3school.com.cn/php/php_get.asp

$_GET 變量
$_GET 變量是一個數組,內容是由 HTTP GET 方法發送的變量名稱和值。
$_GET 變量用於收集來自 method="get" 的表單中的值。從帶有 GET 方法的表單發送的信息,對任何人都是可見的(會顯示在瀏覽器的地址欄),並且對發送的信息量也有限制(最多 100 個字符)。

為什么使用 $_GET?
注釋:在使用 $_GET 變量時,所有的變量名和值都會顯示在 URL 中。所以在發送密碼或其他敏感信息時,不應該使用這個方法。不過,正因為變量顯示在 URL 中,因此可以在收藏夾中收藏該頁面。在某些情況下,這是很有用的。

 

我們注意到在二中描述的,兩次不同的請求,簽名驗證請求中,url中有個echostr變量,而在響應消息中是沒有的,

signature=eded789463180edf6c13691398d0cb4c85fb0e23&echostr=5838479218127813673&stamp=1359100969&nonce=1359376876

那么我們用同樣的思路,判斷_GET變量中是否有這個echostr變量,來實現區分兩種不同的請求:

最終代碼類似如下:

//define your token
define("TOKEN", "方倍工作室");
$wechatObj = new wechatCallbackapiTest();

if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

 

至此,我們就不用再來注釋一個啟用另一個了,減少了一次麻煩。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM