91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • php中如何解決token驗證后自動發送消息給訂閱號但是沒有消息返回的問題

php中如何解決token驗證后自動發送消息給訂閱號但是沒有消息返回的問題

發布時間:2021-09-23 16:14:26 來源:億速云 閱讀:95 作者:iii 欄目:開發技術

這篇文章主要講解了“php中如何解決token驗證后自動發送消息給訂閱號但是沒有消息返回的問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“php中如何解決token驗證后自動發送消息給訂閱號但是沒有消息返回的問題”吧!

相信很多人會跟我一樣,token驗證之后,發送消息給訂閱號,沒有消息返回。

以下,說一下我辛苦調試得到的解決辦法:

首先,token驗證:

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

token驗證貌似要求字符編碼格式!!!!

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

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

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

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

token驗證之后,直接用官方示例代碼,趕緊測試自己的訂閱號,結果....發出去的消息就跟潑出去的水一樣,什么鬼都沒有返回...orz

又各種找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中如何解決token驗證后自動發送消息給訂閱號但是沒有消息返回的問題”的內容了,經過本文的學習后,相信大家對php中如何解決token驗證后自動發送消息給訂閱號但是沒有消息返回的問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西宁市| 梅河口市| 神池县| 利辛县| 潮安县| 错那县| 建始县| 丹凤县| 凌云县| 南通市| 平南县| 六安市| 冀州市| 年辖:市辖区| 利津县| 德化县| 眉山市| 特克斯县| 安新县| 九江市| 阳西县| 新密市| 花莲市| 大连市| 玛纳斯县| 襄樊市| 聂荣县| 永川市| 武陟县| 潢川县| 德安县| 文山县| 锦州市| 苍山县| 延川县| 武义县| 商洛市| 山阴县| 江北区| 斗六市| 招远市|