關(guān)于php微信訂閱號(hào)開(kāi)發(fā)之token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒(méi)有消息返回的問(wèn)題
相信很多人會(huì)跟我一樣,token驗(yàn)證之后,發(fā)送消息給訂閱號(hào),沒(méi)有消息返回。
以下,說(shuō)一下我辛苦調(diào)試得到的解決辦法:
首先,token驗(yàn)證:
自己寫(xiě)的token一直驗(yàn)證失敗,找了好久,沒(méi)有發(fā)現(xiàn)bug。實(shí)在沒(méi)辦法,就用了官方的示例代碼。并且通過(guò)示例代碼調(diào)試,發(fā)現(xiàn)了一個(gè)讓我吐血的bug(也不算bug):
token驗(yàn)證貌似要求字符編碼格式?。。。?br />
官方的示例代碼,直接上傳到服務(wù)器,token直接過(guò)!
把官方示例代碼改為UTF-8格式,再上傳覆蓋,token失??!失??!失敗!
后來(lái),把自己寫(xiě)的修改為ANSI格式還是token失??!醉了醉了!那只好用官方示例代碼。在此,說(shuō)下,token是一次握手驗(yàn)證,驗(yàn)證過(guò)一次就不用了。
下面,言歸正傳,貌似偏題了...orz
token驗(yàn)證之后,直接用官方示例代碼,趕緊測(cè)試自己的訂閱號(hào),結(jié)果....發(fā)出去的消息就跟潑出去的水一樣,什么鬼都沒(méi)有返回...orz
又各種找bug,各種群?jiǎn)?,各種搜索....歷經(jīng)本博主九九八十一的努力,終于找出了問(wèn)題所在(這里是指我自己開(kāi)發(fā)的,并不包括全部,如果你有不同的bug,歡迎交流):
1、最容易被忽視的一個(gè)bug,官方給的示例代碼,壓根就沒(méi)調(diào)用寫(xiě)好的那個(gè)responseMsg()函數(shù)!
2、把之前的token代碼注釋,也就是$wechatObj->valid();這行代碼。因?yàn)閠oke驗(yàn)證那段代碼會(huì)有一個(gè)echo $echostr,會(huì)把responseMsg()函數(shù)里的echo $resultStr;(56行)xml格式混亂,輸回給微信服務(wù)器就無(wú)法識(shí)別了(貌似只能識(shí)別xml格式,還有json格式)。(token驗(yàn)證是一次握手驗(yàn)證,驗(yàn)證開(kāi)發(fā)者之后,就可以不用了,趕緊讓它消失在我們整潔的代碼orz...)
3、最惡心的一個(gè)bug,還是字符編碼問(wèn)題!orz...xml要求UTF-8編碼,所以,把示例代碼改回UTF-8編碼!這個(gè)bug找的讓我崩潰!??!
下面是我修改后的代碼,能正常運(yùn)行,無(wú)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; //公眾平臺(tái) $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微信訂閱號(hào)開(kāi)發(fā)之token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒(méi)有消息返回的解決方案,希望大家喜歡。
- thinkphp5框架API token身份驗(yàn)證功能示例
- php版微信開(kāi)發(fā)Token驗(yàn)證失敗或請(qǐng)求URL超時(shí)問(wèn)題的解決方法
- PHP token驗(yàn)證生成原理實(shí)例分析
- PHP實(shí)現(xiàn)微信公眾號(hào)驗(yàn)證Token的示例代碼
- php token使用與驗(yàn)證示例【測(cè)試可用】
- PHP實(shí)現(xiàn)防止表單重復(fù)提交功能【基于token驗(yàn)證】
- 詳解php curl帶有csrf-token驗(yàn)證模擬提交方法
- Thinkphp5 微信公眾號(hào)token驗(yàn)證不成功的原因及解決方法
- 驗(yàn)證token、回復(fù)圖文\文本、推送消息的實(shí)用微信類php代碼
- php中關(guān)于token驗(yàn)證的相關(guān)問(wèn)題詳解
相關(guān)文章
php定義數(shù)組和使用示例(php數(shù)組的定義方法)
這篇文章主要介紹了php定義數(shù)組和使用示例(php數(shù)組的定義方法),需要的朋友可以參考下2014-03-03PHP實(shí)現(xiàn)的連貫操作、鏈?zhǔn)讲僮鲗?shí)例
這篇文章主要介紹了PHP實(shí)現(xiàn)的連貫操作、鏈?zhǔn)讲僮鲗?shí)例,本文用一個(gè)數(shù)據(jù)庫(kù)操作類作為實(shí)例,需要的朋友可以參考下2014-07-07Zend Framework框架教程之Zend_Db_Table_Rowset用法實(shí)例分析
這篇文章主要介紹了Zend Framework框架教程之Zend_Db_Table_Rowset用法,結(jié)合實(shí)例形式分析了Zend_Db_Table_Rowset操作結(jié)果集的相關(guān)技巧,需要的朋友可以參考下2016-03-03Chart.js在Laravel項(xiàng)目中的應(yīng)用示例
本篇文章主要介紹了Chart.js在Laravel項(xiàng)目中的應(yīng)用示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09thinkphp中session和cookie無(wú)效的解決方法
這篇文章主要介紹了thinkphp中session和cookie無(wú)效的解決方法,涉及針對(duì)BOM頭的分析與刪除方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12記錄Yii2框架開(kāi)發(fā)微信公眾號(hào)遇到的問(wèn)題及解決方法
微信公眾號(hào)開(kāi)發(fā),提示“該公眾號(hào)暫時(shí)無(wú)法提供服務(wù),請(qǐng)稍后再試”,如何解決?下面小編給大家?guī)?lái)了解決方法,一起看看吧2018-07-07