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 />