跳到主要内容

Bot Token

Bot Token 是应用安装到工作空间后获得的令牌,用于调用 Bot API。

获取方式​

Bot Token 在应用安装到工作空间时获取,通过确认安装接口返回。

确认安装接口​

接口地址: POST /im-user/api/v1/oauth/install/confirm

请求参数:

{
"clientId": "550e8400-e29b-41d4-a716-446655440000",
"workspaceId": 1001,
"externalTenantId": "1",
"installerUserId": 456,
"timestamp": 1704528000,
"sign": "a1b2c3d4..."
}

响应参数:

{
"code": 200,
"data": {
"botToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"tokenType": "bot",
"botUserId": 456,
"botName": "OA办公系统",
"workspaceId": 1001,
"workspaceName": "测试工作空间",
"installationId": 789,
"expiresIn": 31536000,
"scope": "bot:message:send,bot:user:read"
}
}

Token 属性​

属性说明
botTokenBot Token 值
tokenTypeToken 类型,固定为 "bot"
expiresIn有效期(秒),默认 1 年
scope权限范围

使用方式​

在调用 Bot API 时,需要在请求头中携带 Bot Token:

Authorization: Bearer {botToken}

curl 示例​

curl -X POST 'https://api.im.example.com/im-user/api/v1/bot/send-message' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
-H 'Content-Type: application/json' \
-d '{
"workspaceId": 1001,
"userId": 123,
"text": "Hello!"
}'

Java 示例​

import cn.hutool.http.HttpRequest;

public class BotApiClient {

private final String botToken;
private final String apiBaseUrl;

public BotApiClient(String botToken, String apiBaseUrl) {
this.botToken = botToken;
this.apiBaseUrl = apiBaseUrl;
}

public String sendMessage(Long workspaceId, Long userId, String text) {
Map<String, Object> body = new HashMap<>();
body.put("workspaceId", workspaceId);
body.put("userId", userId);
body.put("text", text);

return HttpRequest.post(apiBaseUrl + "/im-user/api/v1/bot/send-message")
.header("Authorization", "Bearer " + botToken)
.header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(body))
.execute()
.body();
}
}

适用 API​

Bot Token 可用于以下 API:

API说明
POST /im-user/api/v1/bot/send-message发送消息给用户
POST /im-user/api/v1/bot/send-channel-message发送消息到频道
POST /im-user/api/v1/oauth/ticket/verify验证 Login Ticket

有效期​

  • 默认有效期:1 年(31536000 秒)
  • 过期处理:Token 过期后需要重新安装应用获取新 Token

检查 Token 是否过期​

public boolean isTokenExpired(LocalDateTime expiresAt) {
return expiresAt.isBefore(LocalDateTime.now());
}

Token 过期处理​

public String getBotToken(Long tenantId) {
WorkspaceBinding binding = bindingMapper.selectByTenantId(tenantId);

if (binding == null) {
throw new ServiceException("租户未绑定工作空间");
}

if (binding.getBotTokenExpiresAt().isBefore(LocalDateTime.now())) {
throw new ServiceException("Bot Token 已过期,请重新安装应用");
}

return binding.getBotToken();
}

存储建议​

Bot Token 应安全存储在数据库中:

CREATE TABLE workspace_bindings (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
oa_tenant_id BIGINT NOT NULL,
im_workspace_id BIGINT NOT NULL,
bot_token VARCHAR(1024) COMMENT 'Bot Token',
bot_token_expires_at DATETIME COMMENT 'Token过期时间',
-- 其他字段...
);

安全建议​

重要
  • Bot Token 应存储在服务端,禁止暴露在前端
  • 不要将 Bot Token 提交到代码仓库
  • 建议使用环境变量或配置中心管理
  • 定期检查 Token 是否即将过期

错误处理​

错误码说明解决方案
401Token 无效或已过期检查 Token 是否正确,或重新安装应用
403权限不足检查 Token 的 scope 是否包含所需权限

下一步​