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、调试
然后我在微信公共平台上上验证服务器配置
微信提示配置启用成功
打开公众号回复消息提示
求大佬指出我那个地方没做好,或者忽略了哪个步骤!
自我审查
1、个人认为应该是在 $this->wx->server->push() 的时候,没有返回正确的 xml格式
2、我用的是laravel 6 +,然后访问该url返回如下图。右键源代码返回的是 success,是不是返回了错误页面给了微信
已解决
抱歉,给大家添麻烦了。
由于我的疏忽,我设置的是 get 请求路由 应该使用 any
抱歉,给大家添麻烦了。
由于我的疏忽,我设置的是 get 请求路由 应该使用 any