從零開始系列-Laravel編寫api服務介面:8.整合微信包-LaravelWechat的使用

lixueyuan發表於2021-05-12

LaravelWechat的使用

簡介

laravelwechat是easywechat封裝的一個包,用法比較簡單
附連結:

laravel-wechat
easy-wechat

先簡單介紹以下功能:

微信公眾號

文件: 微信公眾號

  1. 公眾號授權登入(需要配置授權目錄)
  2. 服務訊息推送(需要配置推送連結)
  3. 微信推送 (透過openid進行推送)

    安裝

    composer require "overtrue/laravel-wechat:^6.0"
    // 建立配置檔案
    php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"

    以下是用法:

// 授權登入公共方法fun_common.php
function wechat()
{
    $app = app('wechat.official_account');
    return $app;
}

// 公眾號授權登入方法(這個方法會接收一個code,授權登入配置頁面到前端,前端拿到code後訪問此介面)
public function wechatLogin(LoginRequest $request) {
    $code = $request->input('code');
    if (blank($code)){
        dd('code不能為空');
    }
    $app = wechat();
    $user  = $app->oauth->user();
    $wechat_user  = $user->getOriginal();
    // 登入邏輯。。。
}

// 微信配置伺服器地址路由到這個控制器
public function serve(Request $request)
{
    $this->wechat = wechat();
    if(isset($_GET['echostr']) && !empty($_GET['echostr'])){
        $this->wechat->server->push(function($message){
            return $message->echostr;// 第一次繫結要用這個
        });
    }else{
       $message = $server->getMessage();// 在閉包外呼叫$message
       $this->wechat->server->push(function($message){
        // $message['FromUserName'] // 使用者的 openid
        // $message['MsgType'] // 訊息型別:event, text....
            return '';// 什麼都不返回
            return 'SUCCESS';// 或者什麼都不返回
            return '你好啊'; // 或者返回文字訊息
            return new Image('media-id'); // 或者返回圖片訊息
            $news = new NewsItem(...);
            return new News([$news]); // 或者返回多圖文訊息
            // or something else
        });
    }
    //return response.
    return $this->wechat->server->serve();
}

// 微信模板訊息推送

$app->template_message->send([
        'touser' => 'user-openid',
        'template_id' => 'template-id',
        'url' => 'https://easywechat.org',
        'miniprogram' => [
                'appid' => 'xxxxxxx',
                'pagepath' => 'pages/xxx',
        ],
        'data' => [
            'key1' => 'VALUE',
            'key2' => 'VALUE2',
            ...
        ],
    ]);

微信開放平臺

簡介

微信文件官網 微信官方文件

微信開放平臺文件 微信開放平臺第三方平臺(公眾號小程式等)

// 公共方法
function platFormWithRedis($name = '')
{
    $openPlatform_with_redis = app('wechat.open_platform');
    $cache                   = new RedisAdapter(app('redis')->connection()->client());
    $openPlatform_with_redis->rebind('cache', $cache);// 原本使用檔案快取,換成laravel快取
    return $openPlatform_with_redis;
}
// 控制器class - 方法
$this->openPlatform = platFormWithRedis();
// 微信授權事件接收 測試是否授權了,其它也可以這麼用,參考公眾號事件
public function wx_post_open_platform(){
    Log::info("微信開放平臺授權事件(什麼都不做)");
    return $this->openPlatform->server->serve();
}

// 授權頁面跳轉
// 點選這個連結,掃碼後跳轉到授權頁進行授權
public function get_wx_preAuthorizationUrl(){
    $url = $this->openPlatform->getPreAuthorizationUrl('http://'.$_SERVER['SERVER_NAME'].'/api-ih/api/get_wx_pre_authorization_url/callback');
    return view("platform_get_auth",[
        'url' => $url
    ]);
}

// 就是上面那個方法的回撥地址處理授權,把一些資訊記錄到資料庫
public function get_wx_preAuthorizationUrl_callback(){
    $auth_result = $this->openPlatform->handleAuthorize();

    // 獲取掃碼授權後的回撥資料
    $data['platform_authorizer_appid'] = $auth_result['authorization_info']['authorizer_appid'];
    $data['platform_authorizer_access_token'] = $auth_result['authorization_info']['authorizer_access_token'];
    $data['platform_expires_in'] = $auth_result['authorization_info']['expires_in'];
    $data['platform_authorizer_refresh_token'] = $auth_result['authorization_info']['authorizer_refresh_token'];

    $info_result = $this->openPlatform->getAuthorizer($data['platform_authorizer_appid']);
    $data['platform_user_name'] = $info_result['authorizer_info']['user_name'];

    // 插入或者更新資料庫的授權資料,以appid為主鍵
    if (!WxPlatform::where('platform_authorizer_appid', $data['platform_authorizer_appid'])->exists()) {
        $wx_platform = new WxPlatform($data);
        $wx_platform->save();
    }else{
        WxPlatform::where('platform_authorizer_appid', $data['platform_authorizer_appid'])->update([
            'platform_authorizer_access_token'=>$data['platform_authorizer_access_token'],
            'platform_authorizer_refresh_token'=>$data['platform_authorizer_refresh_token']
        ]);
    }

    return "授權成功,關閉頁面即可";
}
// ...不解釋了$appid表示開放平臺變數有些業務在開放平臺處理(事件等)
// 這個方法很奇怪
function wechat($name = '', $appid = '')
{
    $status = env('WECHAT_OFFICIAL_ACCOUNT_USED', false);
    if ($status && $appid == '') {
        // 開啟伺服器配置
        Log::info("初始化伺服器配置");
        $name = empty($name) ? 'wechat.official_account' : 'wechat.official_account.' . $name;
        $app  = app($name);
    } else {
        // 使用開放平臺
        Log::info("初始化開放平臺");
        $openPlatform_with_redis = app('wechat.open_platform');
        $cache                   = new RedisAdapter(app('redis')->connection()->client());
        $openPlatform_with_redis->rebind('cache', $cache);// 給它一個快取(原來使用php檔案快取)
        $openPlatform  = $openPlatform_with_redis;
        $appid         = env('WECHAT_OFFICIAL_ACCOUNT_APPID', ''); // 獲取後臺繫結的公眾號
        $appid_account = WxPlatform::where('platform_authorizer_appid', $appid)->first();   // 透過appid,獲取公眾號的refresh_token
        $app           = $openPlatform->officialAccount($appid, $appid_account['platform_authorizer_refresh_token']);  // 代公眾號實現業務
    }
    return $app;
}

// 改造後的serve
public function serve(Request $request)
{
    Log::channel('wechatLog')->info('環境:'.env('DB_DATABASE')."微信事件開始執行--------");
    if($request->has('appid')){ // 開放平臺事件會攜帶這個引數。。。
        $appid = ltrim ($request->input('appid'),'/');
    }else{
        $appid = '';
    }
    if($appid == ''){
        $this->app = wechat();
    }else{
        $this->app = wechat($name = '',$appid);
    }
    if(isset($_GET['echostr']) && !empty($_GET['echostr'])){
      // 第一次繫結
      $this->wechat->push(function($message){
            return $message->echostr;
        });
    }else{
      // 處理訊息
      $this->wechat->push(function($message){
            return '';
        });
    }
    //return response.
    return $this->app->server->serve();
}

到這裡一些東西已經結束了,以後想到什麼再補充

本作品採用《CC 協議》,轉載必須註明作者和本文連結
程式設計兩年半,喜歡ctrl(唱、跳、rap、籃球)

相關文章