欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于php微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的問題

 更新時間:2015年12月21日 14:22:04   作者:小小mo  
最近做了個項目,當token驗證之后,發(fā)送消息給訂閱號,但是沒有消息返回,下面小編通過本篇文章給大家分享我的解決辦法

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

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

首先,token驗證:

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

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

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

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

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

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

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

又各種找bug,各種群問,各種搜索....歷經本博主九九八十一的努力,終于找出了問題所在(這里是指我自己開發(fā)的,并不包括全部,如果你有不同的bug,歡迎交流):

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

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

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

下面是我修改后的代碼,能正常運行,無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微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的解決方案,希望大家喜歡。

相關文章

最新評論