using HuizhongLibrary.Log; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Web.Script.Serialization; namespace HuizhongLibrary.Dingtalk { public class DingtalkService { #region 获取签名 public static String GetSignName(string AccessToken, out string ErrorMessage) { ErrorMessage=""; return ""; } #endregion #region 获取AccessToken public static string DingtalkAccessToken(string Appid, string Secret, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/gettoken?corpid=" + Appid + "&corpsecret=" + Secret; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); UTF8Encoding encoding = new UTF8Encoding(); string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return ""; DingtalkAccessToken model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) { return model2.access_token; } else { ErrorMessage = model2.errmsg; } return ""; } #endregion #region 获取AccessToken public static string DingtalkAccessTokenNew(string Appid, string Secret, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/gettoken?appkey=" + Appid + "&appsecret=" + Secret; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); UTF8Encoding encoding = new UTF8Encoding(); string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return ""; DingtalkAccessToken model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) { return model2.access_token; } else { ErrorMessage = model2.errmsg; } return ""; } #endregion #region 获取AccessToken public static string DingtalkAccessTokenNewZZD(string Appid, string Secret, out string ErrorMessage,string ip, string mac) { //string url = "https://openplatform.dg-work.cn/gettoken.json?appkey=" + Appid + "&appsecret=" + Secret; //JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //UTF8Encoding encoding = new UTF8Encoding(); //string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); //if (string.IsNullOrEmpty(ErrorMessage) == false) return ""; ErrorMessage=""; string url = "https://openplatform-pro.ding.zj.gov.cn/gettoken.json?appkey=" + Appid + "&appsecret=" + Secret; string XmlContent = GetAccessTokenZZD(url, ip, mac, Appid, Secret); JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); DingtalkAccessTokenMessZZD model2 = JsonConvert.Deserialize(XmlContent); if (model2.success == true) { if (model2.content.success == true) { return model2.content.data.accessToken; } else { ErrorMessage = XmlContent; } } else { ErrorMessage = XmlContent; } return ""; } //根据authCode换取用户信息 //参数 paramData:"access_token=" + access_token + "&auth_code=" + auth_code + "" public static string ZzdPostWebRequest(string postUrl, string paramData, string access_token, string auth_code, string ip, string mac, string Appid, string Secret) { try { string ret = string.Empty; byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化 var AccessKey = Appid; var SecretKey = Secret; var Timestamp = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz"); var Nonce = ConvertDateTimeToInt(DateTime.Now) + "1234"; var CanonicalURI = "/rpc/oauth2/dingtalk_app_user.json"; var HttpRequestParams = "access_token=" + access_token + "&auth_code=" + auth_code + ""; HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl)); webReq.Method = "POST"; webReq.ContentType = "application/json"; webReq.ContentLength = byteArray.Length; webReq.Headers.Add("X-Hmac-Auth-IP", ip); webReq.Headers.Add("X-Hmac-Auth-MAC", mac); webReq.Headers.Add("X-Hmac-Auth-Timestamp", Timestamp); webReq.Headers.Add("X-Hmac-Auth-Version", "1.0"); webReq.Headers.Add("X-Hmac-Auth-Nonce", Nonce); webReq.Headers.Add("apiKey", AccessKey); var bytesToSign = "POST" + '\n' + Timestamp + '\n' + Nonce + '\n' + CanonicalURI + '\n' + HttpRequestParams; webReq.Headers.Add("X-Hmac-Auth-Signature", GetSignature(bytesToSign, SecretKey)); System.IO.Stream newStream = webReq.GetRequestStream(); newStream.Write(byteArray, 0, byteArray.Length);//写入参数 newStream.Close(); HttpWebResponse response = (HttpWebResponse)webReq.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8); ret = sr.ReadToEnd(); sr.Close(); response.Close(); newStream.Close(); return ret; } catch (WebException ex) { var res = (HttpWebResponse)ex.Response; System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), Encoding.UTF8); var ret = sr.ReadToEnd(); return ret; } } /// ///获取AccessToken /// /// /// public static string GetAccessTokenZZD(string url, string ip, string mac, string Appid, string Secret) { try { var AccessKey = Appid; var SecretKey = Secret; var xmlResponse = ""; var Timestamp = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz"); var Nonce = ConvertDateTimeToInt(DateTime.Now) + "1234"; var CanonicalURI = "/gettoken.json"; var HttpRequestParams = "appkey=" + AccessKey + "&appsecret=" + SecretKey + ""; //发起请求 var webRequest = (HttpWebRequest)WebRequest.Create(new Uri(url)); //webRequest.Headers.Add("X-Hmac-Auth-IP",ip); //webRequest.Headers.Add("X-Hmac-Auth-MAC",mac); webRequest.Headers.Add("X-Hmac-Auth-Timestamp", Timestamp); webRequest.Headers.Add("X-Hmac-Auth-Version", "1.0"); webRequest.Headers.Add("X-Hmac-Auth-Nonce", Nonce); webRequest.Headers.Add("apiKey", AccessKey); var bytesToSign = "GET" + '\n' + Timestamp + '\n' + Nonce + '\n' + CanonicalURI +'\n' + HttpRequestParams; webRequest.Headers.Add("X-Hmac-Auth-Signature", GetSignature(bytesToSign,SecretKey)); webRequest.ContentType = "application/json"; webRequest.Method = "GET"; //响应 WebResponse webResponse = webRequest.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(webResponse.GetResponseStream(), Encoding.UTF8); xmlResponse = sr.ReadToEnd(); return xmlResponse; } catch (WebException ex) { var res = (HttpWebResponse)ex.Response; System.IO.StreamReader sr = new System.IO.StreamReader(res.GetResponseStream(), Encoding.UTF8); var ret = sr.ReadToEnd(); return ret; } } ///           /// 将c# DateTime时间格式转换为Unix时间戳格式           ///           /// 时间           /// long           private static long ConvertDateTimeToInt(System.DateTime time) { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0)); long t = (time.Ticks - startTime.Ticks) / 10000;   //除10000调整为13位                   return t; } /// /// 获取签名 /// /// 将bytesToSign作为消息 /// 将SecretKey作为秘钥 /// private static string GetSignature(string message, string secret) { secret = secret ?? ""; var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(secret); byte[] messageBytes = encoding.GetBytes(message); using (var hmacsha256 = new System.Security.Cryptography.HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); return Convert.ToBase64String(hashmessage); } } // private T DingGovRequest(HttpMethod method, string canonicalURI, Dictionary requestParas) // { // var domain = ModuleConfig.DingGovAPIDomain; // var accessKey = ModuleConfig.DingGovAppKey; // var secretKey = ModuleConfig.DingGovAppSecret; // var timestamp = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz"); // var nonce = ConvertDateTimeToInt(DateTime.Now) + "1234"; // var requestUrl = domain + canonicalURI; // try // { // var bytesToSign = $"{method}\n{timestamp}\n{nonce}\n{canonicalURI}";//参数参与签名 // bytesToSign += '\n' + DicionartyToUrlParameters(requestParas); // var message = new HttpRequestMessage // { // Method = method, // }; // message.Headers.Add("X-Hmac-Auth-IP", "1.1.1.1"); // message.Headers.Add("X-Hmac-Auth-MAC", "MAC"); // message.Headers.Add("X-Hmac-Auth-Timestamp", timestamp); // message.Headers.Add("X-Hmac-Auth-Version", "1.0"); // message.Headers.Add("X-Hmac-Auth-Nonce", nonce.ToString()); // message.Headers.Add("apiKey", accessKey); // message.Headers.Add("X-Hmac-Auth-Signature", GetSignature(bytesToSign, secretKey)); ////Post时放入body // if (method == HttpMethod.Post) // { // var paras = new Dictionary(); // foreach (var dic in requestParas) // { // paras.Add(dic.Key, Uri.UnescapeDataString(dic.Value)); // } // message.Content = new FormUrlEncodedContent(paras); // message.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); // } ////Get时放入urlParameters // else if (method == HttpMethod.Get) // { // requestUrl += $"?{DicionartyToUrlParameters(requestParas)}"; // } // message.RequestUri = new Uri(requestUrl); // using (var client = new HttpClient()) // { // var request = client.SendAsync(message); // request.Wait(); // var reponseContent = request.Result.Content.ReadAsStringAsync(); // reponseContent.Wait(); // //记录日志 // if (!request.Result.IsSuccessStatusCode) // { // throw new Exception(reponseContent.Result); // } // return JsonConvert.DeserializeObject(reponseContent.Result); // } // } // catch (Exception ex) // { ////记录日志 // return (T)default; // } // } #endregion #region 根据code获取用户信息 public static DingtalkUserInfo GetDingtalkUserInfo(string AccessToken, string code, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/user/getuserinfo?access_token=" + AccessToken + "&code=" + code; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); UTF8Encoding encoding = new UTF8Encoding(); string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; DingtalkUser model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode != 0) { ErrorMessage = XmlContent; return null; } ErrorFollow.TraceWrite("获取钉钉用户ID", "", model2.ToJsonString()); url = "https://oapi.dingtalk.com/user/get?access_token=" + AccessToken + "&userid=" + model2.userid; XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; DingtalkUserInfo model3 = JsonConvert.Deserialize(XmlContent); if (model3.errcode != 0) { ErrorMessage = XmlContent; } return model3; } #endregion #region 根据code获取用户信息 public static DingtalkUserInfoZZD GetDingtalkUserInfoZZD(string AccessToken, string code, out string ErrorMessage, string ip, string mac,string Appid, string Secret) { //string url = "https://openplatform.dg-work.cn/rpc/oauth2/dingtalk_app_user.json?access_token=" + AccessToken + "&auth_code=" + code; //JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //UTF8Encoding encoding = new UTF8Encoding(); //string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); //if (string.IsNullOrEmpty(ErrorMessage) == false) return null; ErrorMessage = ""; string url = "https://openplatform-pro.ding.zj.gov.cn/rpc/oauth2/dingtalk_app_user.json"; string paramData = "access_token=" + AccessToken + "&auth_code=" + code + ""; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string XmlContent = ZzdPostWebRequest(url, paramData, AccessToken, code, ip, mac, Appid, Secret); DingtalkUserZZD model2 = JsonConvert.Deserialize(XmlContent); if (model2.success != true) { ErrorMessage = XmlContent; return null; } ErrorFollow.TraceWrite("获取钉钉用户ID", "", model2.ToJsonString()); //url = "https://oapi.dingtalk.com/user/get?access_token=" + AccessToken + "&userid=" + model2.content.data.accountId; //XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); //if (string.IsNullOrEmpty(ErrorMessage) == false) return null; //DingtalkUserInfo model3 = JsonConvert.Deserialize(XmlContent); //if (model3.errcode != 0) //{ // ErrorMessage = XmlContent; //} return model2.content.data; } #endregion #region 发送工作消息 public static void SendMessage(string AccessToken,int AgentID, DingtalkMessage model,out string ErrorMessage) { ErrorMessage=""; string url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=" + AccessToken; string postmessage = model.ToJson(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string XmlContent = CustomIO.HttpRequest(url, "POST", "Content-Type:application/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return; ErrorMessage = model2.errmsg; } #endregion #region 发送工作消息 public static void SendMessage(string AccessToken, int AgentID, string msg, out string ErrorMessage) { ErrorMessage = ""; string url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=" + AccessToken; string postmessage = msg; UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string XmlContent = CustomIO.HttpRequest(url, "POST", "Content-Type:application/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return; ErrorMessage = model2.errmsg; } #endregion #region 创建部门接口 public static int DingDepartMentCreate(string AccessToken, DingDepartMent model, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/department/create?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = model.ToJson(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return 0; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.id; ErrorMessage = model2.errmsg; return 0; } #endregion #region 创建部门接口 public static int DingDepartMentCreate(string AccessToken, string msg, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/department/create?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = msg; UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return 0; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.id; ErrorMessage = model2.errmsg; return 0; } #endregion #region 修改部门接口 public static int DingDepartMentUpdate(string AccessToken, DingDepartMent model, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/department/update?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return 0; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.id; ErrorMessage = model2.errmsg; return 0; } #endregion #region 修改部门接口 public static int DingDepartMentUpdate(string AccessToken, string msg, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/department/update?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = msg; UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return 0; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.id; ErrorMessage = model2.errmsg; return 0; } #endregion #region 删除部门接口 public static void DingDepartMentDelete(string AccessToken, string DeptID, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/department/delete?access_token=" + AccessToken + "&id=" + DeptID; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return; ErrorMessage = model2.errmsg; } #endregion #region 获取部门列表 public static List DingDepartMent(string Appid, string Secret, out string ErrorMessage) { string AccessToken = DingtalkService.DingtalkAccessToken(Appid, Secret, out ErrorMessage); if (string.IsNullOrEmpty(AccessToken) == true) return null; ErrorFollow.TraceWrite("DingDepartMent", AccessToken, ""); // AccessToken = "49f5edfc4cc6317a888091616f7000eb"; string url = "https://oapi.dingtalk.com/department/list?access_token=" + AccessToken+ ""; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = "{\"id\":\"1\",\"fetch_child\":true}"; //UTF8Encoding encoding = new UTF8Encoding(); //byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "GET", "text/json", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.department; ErrorMessage = model2.errmsg; return null; } #endregion #region 获取部门列表 public static List DingDepartMent2(string Appid, int did,string Secret, out string ErrorMessage) { string AccessToken = DingtalkService.DingtalkAccessToken(Appid, Secret, out ErrorMessage); if (string.IsNullOrEmpty(AccessToken) == true) return null; ErrorFollow.TraceWrite("DingDepartMent", AccessToken, ""); // AccessToken = "49f5edfc4cc6317a888091616f7000eb"; string url = "https://oapi.dingtalk.com/department/list?access_token=" + AccessToken + "&id="+ did;//98995365 JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = "{\"id\":\"1\",\"fetch_child\":true}"; //UTF8Encoding encoding = new UTF8Encoding(); //byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "GET", "text/json", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.department; ErrorMessage = model2.errmsg; return null; } #endregion #region 获取部门id列表 public static List DingDepartMentId(string Appid, int did, string Secret, out string ErrorMessage) { string AccessToken = DingtalkService.DingtalkAccessToken(Appid, Secret, out ErrorMessage); if (string.IsNullOrEmpty(AccessToken) == true) return null; ErrorFollow.TraceWrite("DingDepartMentId", AccessToken, ""); // AccessToken = "49f5edfc4cc6317a888091616f7000eb"; string url = "https://oapi.dingtalk.com/department/list_ids?access_token=" + AccessToken + "&id=1";//98995365 JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = "{\"id\":\"1\",\"fetch_child\":true}"; //UTF8Encoding encoding = new UTF8Encoding(); //byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "GET", "text/json", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; ErrorFollow.TraceWrite("DingDepartMentId", XmlContent, ""); // DingResult model2 = JsonConvert.Deserialize(XmlContent); // if (model2.errcode == 0) return model2.department; // ErrorMessage = model2.errmsg; return null; } #endregion #region 创建员工接口 public static string DingUserCreate(string AccessToken, DingUser model, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/user/create?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return ""; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.userid; ErrorMessage = model2.errmsg; return ""; } #endregion #region 创建员工接口 public static string DingUserCreate(string AccessToken, string msg, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/user/create?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = msg; UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return ""; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.userid; ErrorMessage = model2.errmsg; return ""; } #endregion #region 修改员工接口 public static void DingUserUpdate(string AccessToken, DingUser model, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/user/update?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return; ErrorMessage = model2.errmsg; } #endregion #region 修改员工接口 public static void DingUserUpdate(string AccessToken, string msg, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/user/update?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); string postmessage = msg; UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return; ErrorMessage = model2.errmsg; } #endregion #region 删除员工接口 public static void DingUserDelete(string AccessToken, string UserID, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/user/delete?access_token=" + AccessToken + "&userid=" + UserID; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return; ErrorMessage = model2.errmsg; } #endregion #region 按手机号查询钉钉用户ID接口 public static string DingUserGet(string AccessToken, string Mobile, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/user/get_by_mobile?access_token="+ AccessToken + "&mobile="+ Mobile; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //string postmessage = JsonConvert.Serialize(model); //string postmessage = model.ToJsonString(); //UTF8Encoding encoding = new UTF8Encoding(); //byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "GET", "text/json", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return ""; DingUserGet model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.userid; ErrorMessage = model2.errmsg; return ""; } #endregion #region 获取员工列表 public static List DingUser(string Appid,string Secret, string deptid, out string ErrorMessage) { string AccessToken = DingtalkService.DingtalkAccessToken(Appid, Secret, out ErrorMessage); if (string.IsNullOrEmpty(AccessToken) == true) return null; string url = "https://oapi.dingtalk.com/user/simplelist?access_token=" + AccessToken + "&department_id=" + deptid; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string XmlContent = CustomIO.HttpRequest(url, "GET", "", null, HttpVersion.Version10, null, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) return model2.userlist; ErrorMessage = model2.errmsg; return null; } #endregion #region 获取考勤结果 public static List GetWork(string AccessToken, DingWorkRequest model, out string ErrorMessage) { var ListModel = new List(); GetWorkDetail(AccessToken, model, ListModel, out ErrorMessage); return ListModel; } public static void GetWorkDetail(string AccessToken, DingWorkRequest model, List ListResult, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/attendance/list?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; var model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) { foreach (var item in model2.recordresult) { ListResult.Add(item.Copy()); } if (model2.hasMore == false) { return; } model.offset += model.limit; GetWorkDetail(AccessToken, model, ListResult, out ErrorMessage); } else { ErrorMessage = model2.errmsg; } } public static List GetWordRecord(string AccessToken, DingWorkRequest model, out string ErrorMessage) { var ListModel = new List(); GetWorkDetailRecord(AccessToken, model, ListModel, out ErrorMessage); return ListModel; } public static void GetWorkDetailRecord(string AccessToken, DingWorkRequest model, List ListResult, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/attendance/listRecord?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; var model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) { foreach (var item in model2.recordresult) { ListResult.Add(item.Copy()); } if (model2.hasMore == false) { return; } model.offset += model.limit; GetWorkDetail(AccessToken, model, ListResult, out ErrorMessage); } else { ErrorMessage = model2.errmsg; } } #endregion #region 获取请假时长 public static int GetLeaveTime(string AccessToken,string userid, DateTime StartDate, DateTime StopDate, out string ErrorMessage) { string url = "https://oapi.dingtalk.com/topapi/attendance/getleaveapproveduration?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); var model = new LeaveTimeRequest(); model.from_date = StartDate.ToString("yyyy-MM-dd HH:mm:ss"); model.to_date = StopDate.ToString("yyyy-MM-dd HH:mm:ss"); model.userid = userid; string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return -1; DingResult model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0)return model2.result.duration_in_minutes; ErrorMessage = model2.errmsg; return -1; } #endregion #region 获取审批 public static List GetListExam(string AccessToken,string examcode, DateTime StartTime,DateTime StopTime, out string ErrorMessage) { var requst1 = new ExamIdRequest(); requst1.process_code = examcode; requst1.start_time = CustomIO.GetTimeStamp(StartTime); requst1.end_time = CustomIO.GetTimeStamp(StopTime); var list1 = DingtalkService.GetExamIds(AccessToken, examcode, requst1, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; var ListExam = new List(); foreach (string item in list1) { var model = DingtalkService.GetExam(AccessToken, item, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; ListExam.Add(model); } return ListExam; } #endregion #region 获取审批ID列表 public static List GetExamIds(string AccessToken, string code, ExamIdRequest model,out string ErrorMessage) { var ListModel = new List(); GetExamIdsDetail(AccessToken, code, model, ListModel, out ErrorMessage); return ListModel; } public static void GetExamIdsDetail(string AccessToken, string code, ExamIdRequest model, List ListResult,out string ErrorMessage) { string url = "https://oapi.dingtalk.com/topapi/processinstance/listids?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; var model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) { foreach (var item in model2.result.list) { ListResult.Add(item); } if (model2.result.next_cursor == 0) { return; } model.cursor += model2.result.next_cursor; GetExamIdsDetail(AccessToken, code, model, ListResult, out ErrorMessage); } else { ErrorMessage = model2.errmsg; } } #endregion #region 获取审批详情 public static ExamResult GetExam(string AccessToken, string process_instance_id,out string ErrorMessage) { string url = "https://oapi.dingtalk.com/topapi/processinstance/get?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string postmessage = "{\"process_instance_id\":\""+ process_instance_id + "\"}"; UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return null; var model2 = JsonConvert.Deserialize(XmlContent); model2.process_instance_id = process_instance_id; if (model2.errcode == 0) return model2; ErrorMessage = model2.errmsg; return null; } #endregion #region 获取请假详情 public static LeaveResult GetLeave(string AccessToken, string process_instance_id, out string ErrorMessage) { //string XmlContent = GetExam(AccessToken, process_instance_id, out ErrorMessage); //if (string.IsNullOrEmpty(ErrorMessage) == false) return null; //JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); //DingResult2 model2 = JsonConvert.Deserialize(XmlContent); //if (model2.errcode != 0) //{ // ErrorMessage = model2.errmsg; // return null; //} //var model = new LeaveResult(); //model.userid = model2.process_instance.originator_userid; //model.State = -1; //if (model2.process_instance.result == "refuse") model.State = 0; //if (model2.process_instance.result== "agree") model.State = 1; //foreach (var item in model2.process_instance.form_component_values) //{ // if (item.name == "请假类型") model.LeaveType = item.value; // if (item.name == "请假事由") model.Cause = item.value; // if (item.name == "请假天数") model.LeaveDay = Convert.ToInt32(item.value); // if (item.name == "[\"开始时间\",\"结束时间\"]") // { // string sss = item.value.Replace("[", "").Replace("]","").Replace("\"", ""); // string[] ss = sss.Split(','); // model.StartTime = Convert.ToDateTime(ss[0]); // model.EndTime = Convert.ToDateTime(ss[1]); // } //} //return model; ErrorMessage = ""; return null; } #endregion #region 获取日志详情 public static List GetLog(string AccessToken, DingLogRequest model, out string ErrorMessage) { var ListModel = new List(); GetLogDetail(AccessToken, model, ListModel, out ErrorMessage); return ListModel; } public static void GetLogDetail(string AccessToken, DingLogRequest model, List ListResult,out string ErrorMessage) { string url = "https://oapi.dingtalk.com/topapi/report/list?access_token=" + AccessToken; JavaScriptSerializer JsonConvert = new JavaScriptSerializer(); string postmessage = model.ToJsonString(); UTF8Encoding encoding = new UTF8Encoding(); byte[] data = encoding.GetBytes(postmessage); ErrorFollow.TraceWrite("获取日志详情请求", "", postmessage); string XmlContent = CustomIO.HttpRequest(url, "POST", "text/json", null, HttpVersion.Version10, data, out ErrorMessage); if (string.IsNullOrEmpty(ErrorMessage) == false) return; ErrorFollow.TraceWrite("获取日志详情返回", "", XmlContent); var model2 = JsonConvert.Deserialize(XmlContent); if (model2.errcode == 0) { foreach (var item in model2.result.data_list) { ListResult.Add(item.Copy()); } if (model2.result.has_more == false) { return; } model.cursor = model2.result.next_cursor; GetLogDetail(AccessToken, model, ListResult, out ErrorMessage); } else { ErrorMessage = model2.errmsg; } } #endregion } }