laravel使用easywechat手把手

安装插件

# 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&timestamp=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

(0)

相关推荐