基于钉钉开放平台视频会议 API 实现,采用 AppKey + AppSecret 换取 access_token,以 query 参数注入鉴权。内置令牌缓存与自动刷新。
包信息
- NuGet 包:
Bitzsoft.Integrations.VideoConference.DingTalk - 接口:
IVideoConferenceService - 鉴权:AppKey + AppSecret 换 access_token(query 参数
?access_token=注入) - Provider ID:
dingtalk
配置
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
AppKey | string | 是 | — | 应用 Key(AppKey) |
AppSecret | string | 是 | — | 应用密钥(AppSecret) |
DefaultOrganizerUserId | string? | 否 | — | 默认会议组织者用户 ID(钉钉 organizerUserId) |
BaseUrl | string | 否 | https://oapi.dingtalk.com | 旧版 API 基地址(gettoken 等) |
NewApiBaseUrl | string | 否 | https://api.dingtalk.com | 新版 API 基地址(新版会议接口) |
HttpClientName | string | 否 | VideoConferenceDingTalk | 业务 HttpClient 命名 |
TokenHttpClientName | string | 否 | VideoConferenceDingTalkToken | 令牌刷新专用 HttpClient 命名 |
{ "VideoConference": { "DingTalk": { "AppKey": "your-app-key", "AppSecret": "your-app-secret", "DefaultOrganizerUserId": "your-organizer-user-id" } }}注册
// 方式一:IConfiguration(默认读取 "VideoConference:DingTalk" 配置节)services.AddDingTalkVideoConference(configuration);
// 方式二:委托配置services.AddDingTalkVideoConference(options =>{ options.AppKey = "your-app-key"; options.AppSecret = "your-app-secret"; options.DefaultOrganizerUserId = "your-organizer-user-id";});使用示例
var meeting = await service.CreateMeetingAsync(new CreateMeetingRequest{ Subject = "每日站会", StartTime = DateTimeOffset.Parse("2026-08-03T09:00:00+08:00"), EndTime = DateTimeOffset.Parse("2026-08-03T09:15:00+08:00"),});
// 移除参会人await service.RemoveAttendeesAsync(new RemoveAttendeesRequest{ MeetingId = meeting.MeetingId, Attendees = [new() { UserId = "user-id-to-remove" }]});
// 查询录制var recordings = await service.ListRecordingsAsync(meeting.MeetingId);鉴权机制
- 令牌获取:GET
/gettoken?appkey={AppKey}&appsecret={AppSecret}。 - 令牌缓存:
DingTalkVideoConferenceTokenManager为 Singleton,过期前 5 分钟刷新。 - 业务请求:通过
UriBuilder在请求 URL 上追加access_tokenquery 参数(已有 query 串时以&拼接)。 - 失效码
40014/42001/48002触发自愈。
已知限制
钉钉是本域唯一以 query 参数注入令牌的供应商。钉钉使用毫秒级 Unix 时间戳(与腾讯/飞书的秒级不同)。本项目自包含令牌管理,不依赖 TeamWork.DingTalk。