訂閱號開發之token驗證後,自動回複訊息功能做好,發送訊息沒有返回,token自動回複
相信很多人會跟我一樣,token驗證之後,發送訊息給訂閱號,沒有訊息返回。
以下,說一下我辛苦調試得到的解決辦法:
首先,token驗證:
自己寫的token一直驗證失敗,找了好久,沒有發現bug。實在沒辦法,就用了官方的範例程式碼。並且通過範例程式碼調試,發現了一個讓我吐血的bug(也不算bug):
token驗證貌似要求字元編碼格式!!!!
官方的範例程式碼,直接上傳到伺服器,token直接過!
把官方範例程式碼改為UTF-8格式,再上傳覆蓋,token失敗!失敗!失敗!
後來,把自己寫的修改為ANSI格式還是token失敗!醉了醉了!那隻好用官方範例程式碼。在此,說下,token是一次握手驗證,驗證過一次就不用了。
下面,言歸正傳,貌似偏題了...orz
token驗證之後,直接用官方範例程式碼,趕緊測試自己的訂閱號,結果....發出去的訊息就跟潑出去的水一樣,什麼鬼都沒有返回...orz
又各種找bug,各種群問,各種搜尋....曆經本博主九九八十一的努力,終於找出了問題所在(這裡是指我自己開發的,並不包括全部,如果你有不同的bug,歡迎交流):
1、最容易被忽視的一個bug,官方給的範例程式碼,壓根就沒調用寫好的那個responseMsg()函數!
2、把之前的token代碼注釋,也就是$wechatObj->valid();這行代碼。因為toke驗證那段代碼會有一個echo $echostr,會把responseMsg()函數裡的echo $resultStr;(56行)xml格式混亂,輸回給伺服器就無法識別了(貌似只能識別xml格式,還有json格式)。(token驗證是一次握手驗證,驗證開發人員之後,就可以不用了,趕緊讓它消失在我們整潔的代碼orz...)
3、最噁心的一個bug,還是字元編碼問題!orz...xml要求UTF-8編碼,所以,把範例程式碼改回UTF-8編碼!這個bug找的讓我崩潰!!!
下面是我修改後的代碼,能正常運行,無bug,需要的可以參考一下
1 php 2 /** 3 * wechat php test 4 */ 5 6 //define your token 7 define("TOKEN", "codcodog"); 8 9 $wechatObj = new wechatCallbackapiTest();10 //$wechatObj->valid();11 $wechatObj->responseMsg();12 13 class wechatCallbackapiTest14 {15 public function valid()16 {17 $echoStr = $_GET["echostr"];18 19 //valid signature , option20 if($this->checkSignature()){21 header('content-type:text');22 echo $echoStr;23 exit;24 }25 }26 27 public function responseMsg()28 {29 //get post data, May be due to the different environments30 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];31 //$postStr = file_get_contents("php://input");32 file_put_contents("log.txt",$postStr,FILE_APPEND );33 //extract post data34 if (!empty($postStr)){35 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,36 the best way is to check the validity of xml by yourself */37 libxml_disable_entity_loader(true);38 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);39 $fromUsername = $postObj->FromUserName; //使用者40 $toUsername = $postObj->ToUserName; //公眾平台41 $keyword = trim($postObj->Content);42 $time = time();43 $textTpl = "44 %s45 %s46 %s47 %s48 %s49 050 "; 51 if(!empty( $keyword ))52 {53 $msgType = "text";54 $contentStr = "Welcome to wechat world!";55 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);56 echo $resultStr;57 }else{58 echo "Input something...";59 }60 61 }else {62 echo "";63 exit;64 }65 }66 67 private function checkSignature()68 {69 // you must define TOKEN by yourself70 if (!defined("TOKEN")) {71 throw new Exception('TOKEN is not defined!');72 }73 74 $signature = $_GET["signature"];75 $timestamp = $_GET["timestamp"];76 $nonce = $_GET["nonce"];77 78 $token = TOKEN;79 $tmpArr = array($token, $timestamp, $nonce);80 // use SORT_STRING rule81 sort($tmpArr, SORT_STRING);82 $tmpStr = implode( $tmpArr );83 $tmpStr = sha1( $tmpStr );84 85 if( $tmpStr == $signature ){86 return true;87 }else{88 return false;89 }90 }91 }92 93 94 ?>
http://www.bkjia.com/PHPjc/1082307.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1082307.htmlTechArticle訂閱號開發之token驗證後,自動回複訊息功能做好,發送訊息沒有返回,token自動回複 相信很多人會跟我一樣,token驗證之後,發送訊息...