相信很多人會跟我一樣,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,需要的可以參考一下
<?php /** * wechat php test */ //define your token define("TOKEN", "codcodog"); $wechatObj = new wechatCallbackapiTest(); //$wechatObj->valid(); $wechatObj->responseMsg(); class wechatCallbackapiTest { public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ header('content-type:text'); echo $echoStr; exit; } } public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //$postStr = file_get_contents("php://input"); file_put_contents("log.txt",$postStr,FILE_APPEND ); //extract post data if (!empty($postStr)){ /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, the best way is to check the validity of xml by yourself */ libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; //用户 $toUsername = $postObj->ToUserName; //公众平台 $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag></FuncFlag> </xml>"; if(!empty( $keyword )) { $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; }else{ echo "Input something..."; } }else { echo ""; exit; } } private function checkSignature() { // you must define TOKEN by yourself if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
以上所述是小編給大家分享的php微信訂閱號發送訊息給訂閱號但是沒有訊息回傳的解決方案,希望大家喜歡。
以上就介紹了關於php微信訂閱號開發之token驗證後自動發送訊息給訂閱號但是沒有訊息回傳的問題,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。