1. 程式人生 > >Laravel5.6 結合 EasyWechat4.0實現與微信對接

Laravel5.6 結合 EasyWechat4.0實現與微信對接

一、微信授權登入
1、 當微信選單管理功能完成後,把專案部署上線。此處省略。。。
2、 在.env檔案中配置token。

 WECHAT_OFFICIAL_ACCOUNT_TOKEN=mi//自定義

3、 在api.php中配置微信介面路由,程式碼如下:

Route::namespace('Wechat')->group(function(){
    $this->any('/wechat', '[email protected]');
});

4、 參考EasyWechat官網,https://github.com/overtrue/laravel-wechat

在 app/Http/Kernel.php 中新增路由中介軟體:

protected $routeMiddleware = [
    'wechat.oauth' => \Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class,
];

5、 在前端路由中新增此中介軟體:

Route::namespace('Wechat')->middleware('wechat.oauth', 'wechat')->group(function () {
    require 'wechat/shop.php';
});

6、 在Wechat控制器的serve方法中設定關注微信測試號,自動回覆訊息。程式碼如下:

$app = app('wechat.official_account');
$app->server->push(function($message){
   if($message['MsgType'] == 'event'){
        switch($message['Event']){
            case 'subscribe':
                return '歡迎關注';
                break;
        }
   }
});
return $app->server->serve();

7、這裡以微信測試號為例,開啟微信公眾號測試平臺,填寫介面配置資訊,配置介面地址和token,點選提交,配置成功即可。這時在瀏覽器中訪問域名顯示“請從微信端開啟”,即為配置成功。
8、後臺微信選單管理設定選單並填寫選單地址。
9、開啟config/Wechat.php裡面的OAuth配置。
10、在微信測試號頁面找到 網頁授權獲取使用者基本資訊,修改裡面的地址,如:wechat.holyzq.com(any路由地址)
11、下載並安裝微信開發者工具,後期所有除錯在此工具中進行。

測試:開啟微信,掃描二維碼,看到“歡迎關注”即為成功。

二、獲取微信使用者資訊
1、在app\Http\Middleware\Wechat.php中,獲取使用者資訊並存入/更新資料庫,程式碼如下:

$original = session('wechat.oauth_user.default.original');
if (!$original) {
   return $next($request);
}
$openid = $original['openid'];
$customer = Customer::where('openid', $openid)->first();
if ($customer) {
   $customer->update($original);
} else {
   Customer::create($original);
}
session(['wechat.customer' => $customer]);
return $next($request);

2、 Customer模型中設定黑名單排除資料庫中沒有的欄位(有時候有也需要排除掉)

protected $guarded = ['privilege'];

3、 在首頁控制器中列印使用者SESSION資訊:return session()->all();,訪問首頁,看到使用者資訊即為成功。

三、微信自動回覆訊息
首先閱讀easywechat文件訊息一節:https://www.easywechat.com/docs/master/zh-CN/official-account/messages,把回覆訊息的模板格式搞清楚。

然後,我們就可以開始著手寫程式碼了,程式碼參考如下:

use EasyWeChat\Kernel\Messages\News;
use EasyWeChat\Kernel\Messages\NewsItem;

public function serve()
{
    $app = app('wechat.official_account');
    $app->server->push(function ($message) {
        if ($message['MsgType'] == 'event') {
            switch ($message['Event']) {
                case 'subscribe': //設定關注事件型別
                    return '歡迎關注'; //回覆關注提示語
                    break;

                //點選事件
                case 'CLICK':
                    switch ($message['EventKey']) {
                        case 'recommend':
                            return $this->is_recommend();
                            break;
                    }
                    break;
            }
        }

        //文字訊息
        if ($message['MsgType'] == 'text') {
            switch ($message['Content']) {
                case '精選':
                case '推薦':
                case '精選推薦':
                case 'recommend':
                    return $this->is_recommend();
                    break;

                default:
                    return $this->default_msg();
            }
        }

        //語音訊息
        if ($message['MsgType'] == 'voice') {
            switch ($message['Recognition']) {
                case '精選。':
                case '推薦。':
                case '精選推薦。':
                    return $this->is_recommend();
                    break;

                default:
                    return '您說的是:' . $message->Recognition . '?';
            }
        }
    });
    return $app->server->serve();
}

/**
 * 精選推薦
 * @return array
 */
private function is_recommend()
{
    $products = Product::where('is_recommend', 1)
        ->orderBy('created_at')
        ->take(6)
        ->get();

      //拼接自動回覆的訊息模板
    $news = [];
    foreach ($products as $p) {
        $items = [
            new NewsItem([
                'title' => $p->name,
                'description' => $p->description,
                'url' => 'http://wqqshop.holyzq.com' . '/product/' . $p->id,
                'image' => $p->image ? $p->image : '',
            ]),
        ];
        $news = new News($items);
    }
    return $news;
}


/**
 * 預設訊息
 * @return string
 */
function default_msg()
{
    return '有趣的問題~';
}