質問: 認定サブスクリプション アカウントを申請し、サーバー構成を有効にし、URL 検証に合格したと仮定します。しかし、私は WeChat を使用してこのサブスクリプション アカウントをフォローし、メッセージを送信しようとしました。理論的には、WeChat サーバーは、openid を含むユーザーの情報を URL に送信する必要があります。しかし、実際には、URL には何も情報がありませんでした。開発したことのある人にアドバイスをいただけないでしょうか。
私の URL のコード:
traceHttp();define("TOKEN", "4321");$access_token = '1234';$wechatObj = new wechatCallbackapiTest();if (isset($_GET['echostr'])) { $wechatObj->valid();}else{ $wechatObj->responseMsg();}class wechatCallbackapiTest{ public function valid() { $echoStr = $_GET["echostr"]; if($this->checkSignature()){ echo $echoStr; 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; } } public function responseMsg() { $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; ob_start(); var_dump($_REQUEST); $a = ob_get_clean(); file_put_contents('1.xml', $a, FILE_APPEND); 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($keyword == "?" || $keyword == "?") { $msgType = "text"; $contentStr = date("Y-m-d H:i:s",time()); $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);// echo $resultStr; file_put_contents('1.xml', $resultStr, FILE_APPEND); } }else{ echo ""; exit; } }}function traceHttp(){ logger("\n\nREMOTE_ADDR:".$_SERVER["REMOTE_ADDR"].(strstr($_SERVER["REMOTE_ADDR"],'101.226')? " FROM WeiXin": "Unknown IP")); logger("QUERY_STRING:".$_SERVER["QUERY_STRING"]);}function logger($log_content){ if(isset($_SERVER['HTTP_APPNAME'])){ //SAE sae_set_display_errors(false); sae_debug($log_content); sae_set_display_errors(true); }else{ //LOCAL $max_size = 500000; $log_filename = "log.xml"; if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);} file_put_contents($log_filename, date('Y-m-d H:i:s').' '.$log_content."\r\n", FILE_APPEND); }}
ディスカッションへの返信 (解決策)
Tencent WeChat 開発 技術的な相談はありますか?プログラムのルールは彼らにカスタマイズされています。
サーバーに設定されているメッセージの暗号化と復号化の方法を確認してください。
プログラムは次の文をコメントアウトします。 : ob_start();
var_dump($_REQUEST);
$a = ob_get_clean(); file_put_contents('1.xml', $a, FILE_APPEND); 次に、疑問符 (?) を公式アカウントに送信してみてください。
問題は解決しました、5階で言及された問題です。使用できません
ob_start();
var_dump($_REQUEST);
$a = ob_get_clean();