北京志远天辰科技有限公司-旗下
首页 » 产品教程 » LARAVEL 钉钉部门等对接,自动与同步内容。

LARAVEL 钉钉部门等对接,自动与同步内容。

作者:钉钉硬件分类: 产品教程 时间:2021-12-9 17:19浏览:783次

在过去的内容中我们实现了 订阅消息,机器人回复,机器人发送单聊消息,发送群聊消息。

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",

 //登录成功回调地址

"redirect" => "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);

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

            【报错】;

   }

 

这样就保证了本地部门更新 和钉钉中部门保持一致

同样的,如果要同步用户,就要在用户模型中新增这几个函数,修改里面对应的方法。


另外我们实现下钉钉自动登录。

在默认的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 。

   ppublic 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");

   }

 

 

 

这样就实现了,如果打开任意需要授权的页面,如果是正常浏览器打开,就跳转登录页面。

如果是订单内部打开,就跳转到授权页面,自动授权,自动登录。

部门同步实例截图:

image.png

设置完成订单配置后,点击同步部门用户

image.png

对应的用户管理界面会从钉钉中自动更新部门和用户。然后在此界面更新部门,会自动同步到钉钉中取。

 

总结下我们说了啥。

1、LARAVEL 中做个模型监听

2、配置下钉钉SDK

3、新增三个函数,保证增删改同步

4、中间件中修改原跳转方式,实现自动免登录