在过去的内容中我们实现了 订阅消息,机器人回复,机器人发送单聊消息,发送群聊消息。
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");
}
这样就实现了,如果打开任意需要授权的页面,如果是正常浏览器打开,就跳转登录页面。
如果是订单内部打开,就跳转到授权页面,自动授权,自动登录。
部门同步实例截图:
设置完成订单配置后,点击同步部门用户
对应的用户管理界面会从钉钉中自动更新部门和用户。然后在此界面更新部门,会自动同步到钉钉中取。
总结下我们说了啥。
1、LARAVEL 中做个模型监听
2、配置下钉钉SDK
3、新增三个函数,保证增删改同步
4、中间件中修改原跳转方式,实现自动免登录