오랜 시간 동안 문제가 발생했습니다. 내 코드는 꽤 정확한 것 같은데 자동으로 응답할 수 없습니다. 누군가 도와주실 수 있나요? 정말 감사합니다.
코드는 다음과 같습니다. /p>
<코드><?php //토큰 정의 정의("토큰", "웨이신"); $wechatObj = 새로운 wechatCallbackapiTest(); if (isset($_GET['echostr'])) { $wechatObj->유효(); }또 다른{ $wechatObj->responseMsg(); } wechatCallbackapiTest 클래스 { 공개 함수 유효() { $echoStr = $_GET["echostr"]; //유효한 서명, 옵션 if($this->checkSignature()){ 에코 $echoStr; 출구; } } 공개 함수 responseMsg() { //포스트 데이터를 가져옵니다. 환경이 다르기 때문일 수 있습니다. //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postStr = file_get_contents("php://input"); //게시물 데이터 추출 if (!empty($postStr)){ /* libxml_disable_entity_loader는 XML eXternal Entity 주입을 방지하기 위한 것입니다. 가장 좋은 방법은 XML의 유효성을 직접 확인하는 것입니다 */ //libxml_disable_entity_loader(true); $postObj = simplexml_load_string($postStr); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = 트림($postObj->콘텐츠); $시간 = 시간(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <콘텐츠><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty( $keyword )) { $msgType = "텍스트"; $contentStr = "위챗 세상에 오신 것을 환영합니다!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 에코 $resultStr; }또 다른{ echo "뭔가를 입력하세요..."; } }또 다른 { 에코 ""; 출구; } } 개인 함수 checkSignature() { // TOKEN을 직접 정의해야 합니다. if (!defined("토큰")) { throw new Exception('TOKEN이 정의되지 않았습니다!'); } $signature = $_GET["서명"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $토큰 = 토큰; $tmpArr = array($token, $timestamp, $nonce); // SORT_STRING 규칙을 사용합니다. 정렬($tmpArr, SORT_STRING); $tmpStr = 파열( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ 사실을 반환; }또 다른{ 거짓을 반환; } } } ?>
高洛峰2017-05-16 13:07:00
simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA)을 사용하여 $postStr을 구문 분석해 보세요
또한 $keyword 앞에 다음 응답을 추가해 보세요