using DingTalk.Api; using DingTalk.Api.Request; using DingTalk.Api.Response; using Mapster; using static DingTalk.Api.Request.OapiRobotSendRequest; using static DingTalk.Api.Response.OapiV2DepartmentListsubResponse; using static DingTalk.Api.Response.OapiV2UserListResponse; namespace JNPF.Extras.Thirdparty.DingDing; /// /// 钉钉. /// public class DingUtil { /// /// 访问令牌. /// public string token { get; private set; } /// /// 构造函数. /// /// 企业号ID. /// 凭证密钥. public DingUtil(string appKey, string appSecret) { token = GetDingToken(appKey, appSecret); } /// /// 构造函数. /// /// 企业号ID. /// 凭证密钥. public DingUtil() { } /// /// 钉钉token. /// /// 企业号ID. /// 凭证密钥. /// public string GetDingToken(string appKey, string appSecret) { try { var tokenurl = "https://oapi.dingtalk.com/gettoken"; DefaultDingTalkClient client = new DefaultDingTalkClient(tokenurl); OapiGettokenRequest req = new OapiGettokenRequest(); req.SetHttpMethod("GET"); req.Appkey = appKey; req.Appsecret = appSecret; OapiGettokenResponse response = client.Execute(req); if (response.Errcode == 0) { // 过期时间 var timeout = DateTime.Now.Subtract(DateTime.Now.AddSeconds(response.ExpiresIn)); return response.AccessToken; } else { throw new Exception("获取钉钉Token失败,失败原因:" + response.Errmsg); } } catch (Exception ex) { return string.Empty; } } /// /// 钉钉登录. /// /// /// public object DingLogin(string code) { var url = "https://oapi.dingtalk.com/user/getuserinfo"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiUserGetuserinfoRequest req = new OapiUserGetuserinfoRequest(); req.Code = code; req.SetHttpMethod("GET"); OapiUserGetuserinfoResponse rsp = client.Execute(req, token); if (rsp.IsError) throw new Exception(rsp.ErrMsg); return rsp.Body; } #region 用户 /// /// 添加钉钉用户. /// /// /// public string CreateUser(DingUserParameter dingModel, ref string msg) { try { var userId = GetUserIdByMobile(dingModel.Mobile); if (!string.IsNullOrEmpty(userId)) return userId; var url = "https://oapi.dingtalk.com/topapi/v2/user/create"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2UserCreateRequest req = dingModel.Adapt(); OapiV2UserCreateResponse rsp = client.Execute(req, token); if (!rsp.IsError && rsp.Result != null) { return rsp.Result.Userid; } else { msg = rsp.Errmsg; return string.Empty; } } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 修改钉钉用户. /// /// 钉钉用户参数. /// 返回信息. /// /// public bool UpdateUser(DingUserParameter dingModel, ref string msg) { try { var url = "https://oapi.dingtalk.com/topapi/v2/user/update"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2UserUpdateRequest req = dingModel.Adapt(); OapiV2UserUpdateResponse rsp = client.Execute(req, token); if (rsp.IsError) msg = rsp.Errmsg; return rsp.Errcode == 0; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 修改钉钉用户. /// /// /// 返回信息. public void DeleteUser(DingUserParameter dingModel, ref string msg) { try { var url = "https://oapi.dingtalk.com/topapi/v2/user/delete"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2UserDeleteRequest req = dingModel.Adapt(); OapiV2UserDeleteResponse rsp = client.Execute(req, token); if (rsp.IsError) { msg = rsp.Errmsg; } } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 根据手机号查询用户 /// 员工离职后,无法再通过手机号获取userId. /// /// /// public string GetUserIdByMobile(string mobile) { try { var url = "https://oapi.dingtalk.com/topapi/v2/user/getbymobile"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest() { Mobile = mobile }; OapiV2UserGetbymobileResponse rsp = client.Execute(req, token); if (!rsp.IsError && rsp.Result != null) { return rsp.Result.Userid; } else { return string.Empty; } } catch (Exception ex) { return string.Empty; } } /// /// 获取所有用户详情. /// /// public List GetUserList() { try { var url = "https://oapi.dingtalk.com/topapi/v2/user/list"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); var userList = new List(); var depList = new List(); depList.Add(1); GetDepIdList(1, ref depList); if (depList.Count > 0) { foreach (var item in depList) { OapiV2UserListRequest req = new OapiV2UserListRequest() { DeptId = item, Cursor = 0, Size = 10 }; OapiV2UserListResponse rsp = client.Execute(req, token); if (rsp.Errcode == 0 && rsp.Errmsg == "ok" && rsp.Result != null && rsp.Result.List != null) { userList = userList.Union(rsp.Result.List).ToList(); } } } return userList; } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion #region 部门 /// /// 添加钉钉部门. /// /// /// 返回信息. /// public string CreateDep(DingDepartmentParameter dingModel, ref string msg) { try { var url = "https://oapi.dingtalk.com/topapi/v2/department/create"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2DepartmentCreateRequest req = dingModel.Adapt(); OapiV2DepartmentCreateResponse rsp = client.Execute(req, token); if (rsp.Errcode == 0) { if (!rsp.IsError && rsp.Result != null) { return rsp.Result.DeptId.ToString(); } else { msg = string.Format("【组织{0}创建失败】{1}", dingModel.Name, rsp.Errmsg); return string.Empty; } } else { msg = string.Format("【组织{0}创建失败】{1}", dingModel.Name, rsp.Errmsg); return string.Empty; } } catch (Exception ex) { msg = string.Format("【组织{0}创建失败】{1}", dingModel.Name, ex.Message); throw new Exception(ex.Message); } } /// /// 修改钉钉部门. /// /// /// 返回信息. public bool UpdateDep(DingDepartmentParameter dingModel, ref string msg) { try { var url = "https://oapi.dingtalk.com/topapi/v2/department/update"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2DepartmentUpdateRequest req = dingModel.Adapt(); OapiV2DepartmentUpdateResponse rsp = client.Execute(req, token); if (!rsp.IsError) { msg = rsp.IsError ? string.Format("【组织{0}修改失败】{1}", dingModel.Name, rsp.Errmsg) : string.Empty; return !rsp.IsError; } else { msg = string.Format("【组织{0}修改失败】{1}", dingModel.Name, rsp.Errmsg); return false; } } catch (Exception ex) { msg = string.Format("【组织{0}修改失败】{1}", dingModel.Name, ex.Message); return false; } } /// /// 删除钉钉部门. /// /// /// 返回信息. public bool DeleteDep(DingDepartmentParameter dingModel, ref string msg) { try { var url = "https://oapi.dingtalk.com/topapi/v2/department/delete"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2DepartmentDeleteRequest req = dingModel.Adapt(); OapiV2DepartmentDeleteResponse rsp = client.Execute(req, token); if (!rsp.IsError) { msg = rsp.IsError ? rsp.Errmsg : string.Empty; return !rsp.IsError; } else { msg = rsp.Errmsg; return false; } } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 获取部门列表. /// /// public List GetDepList() { try { var depId = new List(); depId.Add(1); GetDepIdList(1, ref depId); var list = new List(); if (depId.Count > 0) { var url = "https://oapi.dingtalk.com/topapi/v2/department/listsub"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest(); foreach (var item in depId) { req.DeptId = item; OapiV2DepartmentListsubResponse rsp = client.Execute(req, token); if (rsp.Errcode == 0 && rsp.Errmsg == "ok" && rsp.Result != null) { list = list.Union(rsp.Result).ToList(); } } } return list; } catch (Exception ex) { throw new Exception(ex.Message); } } /// /// 获取部门id列表. /// /// public void GetDepIdList(long depId, ref List ids) { try { var url = "https://oapi.dingtalk.com/topapi/v2/department/listsubid"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiV2DepartmentListsubidRequest req = new OapiV2DepartmentListsubidRequest(); req.DeptId = depId; OapiV2DepartmentListsubidResponse rsp = client.Execute(req, token); if (rsp.Errcode == 0 && rsp.Errmsg == "ok" && rsp.Result != null) { ids = ids.Union(rsp.Result.DeptIdList).ToList(); foreach (var item in rsp.Result.DeptIdList) { GetDepIdList(item, ref ids); } } } catch (Exception ex) { throw new Exception(ex.Message); } } #endregion /// /// 发送工作消息. /// /// public void SendWorkMsg(DingWorkMessageParameter dingModel) { var url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"; DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request() { AgentId = long.Parse(dingModel.agentId), UseridList = dingModel.toUsers, Msg = dingModel.msg }; request.SetHttpMethod("POST"); OapiMessageCorpconversationAsyncsendV2Response response = client.Execute(request, token); if (response.IsError) { throw new Exception(response.ErrMsg); } } /// /// 发送群聊消息. /// /// /// public void SendGroupMsg(string url, string content) { DefaultDingTalkClient client = new DefaultDingTalkClient(url); OapiRobotSendRequest request = new OapiRobotSendRequest(); request.Msgtype = "text"; TextDomain text = new TextDomain(); text.Content = content; request.Text_ = text; request.SetHttpMethod("POST"); OapiRobotSendResponse response = client.Execute(request); if (response.IsError) { throw new Exception(response.ErrMsg); } } }