Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ERROR: EasyWeChat\Core\Exceptions\InvalidArgumentException: Invalid Message type .'array #139

Closed
flutterbest opened this issue Sep 14, 2017 · 3 comments

Comments

@flutterbest
Copy link
Contributor

flutterbest commented Sep 14, 2017

本地做的端口映射,所以开发时可以直接在本地调试
本地一切正常,传到服务器之后报错,
PHP都是7.1.9 唯一不同的地方就是服务器用的https(经验证改为http还是一个吊样)
laravel-wechat:3.x
经验证是下面的代码返回了false

代码位置点我

protected function isMessage($message)
{
    if (is_array($message)) {
        foreach ($message as $element) {
            if (!is_subclass_of($element, AbstractMessage::class)) {
                return false; //这里返回了false
            }
        }

        return true;
    }

    return is_subclass_of($message, AbstractMessage::class);
}

我这边发现的出错的原因:$response返回的数组多了一层
出错原因具体看下面注释,我也找到了临时解决方案,很好奇为什么会这样??!!!代码位置点我

 protected function handleMessage(array $message)
{
    $handler = $this->messageHandler;

    if (!is_callable($handler)) {
        Log::debug('No handler enabled.');

        return null;
    }

    Log::debug('Message detail:', $message);

    $message = new Collection($message); //正常 和本地一样

    $type = $this->messageTypeMapping[$message->get('MsgType')];

    $response = null;


    if ($this->messageFilter & $type) {
        $response = call_user_func_array($handler, [$message]);
    }
     //  [$message] 正常,和本地一样
     //   $response  不正常 返回的数组比正常数组多了一层

    return $response;  //改为 return $response[0]就正常了,出错原因就是服务器上调用call_user_func_array之后返回的数组会比正常数组多一层,比如正常应该返回的是['a'],服务器却返回了[['a']],所以报错了!!!!这是为什么为什么!!!
}

====================报错日志===============
ERROR: EasyWeChat\Core\Exceptions\InvalidArgumentException: Invalid Message type .'array' in /data/wwwroot/www.baidu.com/vendor/overtrue/wechat/src/Server/Guard.php:295
Stack trace:
#0 /data/wwwroot/www.baidu.com/vendor/overtrue/wechat/src/Server/Guard.php(160): EasyWeChat\Server\Guard->buildResponse('ot0WMwL7PfX948E...', 'gh_311f691fdad5', Array)
#1 /data/wwwroot/www.baidu.com/app/Http/Controllers/Wechat/WechatController.php(89): EasyWeChat\Server\Guard->serve()
#2 [internal function]: App\Http\Controllers\Wechat\WechatController->serve()
#3 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(55): call_user_func_array(Array, Array)
#4 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(44): Illuminate\Routing\Controller->callAction('serve', Array)
#5 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Route.php(203): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\Wechat\WechatController), 'serve')
#6 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Route.php(160): Illuminate\Routing\Route->runController()
#7 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Router.php(572): Illuminate\Routing\Route->run()
#8 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing{closure}(Object(Illuminate\Http\Request))
#9 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Routing\Pipeline->Illuminate\Routing{closure}(Object(Illuminate\Http\Request))
#10 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))
#11 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))
#12 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(65): Illuminate\Routing\Pipeline->Illuminate\Routing{closure}(Object(Illuminate\Http\Request))
#13 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#14 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))
#15 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing{closure}(Object(Illuminate\Http\Request))
#16 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(148): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#17 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))
#18 /data/wwwroot/www.baidu.com/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\Routing\Pipeline->Illuminate\Routing{closure}(Object(Illuminate\Http\Request))
@

@flutterbest
Copy link
Contributor Author

@overtrue

@overtrue
Copy link
Owner

所以到目前为止你都已经确认问题在我的代码里了是吧?那为啥不解决呢?
一点你的代码都没贴

@flutterbest
Copy link
Contributor Author

flutterbest commented Sep 15, 2017

这里帖了呀 你仔细看

 return $response;  //改为 return $response[0]就正常了,出错原因就是服务器上调用call_user_func_array之后返回的数组会比正常数组多一层,比如正常应该返回的是['a'],服务器却返回了[['a']],所以报错了!!!!这是为什么为什么!!!

但是本地你的代码是正常的 ,只有服务器需要把return $response改为return $response[0]
我就是不知道原因才来这里提问的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants