Files
zyt/server/app/adminapi/controller/DesktopController.php
T
2026-09-09 09:58:12 +08:00

56 lines
2.2 KiB
PHP

<?php
// +----------------------------------------------------------------------
// | 企业微信客服桌面端管理员认证接口
// +----------------------------------------------------------------------
namespace app\adminapi\controller;
use app\common\enum\AdminTerminalEnum;
use app\common\enum\YesNoEnum;
use app\common\model\auth\Admin;
/**
* 用最小身份信息把 ZYT 管理员账号映射到客服软件租户。
*
* session 标为免登录是为了跳过管理后台的菜单权限和登录 IP 限制;它并非匿名
* 接口,方法内部仍会严格校验 token 以及 token 的桌面终端类型。客服后台从另一
* 台服务器验证 token 时,请求 IP 本来就不会等于桌面用户登录时的 IP。
*/
class DesktopController extends BaseAdminController
{
public array $notNeedLogin = ['session'];
public function session()
{
$identity = (array)($this->request->adminInfo ?? []);
if (empty($identity) || empty($identity['admin_id'])) {
return $this->fail('登录已失效,请重新登录');
}
if ((int)($identity['terminal'] ?? 0) !== AdminTerminalEnum::WECOM_RPA) {
return $this->fail('当前登录令牌不属于企业微信客服桌面端');
}
$admin = Admin::where(['id' => (int)$identity['admin_id']])
->field('id,account,name,avatar,disable')
->findOrEmpty();
if ($admin->isEmpty() || (int)$admin['disable'] === YesNoEnum::YES) {
return $this->fail('管理员不存在或已禁用');
}
$account = trim((string)$admin['account']);
$name = trim((string)$admin['name']);
return $this->data([
// 加类型前缀,避免管理员 id 与普通用户 id 相同时落到同一个客服租户。
'user_id' => 'admin:' . (int)$admin['id'],
'sn' => $account,
'nickname' => $name !== '' ? $name : $account,
'mobile' => '',
'avatar' => (string)$admin['avatar'],
'terminal' => AdminTerminalEnum::WECOM_RPA,
'expire_time' => (int)($identity['expire_time'] ?? 0),
'status' => 'active',
'account_type' => 'admin',
]);
}
}