背景:微信小程序開發,准備使用模板消息做些事情,但是發現需要先在微信公眾平台的開發——開發設置——消息推送做配置,然后我們后台人員就開始各種配置,但是一到驗證token就報錯,很是郁悶,然后各種排查,發現了最終原因,過程和代碼如下:
很多網站給出的服務器代碼如下:
//檢查簽名
/**
* 驗證消息推送
*
*/
public function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = 'ziqin';
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if ($tmpStr == $signature ) {
echo $_GET["echostr"];
} else {
echo false;
}
}
以上代碼看上去沒問題,后台查看日志也是可以對應上的,但是一旦提交還是token校驗失敗,后台各種查資料,最終發現需要使用ob_clean();最終代碼如下:
(在輸出“echostr”前,清空緩存區,即在echo 前放置“ob_clean();”代碼。
官方解釋:ob_clean() 此函數用來丟棄輸出緩沖區中的內容;)
//檢查簽名
/**
* 驗證消息推送
*
*/
public function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = 'ziqin';
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if ($tmpStr == $signature ) {
ob_clean();
echo $_GET["echostr"];
} else {
echo false;
}
}
以上是正確配置方式!
微信官方對token校驗的說明為:開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。加密/校驗流程如下: 1、將token、timestamp、nonce三個參數進行字典序排序 2、將三個參數字符串拼接成一個字符串進行sha1加密 3、開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信。