php公眾號開發,訊息丟失的原因和解決辦法
在使用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() 的自然排序。
相關文章
- 微信公眾號開發之客服訊息
- Session莫名丟失的原因及解決辦法Session
- 微信公眾號開發(二)識別訊息型別型別
- 安裝zblog提示“建立c_option.php失敗”的原因和解決辦法PHP
- 關於$ is not defined的原因和解決辦法
- PHP微信公眾號開發——公共方法PHP
- 如何快速實現公眾號群發模板訊息?
- RocketMQ訊息丟失解決方案:事務訊息MQ
- 伺服器卡的原因和解決辦法伺服器
- RabbitMQ:訊息丟失 | 訊息重複 | 訊息積壓的原因+解決方案+網上學不到的使用心得MQ
- 蘋果iphone6 Plus觸控失靈真正的原因和解決辦法蘋果iPhone
- RocketMq訊息丟失問題解決MQ
- PHP微信公眾平臺開發視訊PHP
- Java微信公眾號推送模版訊息的方法示例Java
- 微信公眾號下發紅包 -- PHPPHP
- 微信公眾號開發
- 微信接收不到訊息原因分析與解決辦法
- android ANR產生原因和解決辦法Android
- RabbitMQ防止訊息丟失MQ
- 硬碟資料丟失原因和解決方案/資料恢復方法硬碟資料恢復
- 電腦黑屏怎麼辦?顯示器黑屏無訊號但主機執行正常的原因和解決辦法
- 小程式中使用公眾號模板訊息思路整理
- 公眾號開發筆記筆記
- 微信公眾號開發-分享
- .net開發微信公眾號
- 微信開發之公眾號
- 微信公眾平臺開發(十二) 傳送客服訊息
- 微信公眾平臺開發(十) 訊息回覆總結
- PHP中SESSION丟失(不能跨頁面傳遞)解決辦法PHPSession
- mysql丟失root密碼的解決辦法MySql密碼
- session丟失與解決辦法的資料Session
- Session丟失的解決辦法小結 (轉)Session
- 微信公眾號如何實現模板訊息傳送的功能
- 在安卓上,微信公眾號無法分享到QQ的解決辦法之一安卓
- warning: CRLF will be replaced by LF in 出現的原因和解決辦法
- 公眾號開發總是有快取怎麼辦?快取
- 路由不定時丟包原因和解決方法路由
- 微信公眾號開發5-自定義選單-微信開發phpPHP