laravel结合easyWeChat的使用
工欲善其事必先利其器
框架要求
Laravel>= 5.1安装
Laravel < 5.8
composer require “overtrue/laravel-wechat:~4.0”
Laravel >= 5.8
composer require “overtrue/laravel-wechat:~5.0”
配置
Laravel 应用
1.在 config/app.php 注册 ServiceProvider 和 Facade (Laravel 5.5 + 无需手动注册)
'providers' => [
// ...
Overtrue\LaravelWeChat\ServiceProvider::class,
],
'aliases' => [
// ...
'EasyWeChat' => Overtrue\LaravelWeChat\Facade::class, ],
2.创建配置文件:
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"
3.修改应用根目录下的 config/wechat.php 中对应的参数即可。
4.每个模块基本都支持多账号,默认为 default。
使用
在中间件 App\Http\Middleware\VerifyCsrfToken 排除微信相关的路由,如:
protected $except = [
// ...
'wechat',
];
下面以接收普通消息为例写一个例子:
假设您的域名为 overtrue.me 那么请登录微信公众平台 “开发者中心” 修改 “URL(服务器配置)” 为: http://overtrue.me/wechat。
路由:
Route::any('/wechat', 'WeChatController@serve');
注意:一定是 Route::any, 因为微信服务端认证的时候是 GET, 接收用户消息时是 POST !
注意:在laravel中有token验证,所以有两种方法
1.在将csrf验证关闭(不安全,不推荐) 详情:http://www.cnblogs.com/HD/p/4555369.html
2.我们在项目中使用:
在中间件VerifyCsrfToken.php中修改内容为:
protected function tokensMatch($request)
{
// If request is an ajax request, then check to see if token matches token provider in
// the header. This way, we can use CSRF protection in ajax requests also.
$token = $request->ajax() ? $request->header('X-CSRF-TOKEN') : $request->input('_token');
return $request->session()->token() == $token;
}
public function handle($request,\Closure $next){
//todo:需要在添加了登录验证之后,取消
if($request->method() == 'POST')
{
return $next($request);
}
return parent::handle($request,$next); }
然后在vue中的bootstrap.js中的引入axios中添加
window.axios.defaults.headers.common = {
'X-CSRF-TOKEN': document.querySelector('meta[name="X-CSRF-TOKEN"]').content,
'X-Requested-With': 'XMLHttpRequest'
};
在index.blade.php中添加
<meta name="X-CSRF-TOKEN" content="{{csrf_token()}}">
关于laravel 的 csrf token的更多详情,请看:http://www.cnblogs.com/zhuchenglin/p/7723997.html
以上基本可以配置完成,主要在于laravel的token验证。
创建控制器 WeChatController:
<?php
namespace App\Http\Controllers;
use Log;
class WeChatController extends Controller
{
/**
* 处理微信的请求消息
*
* @return string
*/
public function serve()
{
Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志
$app = app('wechat.official_account');
$app->server->push(function($message){
return "欢迎关注 overtrue!";
});
return $app->server->serve();
}
}
然后将这个代码上传到云服务器(注:服务器一定要在公网中(或通过某种工具使自己的电脑映射到公网上),否则微信无法验证)
默认配置好虚拟主机,(必须用80端口(http://)/443端口(https://)),指向:项目名/public
然后打开微信公众号后台(我用测试账号来说明问题,如果是真正的服务号的话,要开启开发者模式)
填写的url要能找到你那个控制器中的serve()方法
Token要和上面的配置文件中填写的一样
如果按照上面的步骤一步一步来的话,应该可以保存成功(即初步验证成功)