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

简介: laravel 中使用自定义SDK,实现基础业务数据与钉钉同步

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

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、中间件中修改原跳转方式,实现自动免登录

目录
相关文章
|
6月前
|
机器人 API
Eolink神技之三、钉钉API对接
Eolink神技之三、钉钉API对接
99 0
|
安全 机器人 Python
python之钉钉机器人自动发消息——傻瓜式教程
自动化跑完的结果,需要自动发送到钉钉群,自动将数据、报告、截图等保存至公司内部服务器,钉钉通知的时候,需要有个链接,点击就可以跳转。
2776 0
python之钉钉机器人自动发消息——傻瓜式教程
|
1月前
|
人工智能 安全 机器人
Dify开发Agent对接钉钉机器人
这篇文章详细讲解了如何在Dify平台上开发一个Agent并与钉钉机器人集成,实现自动化消息处理和响应功能。
146 0
|
6月前
|
XML 移动开发 前端开发
基于若依的ruoyi-nbcio流程管理系统里修正仿钉钉流程部门主管与多实例转xml的bug
基于若依的ruoyi-nbcio流程管理系统里修正仿钉钉流程部门主管与多实例转xml的bug
44 1
|
6月前
|
移动开发 监控 前端开发
作为部门的前端“独苗”,我的钉钉全栈化实践总结
作为前端总会在业务上面临资源、效率等问题,本文讲述如何发挥专业前端在特殊位置的价值,让整个人力的利用效率最大化,并且可以通过实践将这套方法论贡献给有需要的团队去复用实践!
|
6月前
|
Dubbo NoSQL Java
阿里(钉钉部门)远程面,三面坐上“直通车”,拿下offer没问题
本人毕业于华南地区某不知名211院校,Java方向,目前钉钉三面已经结束,基本可以说是坐上了“直通车”,收到的反馈都是比较好的,跟HR沟通感觉希望很大,按道理来说拿下offer是没有太大问题的,以下内容就是我这次的钉钉远程面试经历的一个分享和一些心得,希望对大家能够有所帮助。
|
11月前
|
安全 机器人
钉钉机器人对接
钉钉机器人对接
153 1
钉钉中,审批流程是可以与其他系统进行接口对接的
钉钉中,审批流程是可以与其他系统进行接口对接的
680 2
|
小程序 PHP
获取钉钉小程序中用户的部门信息
获取钉钉小程序中用户的部门信息
327 0
|
Shell 开发工具 数据安全/隐私保护
Git提交之后自动打版本并钉钉通知
Git提交之后自动打版本并钉钉通知
458 0
Git提交之后自动打版本并钉钉通知