首頁 >後端開發 >php教程 >關於php微信訂閱號開發之token驗證後自動發送訊息給訂閱號碼但是沒有訊息回傳的問題

關於php微信訂閱號開發之token驗證後自動發送訊息給訂閱號碼但是沒有訊息回傳的問題

WBOY
WBOY原創
2016-07-29 09:09:341014瀏覽

相信很多人會跟我一樣,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,需要的可以參考一下

<&#63;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教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn