長い間問題が発生していて、私のコードはかなり正しいと思いますが、自動的に応答できません。誰か助けてください。ありがとうございます。
コードは次のとおりです。 /p>
<?php
// トークンを定義します
定義("トークン", "微信");
$wechatObj = 新しい wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
$wechatObj->valid();
}それ以外{
$wechatObj->responseMsg();
}
クラス wechatCallbackapiTest
{
パブリック関数 valid()
{
$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 外部エンティティの挿入を防ぐためのものです。
最善の方法は、xml の有効性を自分でチェックすることです */
//libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = トリム($postObj->コンテンツ);
$time = 時間();
$textTpl = ";
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<コンテンツ><![CDATA[%s]]></コンテンツ>
<FuncFlag>0</FuncFlag>
</xml>";
if(!empty( $keyword ))
{
$msgType = "テキスト";
$contentStr = "wechat の世界へようこそ!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
エコー $resultStr;
}それ以外{
echo "何かを入力してください...";
}
}それ以外 {
エコー「」;
出口;
}
}
プライベート関数 checkSignature()
{
// TOKEN を自分で定義する必要があります
if (!define("トークン")) {
throw new Exception('TOKEN が定義されていません!');
}
$signature = $_GET["署名"];
$タイムスタンプ = $_GET["タイムスタンプ"];
$nonce = $_GET["nonce"];
$トークン = トークン;
$tmpArr = 配列($token, $timestamp, $nonce);
// SORT_STRING ルールを使用する
ソート($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
true を返します。
}それ以外{
false を返します。
}
}
}
?>
高洛峰2017-05-16 13:07:00
simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA) を使用して $postStr を解析してみてください
また、このフォロー返信を $keyword の前に追加してみてください