ホームページ >バックエンド開発 >PHPチュートリアル >技術フォーラムに来てマスターにWeChatインターフェースの開発について質問してください。

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

WBOY
WBOYオリジナル
2016-06-13 12:05:26767ブラウズ

WeChat インターフェースの開発に関して、技術フォーラムに来てアドバイスを求めてください。
コードは、公式の WeChat サンプルを直接使用して、小さな変更を加えています。
問題は、一部のメッセージが検証に合格しないことです。
たとえば、メッセージを送信しました。検証が成功した場合は、ウェルカム メッセージを返信します。検証に失敗した場合は、偽のキーワード
を送信しました。場合によっては、2 つの誤った返信がありました。場合によっては 3 件の誤った返信があったこともありました。
検証が失敗するのはなぜですか?
神に導きを求めてください

<br />define("TOKEN", "token");<br />$wechatObj = new wechatCallbackapiTest();<br />//$wechatObj->valid();<br />$wechatObj->run();<br /><br />class wechatCallbackapiTest<br />{<br />	public function valid()<br />    {<br />        $echoStr = $_GET["echostr"];<br /><br />        //valid signature , option<br />        if($this->checkSignature()){<br />        	echo $echoStr;<br />        	exit;<br />        }<br />    }<br />    <br />    public function run() {<br />    	if($this->checkSignature()) {<br />    		$this->responseMsg();<br />    	}else{<br />    		$this->responseMsg("false");<br />    	}<br />    }<br /><br />    public function responseMsg($contentStr = "Welcome to wechat world!")<br />    {<br />		//get post data, May be due to the different environments<br />		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];<br /><br />      	//extract post data<br />		if (!empty($postStr)){<br />                <br />              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);<br />                $fromUsername = $postObj->FromUserName;<br />                $toUsername = $postObj->ToUserName;<br />                $keyword = trim($postObj->Content);<br />                $time = time();<br />                $textTpl = "<xml><br />							<ToUserName><![CDATA[%s]]></ToUserName><br />							<FromUserName><![CDATA[%s]]></FromUserName><br />							<CreateTime>%s</CreateTime><br />							<MsgType><![CDATA[%s]]></MsgType><br />							<Content><![CDATA[%s]]></Content><br />							<FuncFlag>0</FuncFlag><br />							</xml>";             <br />				if(!empty( $keyword ))<br />                {<br />              		$msgType = "text";<br />                	//$contentStr = "Welcome to wechat world!";<br />                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);<br />                	echo $resultStr;<br />                }else{<br />                	echo "Input something...";<br />                }<br /><br />        }else {<br />        	echo "";<br />        	exit;<br />        }<br />    }<br />		<br />	private function checkSignature()<br />	{<br />        $signature = $_GET["signature"];<br />        $timestamp = $_GET["timestamp"];<br />        $nonce = $_GET["nonce"];	<br />        		<br />		$token = TOKEN;<br />		$tmpArr = array($token, $timestamp, $nonce);<br />		sort($tmpArr);<br />		$tmpStr = implode( $tmpArr );<br />		$tmpStr = sha1( $tmpStr );<br />		<br />		if( $tmpStr == $signature ){<br />			return true;<br />		}else{<br />			return false;<br />		}<br />	}<br />}<br />


-----解決策------ --
ログを記録し、合法的に返されたすべてのデータをログに記録し、成功したログと失敗したログの違いを分析します
-----解決策-- ------ ------------
検証パラメータの辞書が正しくソートされていません
sort($tmpArr) が sort($tmpArr, SORT_STRING) に変更されました。 >------解決策----------------------
ちょっと付け加えておきますが、あなたは成功することもあれば失敗することもあります。データは 2 つの並べ替え結果とまったく同じです。

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