微信小程序之消息推送配置(token驗證失敗的解決方案)


 

 

背景:微信小程序開發,准備使用模板消息做些事情,但是發現需要先在微信公眾平台的開發——開發設置——消息推送做配置,然后我們后台人員就開始各種配置,但是一到驗證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對比,標識該請求來源於微信。


免責聲明!

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



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