easywechat 公众号服务端配置完成后,公众号内回复一直提示 “公众号服务出现故障”

版本信息

PHP 版本: 7.2+
Laravel 版本:6.6.1
easywechat 版本: 4.0

我的操作步骤

1、通过 官网指示安装 composer 扩展包

2、配置 config.php

<?php

return [
    /**
     * 账号基本信息,请从微信公众平台/开放平台获取
     */
    'app_id'  => env('WX_CHAT_APP_ID', 'appid'),               // AppID
    'secret'  => env('WX_CHAT_SECRET', 'secret'), // AppSecret
    'token'   => env('WX_CHAT_TOKEN', 'token'),                       // Token
    'aes_key' => env('WX_CHAT_AES_KET', 'aes_key'),                    // EncodingAESKey,兼容与安全模式下请一定要填写!!!

    /**
     * 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
     * 使用自定义类名时,构造函数将会接收一个 `EasyWeChat\Kernel\Http\Response` 实例
     */
    'response_type' => 'array',

    /**
     * 日志配置
     *
     * level: 日志级别, 可选为:
     *         debug/info/notice/warning/error/critical/alert/emergency
     * path:日志文件位置(绝对路径!!!),要求可写权限
     */
    'log' => [
        'default' => 'dev', // 默认使用的 channel,生产环境可以改为下面的 prod
        'channels' => [
            // 测试环境
            'dev' => [
                'driver' => 'single',
                'path' => '/tmp/easywechat.log',
                'level' => 'debug',
            ],
            // 生产环境
            'prod' => [
                'driver' => 'daily',
                'path' => '/tmp/easywechat.log',
                'level' => 'info',
            ],
        ],
    ],

    /**
     * 接口请求相关配置,超时时间等,具体可用参数请参考:
     * http://docs.guzzlephp.org/en/stable/request-config.html
     *
     * - retries: 重试次数,默认 1,指定当 http 请求失败时重试的次数。
     * - retry_delay: 重试延迟间隔(单位:ms),默认 500
     * - log_template: 指定 HTTP 日志模板,请参考:https://github.com/guzzle/guzzle/blob/master/src/MessageFormatter.php
     */
    'http' => [
        'max_retries' => 1,
        'retry_delay' => 500,
        'timeout' => 5.0,
        // 'base_uri' => 'https://api.weixin.qq.com/', // 如果你在国外想要覆盖默认的 url 的时候才使用,根据不同的模块配置不同的 uri
    ],

    /**
     * OAuth 配置
     *
     * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
     * callback:OAuth授权完成后的回调页地址
     */
    'oauth' => [
        'scopes'   => ['snsapi_userinfo'],
        'callback' => '/examples/oauth_callback.php',
    ],
];

3、控制器调用
我做了一个公共加载的类 BootController.php

<?php

namespace App\WxPublic\Controllers;

use App\Http\Controllers\Controller;

use EasyWeChat\Factory;

class BootController extends Controller
{
    protected $wx;
    protected $config;

    public function __construct()
    {
        $this->config = config('easy_wechat');

        $this->wx = Factory::officialAccount($this->config);
    }
}

然后其他文件进行继承

<?php

namespace App\WxPublic\Controllers;

class ServerController extends BootController
{
    /**
     * 微信消息服务配置
     *
     * @return \Symfony\Component\HttpFoundation\Response
     * @throws \EasyWeChat\Kernel\Exceptions\BadRequestException
     * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
     * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
     * @throws \ReflectionException
     */
    public function index()
    {
        $this->wx->server->push(function ($message) {
            switch ($message[ 'MsgType' ]) {
                case 'event':
                    return '收到事件消息';
                    break;
                case 'text':
                    return '收到文字消息';
                    break;
                case 'image':
                    return '收到图片消息';
                    break;
                case 'voice':
                    return '收到语音消息';
                    break;
                case 'video':
                    return '收到视频消息';
                    break;
                case 'location':
                    return '收到坐标消息';
                    break;
                case 'link':
                    return '收到链接消息';
                    break;
                case 'file':
                    return '收到文件消息';
                // ... 其它消息
                default:
                    return '收到其它消息';
                    break;
            }
        });

        $response = $this->wx->server->serve();

        return $response;
    }
}

4、将微信服务端的路由,添加 到 CSRF 验证忽略名单

<?php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;

class VerifyCsrfToken extends Middleware
{
    /**
     * Indicates whether the XSRF-TOKEN cookie should be set on the response.
     *
     * @var bool
     */
    protected $addHttpCookie = true;

    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        // 我启用了nginx 代理,所以 v2.3 为当前的根目录
        'v2.3', 
        'v2.3/*'
    ];
}

5、调试
然后我在微信公共平台上上验证服务器配置
easywechat 公众号服务端配置完成后,公众号内回复一直提示 “公众号服务出现故障”

微信提示配置启用成功

打开公众号回复消息提示

easywechat 公众号服务端配置完成后,公众号内回复一直提示 “公众号服务出现故障”

求大佬指出我那个地方没做好,或者忽略了哪个步骤!

自我审查

1、个人认为应该是在 $this->wx->server->push() 的时候,没有返回正确的 xml格式

2、我用的是laravel 6 +,然后访问该url返回如下图。右键源代码返回的是 success,是不是返回了错误页面给了微信
easywechat 公众号服务端配置完成后,公众号内回复一直提示 “公众号服务出现故障”

easywechat 公众号服务端配置完成后,公众号内回复一直提示 “公众号服务出现故障”

已解决

抱歉,给大家添麻烦了。
由于我的疏忽,我设置的是 get 请求路由 应该使用 any

未知的永远是最精彩的!
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

抱歉,给大家添麻烦了。
由于我的疏忽,我设置的是 get 请求路由 应该使用 any

4年前 评论
代码笔记 3年前
讨论数量: 4
野犭

有个容易忽略的地方,你看下服务器文件的权限和运行的权限一不一致,服务器用 www 或者 www-data 运行的话文件权限不能 root 哦

TNND,记得有次也是各项配置都没问题,然后提示服务故障,改了下文件权限就好了,低级错误,给自己两嘴巴子

4年前 评论
看上隔壁小花了啦 (楼主) 4年前
野犭 (作者) 4年前

CSRF 加例外,你肯定死这里了。

4年前 评论

抱歉,给大家添麻烦了。
由于我的疏忽,我设置的是 get 请求路由 应该使用 any

4年前 评论
代码笔记 3年前

我都快哭了,结果我也是用了get :joy:
却是,csrf ,路由 都正确还是老样子,公众号服务出现故障

4年前 评论
看上隔壁小花了啦 (楼主) 4年前
ilham (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!