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

未知的永远是最精彩的!
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

抱歉,给大家添麻烦了。
由于我的疏忽,我设置的是 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年前

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