天天看點

LARAVEL 釘釘部門等對接,自動與同步内容。

在過去的内容中我們實作了 訂閱消息,機器人回複,機器人發送單聊消息,發送群聊消息。

https://developer.aliyun.com/article/808802

這裡我們看看怎麼實作具體的基礎資料如何同步。

(所有涉及到的函數 方法都在

https://gitee.com/chinakaiyuan/laravelgrid

這裡開源出來了)

這裡涉及到LARAVEL的 内容有

1、Observers

一、Observers  我們稱之模型觀察者

這個是用來監聽model的,監聽增删改

具體内容我們可以去百度下觀察者 的實作方式,我們這裡就用用

1、新增一個模型 baseModel。用來作為我們其他模型的父類

php artisan make:model baseModel

2、新增一個觀察者 BaseModelObserver 監聽模型

php artisan make:observer BaseModelObserver

3、在baseModel 中 注冊這個觀察者

use App\Observers\BaseModelObserver;

public static function boot()

    {

        parent::boot();

        self::observe(BaseModelObserver::class);

    }

4、在BaseModelObserver 中新增一些必要的方法:

   public function creating($model)

        if (method_exists($model, '_creating'))

            return   $model->_creating($model);

    public function deleting($model)

        if (method_exists($model, '_deleting'))

            return  $model->_deleting($model);

}

  public function updating($model)

        if (method_exists($model, '_updating'))

            return   $model->_updating($model);

這樣baseModel 及其子類 在增删改 時,如果模型中有 _creating 或者_deleting等等方法時,就會調用。

下面就是用對應的釘釘SDK 去同步資料 這裡用到的是

https://gitee.com/chinakaiyuan/dingtalk

1、配置說明

 [

 */

    'corp_id' => 'XXXXXX',

    /*

    |-----------------------------------------------------------

    | 【選填】背景免登配置資訊 釘釘配置項目

    | 如果你用到應用管理背景免登功能,需要配置該項

    */

    'sso_secret' => 'XXXXXX',

    //以下是預設app配置 非必填,沒設定app 時預設用此配置,

    "agentid" => "XXXXXX",

    "app_key" => "XXXXXX",

    "app_secret" => "XXXXXX",

    //小程式配置項目

    "miniappid"=>"xxxxxx",

    //H5,小程式 訂閱配置項目

    "aes_key" => "XXXXXX",

"token" => "XXXXXX",

 //登入成功回調位址

"redirect" => "XXXXXX",

    'app'=>[

        'robot01'=>[

              //以下三個是 H5,小程式,機器人公有項

                'kind'=>'robot',//必填 app/robot

                "agentid" => "XXXXXX",

                "app_key" => "XXXXXX",

                "app_secret" => "XXXXXX",

                //小程式配置項目

                "miniappid"=>"xxxxxx",

                //H5,小程式 訂閱配置項目

                "aes_key" => "XXXXXX",

                "token" => "XXXXXX",

        ]

]

這裡把H5,小程式,機器人 都統稱為app

在laravel 中,我們定義了兩個表,一個setting表儲存釘釘corp_id和sso_secret等等.一個app表儲存對應新增的app配置。然後

1、注冊服務提供者

php  artisan make:provider DingTalkServiceProvider

修改register函數:

public function register()

        //

        $this->app->singleton('DT', function ($app) {

            $config = DingTalkSetting::first();

            $defaultAppConfig =  DingTalkApp::get();

            $ddApp = new Application(array_merge($config->toArray(), $defaultAppConfig->toArray()));

            //設定緩存驅動。。。非必要

            $ddApp->access_token->setCache($config);

            //設定日志驅動。。。非必要

            $ddApp->logger->set($config);

            return $ddApp;

        });

2、調用方式:

App(‘DT’)->robot01

3、部門同步方式

在我們LARAVEL中建立 繼承于baseModel的部門模型 ,并新增3個函數

建立部門時

public function _creating(&$model)

{

 //這裡用的是預設app配置,如果用指定app :

     //app("DT")->[app]->department->create($data);

        $dept = app("DT")->department->create($data);

        if ($dept['errcode'] == 0)

            $model['dept_id'] = $dept['result']['dept_id'];

        else

            【報錯】;

更新部門時

    public function _updating(&$model)

        $dept = app("DT")->department->update($model->dept_id, $data);

        if ($dept['errcode'] > 0)

             【報錯】;

    删除部門時

public function _deleting(&$model)

        $dept = app("DT")->department->delete($model->dept_id);

這樣就保證了本地部門更新 和釘釘中部門保持一緻

同樣的,如果要同步使用者,就要在使用者模型中新增這幾個函數,修改裡面對應的方法。

另外我們實作下釘釘自動登入。

在預設的Authenticate 中間件中,重新redirectTo 函數 ,例:

    protected function redirectTo($request)

        if (!$request->expectsJson()) {

            if (strpos($request->header('User-Agent'), "DingTalk") !== false) {

                foreach (app("DT")->config->app_url as $v) {

                     return 【免登入跳轉位址】;

                }

            } else

                return route('login');

        }

意思是如果沒有登入,并且header 中識别出事釘釘浏覽器打開的,就跳轉免登入位址

對應的 【免登入跳轉位址】  新增對應方法  。這裡我把登入跳轉位址和授權回調位址都指向oauth函數,由get(‘code’),判斷是否傳遞code 。

    p​public function oauth()

$server=app("DT");

        if (get("code")) {

            $user = $server->user();

            return  $this->LoginUserByUnionId($server, $user['user_info']['unionid']);

        } else

            return  $server->redirect();

    protected function LoginUserByUnionId($server, $unionid)

        $user = $server->user->getUseridByUnionid($unionid);

        if (!is_null($user = User::where(['userid' => $user['userid']])->first())) {

            \Auth::login($user, false);

            return  redirect("/home");

        return redirect("/login");

這樣就實作了,如果打開任意需要授權的頁面,如果是正常浏覽器打開,就跳轉登入頁面。

如果是訂單内部打開,就跳轉到授權頁面,自動授權,自動登入。

部門同步執行個體截圖:

LARAVEL 釘釘部門等對接,自動與同步内容。

設定完成訂單配置後,點選同步部門使用者

LARAVEL 釘釘部門等對接,自動與同步内容。

對應的使用者管理界面會從釘釘中自動更新部門和使用者。然後在此界面更新部門,會自動同步到釘釘中取。

總結下我們說了啥。

1、LARAVEL 中做個模型監聽

2、配置下釘釘SDK

3、新增三個函數,保證增删改同步

4、中間件中修改原跳轉方式,實作自動免登入