在過去的内容中我們實作了 訂閱消息,機器人回複,機器人發送單聊消息,發送群聊消息。
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/dingtalk1、配置說明
[
*/
'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 。
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、中間件中修改原跳轉方式,實作自動免登入