ホームページ  >  記事  >  バックエンド開発  >  技術フォーラムに来て、WeChat インターフェースの開発についてマスターに質問してください。

技術フォーラムに来て、WeChat インターフェースの開発についてマスターに質問してください。

WBOY
WBOYオリジナル
2016-06-23 13:51:07824ブラウズ

コードは WeChat の公式サンプルを直接使用して若干の変更を加えています
問題は、一部のメッセージが検証に合格しないことです
たとえば、メッセージを送信し、検証に合格した場合はウェルカム メッセージで返信し、検証が失敗した場合は返信しますfalse キーワード
を使用して 5 つのメッセージを送信しましたが、2 つの返信が false の場合もあれば、3 つの返信が false の場合もありました。
検証が失敗するのはなぜですか?
マスターに指導を求める

define("TOKEN", "token");$wechatObj = new wechatCallbackapiTest();//$wechatObj->valid();$wechatObj->run();class wechatCallbackapiTest{	public function valid()    {        $echoStr = $_GET["echostr"];        //valid signature , option        if($this->checkSignature()){        	echo $echoStr;        	exit;        }    }        public function run() {    	if($this->checkSignature()) {    		$this->responseMsg();    	}else{    		$this->responseMsg("false");    	}    }    public function responseMsg($contentStr = "Welcome to wechat world!")    {		//get post data, May be due to the different environments		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];      	//extract post data		if (!empty($postStr)){                              	$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>0</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()	{        $signature = $_GET["signature"];        $timestamp = $_GET["timestamp"];        $nonce = $_GET["nonce"];	        				$token = TOKEN;		$tmpArr = array($token, $timestamp, $nonce);		sort($tmpArr);		$tmpStr = implode( $tmpArr );		$tmpStr = sha1( $tmpStr );				if( $tmpStr == $signature ){			return true;		}else{			return false;		}	}}


ディスカッション (解決策) に返信する

ログを記録し、合法的に返されたすべてのデータをログに記録し、成功したログと失敗したログの違いを確認する分析する

検証パラメータ辞書が正しくソートされていません
sort($tmpArr, SORT_STRING); に変更します

追加: 成功する場合と失敗する場合があるのは、成功したためです。データはたまたま同じソート結果になります。

検証パラメータの辞書が正しくソートされていません。
sort($tmpArr, SORT_STRING); 完了しました。ありがとうございます。

認証方法は WeChat の公式例をそのままコピーしています なんて詐欺でしょう
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。