包信息
| 属性 | 值 |
|---|---|
| NuGet 包 | Bitzsoft.Integrations.TeamWork.DingTalk |
| Provider ID | dingtalk |
| 鉴权方式 | access_token query 参数(DingTalkAuthHandler 自动注入) |
| 能力接口 | Org、Message、Todo、Approval、Sso、Health(6 个) |
配置字段(DingTalkOptions)
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
AppKey | string | 是 | — | 应用 AppKey |
AppSecret | string | 是 | — | 应用 AppSecret |
AgentId | long | 工作通知必填 | 0 | 应用 AgentId |
BaseUrl | string | 否 | https://oapi.dingtalk.com | 旧版服务端 API 基地址 |
NewApiBaseUrl | string | 否 | https://api.dingtalk.com | 新版 API 基地址(SSO 用) |
LoginBaseUrl | string | 否 | https://login.dingtalk.com | OAuth2 扫码授权页 |
CallbackToken | string? | 否 | — | 回调 Token |
CallbackAesKey | string? | 否 | — | 回调加解密 AES Key |
HttpClientName | string | 否 | TeamWorkDingTalk | 业务 HttpClient 命名 |
TokenHttpClientName | string | 否 | TeamWorkDingTalkToken | 令牌刷新专用 HttpClient |
配置示例
{ "TeamWork": { "DingTalk": { "AppKey": "dingxxxxxxx", "AppSecret": "your-app-secret", "AgentId": 123456789, "BaseUrl": "https://oapi.dingtalk.com", "NewApiBaseUrl": "https://api.dingtalk.com", "LoginBaseUrl": "https://login.dingtalk.com" } }}DI 注册
// ① 配置节绑定builder.Services.AddBitzsoftDingTalkTeamWork(builder.Configuration.GetSection("TeamWork:DingTalk"));
// ② 委托配置builder.Services.AddBitzsoftDingTalkTeamWork(options =>{ options.AppKey = "dingxxxxxxx"; options.AppSecret = "your-app-secret"; options.AgentId = 123456789;});能力接口方法
ITeamWorkOrgProvider
Task<IReadOnlyList<DepartmentInfo>> GetDepartmentsAsync(long? parentId = null, CancellationToken ct = default);Task<IReadOnlyList<EmployeeInfo>> GetEmployeesAsync(long departmentId, CancellationToken ct = default);ITeamWorkMessageProvider
Task<MessageDeliveryResult> SendWorkNotificationAsync(WorkNotificationRequest request, CancellationToken ct = default);Task<MessageDeliveryResult> SendCardMessageAsync(CardMessageRequest request, CancellationToken ct = default);ITeamWorkTodoProvider
Task<string> CreateTodoAsync(TodoCreateRequest request, CancellationToken ct = default);Task UpdateTodoStatusAsync(string todoId, TodoStatus status, CancellationToken ct = default);ITeamWorkApprovalProvider
Task<string> StartApprovalAsync(ApprovalStartRequest request, CancellationToken ct = default);Task<ApprovalStatus> GetApprovalStatusAsync(string processInstanceId, CancellationToken ct = default);ITeamWorkSsoProvider
Task<string> GetAuthorizeUrlAsync(string redirectUri, string state, CancellationToken ct = default);Task<SsoUserInfo> GetUserInfoAsync(string authCode, CancellationToken ct = default);ITeamWorkHealthProvider
Task<TeamWorkHealthStatus> CheckHealthAsync(CancellationToken ct = default);使用示例
public class NotificationService(ITeamWorkMessageProvider message){ public async Task PushAsync(string userId, string content) { await message.SendWorkNotificationAsync(new WorkNotificationRequest { ToUser = userId, Content = content, }); }}已知限制
- 待办只支持标记完成:
UpdateTodoStatusAsync实际只支持设为Done,不支持撤回。 GetDepartmentsAsync递归整棵子树:钉钉/topapi/v2/department/listsub只返回下一级,实现内部递归并做环形防护(HashSet<long>去重)。GetEmployeesAsync分页上限:无”全公司用户”单接口,遍历各部门分页拉取,设安全上限MaxUserListPages = 1000。
相关
- TeamWork 域手册:15 个接口设计与能力矩阵
- TeamWork · 钉钉实现:双 HttpClient 与常量分区
- 错误处理约定