laravel使用easywechat手把手
2019-05-11 本文已影响0人
空气KQ
安装插件
# Laravel < 5.8
composer require "overtrue/laravel-wechat:~4.0"
# Laravel >= 5.8
composer require "overtrue/laravel-wechat:~5.0"
push配置
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"
增加.env配置公众号设置
WECHAT_OFFICIAL_ACCOUNT_APPID=wx78ae5bb2XXXX
WECHAT_OFFICIAL_ACCOUNT_SECRET=214f1ce332XXXX
WECHAT_OFFICIAL_ACCOUNT_TOKEN=yishXXX
WECHAT_OFFICIAL_ACCOUNT_AES_KEY=6lwDoXXXXXFDFEEEEEEEEE
过滤CSRF
比如你的配置访问地址是
http://www.heibaiketang.com/api/weixin/server
那么就需要配置VerifyCsrfToken.php文件如下
api/weixin/*
定义路由
一定要定义get,post,因为他们验证get,post消息
Route::any('api/weixin/server', 'WeiXinController@server')->name('server');
简单例子
<?php
namespace App\Http\Controllers\Api;
use App\Services\weixin\ImageMessageHandler;
use App\Services\weixin\TextMessageHandler;
use EasyWeChat\Kernel\Messages\Message;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Log;
use EasyWeChat\Factory;
class WeiXinController extends BaseController
{
//微信接口服务
//https://www.yishanseo.com/api/h5/weixin/server?echostr=1410480958785089387&nonce=134704537&signature=7e6f50565319edc86585d06df0fb8539df46f305×tamp=1557556841
public function server()
{
Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志
$config = config('wechat.official_account.default');
$app = Factory::officialAccount($config);
$app->server->push(function ($message) {
// $message['FromUserName'] // 用户的 openid
// $message['MsgType'] // 消息类型:event, text....
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 = $app->server->serve();
return $response;
}
}
上面为SDK写法,laravel写法还可以这样
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();
}
这样就搞定了。
其他写法
$officialAccount = EasyWeChat::officialAccount(); // 公众号
$work = EasyWeChat::work(); // 企业微信
$payment = EasyWeChat::payment(); // 微信支付
$openPlatform = EasyWeChat::openPlatform(); // 开放平台
$miniProgram = EasyWeChat::miniProgram(); // 小程序
// 均支持传入配置账号名称
EasyWeChat::officialAccount('foo'); // `foo` 为配置文件中的名称,默认为 `default`
//...
如果你有多个公众号,需要单独分开。那么修改下刚才那个配置引入
第一种是$config修改就可以切换不同的公众号
第二种就设置officialAccount(配置名字)
把用户发过来消息服务单独文件出来
比如我现在要单独文本和图片
public function server()
{
Log::info('request arrived.'); # 注意:Log 为 Laravel 组件,所以它记的日志去 Laravel 日志看,而不是 EasyWeChat 日志
$config = config('wechat.official_account.default');
$app = Factory::officialAccount($config);
$app->server->push(ImageMessageHandler::class, Message::IMAGE); // 图片消息
$app->server->push(TextMessageHandler::class, Message::TEXT); // 文本消息
$response = $app->server->serve();
return $response;
}
文本
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/5/11
* Time: 14:56
*/
namespace App\Services\weixin;
use \EasyWeChat\Kernel\Contracts\EventHandlerInterface;
class TextMessageHandler implements EventHandlerInterface
{
public $message;
public function handle($payload = null)
{
$this->message=$payload;
// TODO: Implement handle() method.
return $this->message['Content'].'TXT消息';
}
}
以上所有的单独文件需要继承 \EasyWeChat\Kernel\Contracts\EventHandlerInterface;这个接口。
实现方法handle(payload表示传递过来的对象消息。
每个消息必须返回的消息有
ToUserName 接收方帐号(该公众号 ID)
FromUserName 发送方帐号(OpenID, 代表用户的唯一标识)
CreateTime 消息创建时间(时间戳)
MsgId 消息 ID(64位整型)
其他查看这个文档
https://www.easywechat.com/docs/4.1/official-account/server