麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > PHP > 正文

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

2024-05-04 23:41:12
字體:
供稿:網(wǎng)友
最近做了個項目,當(dāng)token驗證之后,發(fā)送消息給訂閱號,但是沒有消息返回,下面小編通過本篇文章給大家分享我的解決辦法
 

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

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

首先,token驗證:

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

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

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

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

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

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

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

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

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

2、把之前的token代碼注釋,也就是$wechatObj->valid();這行代碼。因為toke驗證那段代碼會有一個echo $echostr,會把responseMsg()函數(shù)里的echo $resultStr;(56行)xml格式混亂,輸回給微信服務(wù)器就無法識別了(貌似只能識別xml格式,還有json格式)。(token驗證是一次握手驗證,驗證開發(fā)者之后,就可以不用了,趕緊讓它消失在我們整潔的代碼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微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的解決方案,希望大家喜歡。



注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 成年免费观看视频 | 校花被肉干高h潮不断 | 亚洲人成免费 | 99国产精品白浆在线观看免费 | 黄片毛片一级 | 国产日本欧美在线观看 | 337p日本欧洲亚洲大胆精蜜臀 | 国产成人在线免费观看视频 | 黄视频网站免费观看 | 99精品视频在线看 | 人人舔人人插 | 九色在线78m | 亚洲国产馆 | 欧美性猛交xxx乱大交3蜜桃 | 精品午夜久久 | 摸逼逼视频 | 亚洲成人中文字幕在线 | 色播亚洲| 欧美黄 片免费观看 | 国产亚洲精品综合一区91555 | 亚州视频在线 | 日本a在线观看 | 久久视频精品 | 国产资源在线观看视频 | 欧美成人精品欧美一级乱黄 | 欧美激情综合网 | 欧美成人综合视频 | 国产精品91在线 | 精品国产一区二区三区四 | 国产亚洲高清视频 | 日韩av在线网 | 国产精品久久久久久久久久尿 | 国内精品久久久久久2021浪潮 | 嫩草影院在线观看网站成人 | 亚洲性在线视频 | 久久亚洲精品国产 | 最新欧美精品一区二区三区 | 国产一精品久久99无吗一高潮 | 黄污网站在线观看 | 欧美精品一区二区三区在线 | sese在线视频 |