php公眾號開發,訊息丟失的原因和解決辦法

weixin_34148340發表於2018-08-26

在使用PHP進行公眾號開發時,如果出現訊息部分丟失的話,很可能是下載到舊的sdk。
    這種情況一般出現在從網上下載SDK而不是從官方下載sdk,導致下載到舊的sdk。而舊的sdk中有bug會導致公眾號訊息解密失敗,從而漏掉訊息。
    官方提供的舊的sdk中的 checkSignature 函式,導致回覆的訊息經常性的丟失。 官方示例程式碼中的 checkSignature 函式:

//這裡是官方舊的sdk程式碼,是錯誤的,別複製黏貼。
private function checkSignature() { 
      $signature = $_GET["signature"]; 
      $timestamp = $_GET["timestamp"]; 
      $nonce = $_GET["nonce"]; 
      $token = TOKEN; 
      $tmpArr = array($token, $timestamp, $nonce); 
      sort($tmpArr);
      $tmpStr = implode( $tmpArr ); 
      $tmpStr = sha1( $tmpStr ); 
      if( $tmpStr == $signature ){ 
            return true; 
       }else{ 
            return false;
       }
 }

其中的 sort($tmpArr);修改為 sort($tmpArr, SORT_STRING);
正確程式碼為:

private function checkSignature() { 
      $signature = $_GET["signature"]; 
      $timestamp = $_GET["timestamp"]; 
      $nonce = $_GET["nonce"]; 
      $token = TOKEN; 
      $tmpArr = array($token, $timestamp, $nonce); 
      sort($tmpArr, SORT_STRING);
      $tmpStr = implode( $tmpArr ); 
      $tmpStr = sha1( $tmpStr ); 
      if( $tmpStr == $signature ){ 
            return true; 
       }else{ 
            return false;
       }
 }

    這個bug的出現時因為sort函式預設把每一項按常規順序排列(Standard ASCII,不改變型別)的,因此解密時會出現偶現性解密失敗。而SORT_STRING引數是把每一項作為字串來處理,使用類似 natsort() 的自然排序。

相關文章