Невозможно получить file_get_contents (‘php: // input’) в контроллере laravel 5.5

Я пытаюсь сделать wechat API-интеграции. Поместив файл в общую папку, он работает. Вот мой код

<?php
traceHttp();

define('TOKEN', 'xxxxx');
$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(){
//get post data, May be due to the different environments
$postStr = file_get_contents('php://input');

//if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
//libxml_disable_entity_loader(true);

$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);


switch($postObj->MsgType){
case "event":
$this->_doEvent($postObj);
break;
case "text":
$this->_doText($postObj);
break;
case "image":
$this->_doImage($postObj);
break;
case "voice":
$this->_doVoice($postObj);
break;
case "music":
$this->_doMusic($postObj);
break;
case "location":
$this->_doLocation($postObj);
break;
default:
break;
}

}

Теперь я хочу создать всю эту функцию внутри контроллера. Но я получаю пустое значение для file_get_contents('php://input'), Я даже пытаюсь использовать $request->getContent() & $request->all() и оба возвращают пустое значение.

Кто-нибудь может посоветовать мне, в чем проблема? Я застрял в этой проблеме на весь день, и я действительно ценю любую помощь. Спасибо

Ниже приведен мой код контроллера Laravel:

public function authenticate(Request $request) {
$token = 'xxxxxx';
define("TOKEN", $token);
if(isset($_GET['echostr'])) {
$this->valid();
} else {
$content = $request->all();
}
}

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;
}
}

-1

Решение

Оказывается, для проверки wechat api будет использовать GET-запрос, но для отправки msg будет использовать POST-запрос.

Так как мой маршрут route.php — только Route :: get, так что мой $request->getContent() вернуть пустое.

Так что вместо Route::get('/wechat-api', 'WController@verify');

Я меняю на Route::any('/wechat-api', 'WController@verify');

После внесения изменений, $request->getContent() наконец-то больше не пусто.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]