《PHP編程:關(guān)于php微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的問題》要點:
本文介紹了PHP編程:關(guān)于php微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的問題,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP實例相信很多人會跟我一樣,token驗證之后,發(fā)送消息給訂閱號,沒有消息返回.
PHP實例以下,說一下我辛苦調(diào)試得到的解決方法:
PHP實例首先,token驗證:
PHP實例自己寫的token一直驗證失敗,找了好久,沒有發(fā)現(xiàn)bug.實在沒方法,就用了官方的示例代碼.并且通過示例代碼調(diào)試,發(fā)現(xiàn)了一個讓我吐血的bug(也不算bug):
PHP實例token驗證貌似要求字符編碼格局!!!!
PHP實例官方的示例代碼,直接上傳到服務(wù)器,token直接過!
PHP實例把官方示例代碼改為UTF-8格式,再上傳籠罩,token失敗!失敗!失敗!
PHP實例后來,把本身寫的修改為ANSI格式還是token失敗!醉了醉了!那只好用官方示例代碼.在此,說下,token是一次握手驗證,驗證過一次就不用了.
PHP實例下面,言歸正傳,貌似偏題了...orz
PHP實例token驗證之后,直接用官方示例代碼,趕緊測試本身的訂閱號,結(jié)果....發(fā)出去的消息就跟潑出去的水一樣,什么鬼都沒有返回...orz
PHP實例又各種找bug,各種群問,各種搜索....歷經(jīng)本博主九九八十一的努力,終于找出了問題所在(這里是指我自己開發(fā)的,并不包含全部,如果你有不同的bug,歡迎交流):
PHP實例1、最容易被忽視的一個bug,官方給的示例代碼,壓根就沒挪用寫好的那個responseMsg()函數(shù)!
PHP實例2、把之前的token代碼注釋,也便是$wechatObj->valid();這行代碼.因為toke驗證那段代碼會有一個echo $echostr,會把responseMsg()函數(shù)里的echo $resultStr;(56行)xml格式混亂,輸回給微信服務(wù)器就無法識別了(貌似只能識別xml格式,還有json格式).(token驗證是一次握手驗證,驗證開發(fā)者之后,就可以不用了,趕緊讓它消失在我們整潔的代碼orz...)
PHP實例3、最惡心的一個bug,還是字符編碼問題!orz...xml要求UTF-8編碼,所以,把示例代碼改回UTF-8編碼!這個bug找的讓我瓦解!!!
PHP實例下面是我修改后的代碼,能正常運行,無bug,必要的可以參考一下
PHP實例
<?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編程:關(guān)于php微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的問題》是否對您有啟發(fā),歡迎查看更多與《PHP編程:關(guān)于php微信訂閱號開發(fā)之token驗證后自動發(fā)送消息給訂閱號但是沒有消息返回的問題》相關(guān)教程,學精學透。維易PHP學院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/8193.html