溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php中如何解決token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒有消息返回的問題

發(fā)布時(shí)間:2021-09-23 16:14:26 來源:億速云 閱讀:94 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“php中如何解決token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒有消息返回的問題”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“php中如何解決token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒有消息返回的問題”吧!

相信很多人會(huì)跟我一樣,token驗(yàn)證之后,發(fā)送消息給訂閱號(hào),沒有消息返回。

以下,說一下我辛苦調(diào)試得到的解決辦法:

首先,token驗(yàn)證:

自己寫的token一直驗(yàn)證失敗,找了好久,沒有發(fā)現(xiàn)bug。實(shí)在沒辦法,就用了官方的示例代碼。并且通過示例代碼調(diào)試,發(fā)現(xiàn)了一個(gè)讓我吐血的bug(也不算bug):

token驗(yàn)證貌似要求字符編碼格式!?。?!

官方的示例代碼,直接上傳到服務(wù)器,token直接過!

把官方示例代碼改為UTF-8格式,再上傳覆蓋,token失??!失敗!失敗!

后來,把自己寫的修改為ANSI格式還是token失敗!醉了醉了!那只好用官方示例代碼。在此,說下,token是一次握手驗(yàn)證,驗(yàn)證過一次就不用了。

下面,言歸正傳,貌似偏題了...orz

token驗(yàn)證之后,直接用官方示例代碼,趕緊測(cè)試自己的訂閱號(hào),結(jié)果....發(fā)出去的消息就跟潑出去的水一樣,什么鬼都沒有返回...orz

又各種找bug,各種群?jiǎn)?,各種搜索....歷經(jīng)本博主九九八十一的努力,終于找出了問題所在:

1、最容易被忽視的一個(gè)bug,官方給的示例代碼,壓根就沒調(diào)用寫好的那個(gè)responseMsg()函數(shù)!

2、把之前的token代碼注釋,也就是$wechatObj->valid();這行代碼。因?yàn)閠oke驗(yàn)證那段代碼會(huì)有一個(gè)echo $echostr,會(huì)把responseMsg()函數(shù)里的echo $resultStr;(56行)xml格式混亂,輸回給微信服務(wù)器就無法識(shí)別了(貌似只能識(shí)別xml格式,還有json格式)。(token驗(yàn)證是一次握手驗(yàn)證,驗(yàn)證開發(fā)者之后,就可以不用了,趕緊讓它消失在我們整潔的代碼orz...)

3、最惡心的一個(gè)bug,還是字符編碼問題!orz...xml要求UTF-8編碼,所以,把示例代碼改回UTF-8編碼!這個(gè)bug找的讓我崩潰!?。?/p>

下面是我修改后的代碼,能正常運(yùn)行,無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中如何解決token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒有消息返回的問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)php中如何解決token驗(yàn)證后自動(dòng)發(fā)送消息給訂閱號(hào)但是沒有消息返回的問題這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI