釘釘消息推送


1、整個思路是這樣的,通過企業ID企業應用的憑證密鑰獲取到access_token

2、通過access_token獲取到部門列表

3、通過部門列表循環獲取到所有人員信息

4、根據手機號判斷userid

5、推送消息

因為推送消息接口需要的參數如下:

 "{\"touser\":\"" + toUser + "\",\"toparty\":\"\",\"agentid\":\"123456\",\"msgtype\":\"text\",\"text\":{\"content\":\"發送消息的內容\"}}";

agentid是微應用ID

下面直接上代碼:

/// <summary>
/// POST請求數據
/// </summary>
/// <param name="postData">請求數據</param>
/// <param name="url">接口路徑</param>
/// <returns></returns>
private string GetResponseData(string postData, string url)
{
HttpWebRequest request = null;
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
request = WebRequest.Create(url) as HttpWebRequest;
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request.ProtocolVersion = HttpVersion.Version11;
// 這里設置了協議類型。
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;// SecurityProtocolType.Tls1.2;
request.KeepAlive = false;
ServicePointManager.CheckCertificateRevocationList = true;
ServicePointManager.DefaultConnectionLimit = 100;
ServicePointManager.Expect100Continue = false;
}
else
{
request = (HttpWebRequest)WebRequest.Create(url);
}

request.Method = "POST"; //使用POST方式發送數據
request.ContentType = "application/json";
request.Referer = null;
request.AllowAutoRedirect = true;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
request.Accept = "*/*";

byte[] data = Encoding.UTF8.GetBytes(postData);
Stream newStream = request.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();

//獲取網頁響應結果
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
//client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
string result = string.Empty;
using (StreamReader sr = new StreamReader(stream))
{
result = sr.ReadToEnd();
}

return result;
}

private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //總是接受
}


private string GetResponseDataForGet(string Url)
{
WebRequest request = WebRequest.Create(Url);
request.Method = "GET";
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
Encoding encode = Encoding.UTF8;
StreamReader reader = new StreamReader(stream, encode);
string strResult = reader.ReadToEnd();
stream.Dispose();
reader.Dispose();
return strResult;
}
/// <summary>
/// 獲取accessToken
/// </summary>
/// <param name="appId">企業Id</param>
/// <param name="secrect">企業應用的憑證密鑰</param>
/// <returns></returns>
public string GetAccess_Token(string appId, string secrect)
{
try
{
string url = "https://oapi.dingtalk.com/gettoken?corpid=" + appId + "&corpsecret=" + secrect;
string str = GetResponseDataForGet(url);
if (str.Contains("access_token"))
{
AccessTokenResult accessTokenResult = JsonConvert.DeserializeObject<AccessTokenResult>(str);
return accessTokenResult.access_token;
}
else
{
return "";
}
}
catch (Exception ex)
{
return "";
}

}
/// <summary>
/// 獲取部門信息
/// </summary>
/// <param name="appId">企業ID</param>
/// <param name="secrect">企業應用的憑證密鑰</param>
/// <returns></returns>
public DepartmentResult GetDepartmentInfo(string appId, string secrect)
{
try
{
////獲取access_token
string access_token = GetAccess_Token(appId, secrect);
string url = "https://oapi.dingtalk.com/department/list?access_token=" + access_token;
string str = GetResponseDataForGet(url);
DepartmentResult departmentResult = JsonConvert.DeserializeObject<DepartmentResult>(str);
return departmentResult;
}
catch (Exception ex)
{

return null;
}
}

/// <summary>
/// 根據企業ID和企業應用的憑證密鑰獲取企業下所有人員的信息
/// </summary>
/// <param name="appId">企業ID</param>
/// <param name="secrect">企業應用的憑證密鑰</param>
/// <returns></returns>
public List<Userlist> GetUserInfoList(string appId, string secrect)
{
try
{
//獲取access_token
string access_token = GetAccess_Token(appId, secrect);
if (string.IsNullOrEmpty(access_token)) return null;
DepartmentResult departmentResult = GetDepartmentInfo(appId, secrect);
if (departmentResult.errcode != 0 || departmentResult.department.Count <= 0)
return null;
List<Userlist> userList = new List<Userlist>();
foreach (Department item in departmentResult.department)
{
//根據部門ID獲取部門人員詳情
string url = "https://oapi.dingtalk.com/user/list?access_token=" + access_token + "&department_id=" + item.id;
string str = GetResponseDataForGet(url);
UserResult userResult = JsonConvert.DeserializeObject<UserResult>(str);
if (userResult.errcode == 0 && userResult.userlist != null && userResult.userlist.Length > 0)
{
userList.AddRange(userResult.userlist);//添加人員信息到集合中
}
}


return userList;
}
catch (Exception ex)
{

return null;
}
}
/// <summary>
/// 發送釘釘消息
/// </summary>
/// <param name="phoneNumber">電話號碼,多個用逗號隔開</param>
/// <param name="content">發送內容</param>
/// <param name="appId">企業ID</param>
/// <param name="secrect">企業應用的憑證密鑰</param>
/// <returns></returns>
public bool Send(string phoneNumber,string content, string appId,string secrect)
{
try
{
List<Userlist> userList = GetUserInfoList(appId, secrect);
string[] phoneNoArray = phoneNumber.Split(',');
string toUser = "";
foreach (string item in phoneNoArray)
{
Userlist user = userList.Where(i => i.mobile == item).FirstOrDefault();
if (user != null)
{
toUser += user.userid + "|";
}
}
toUser = toUser.Trim('|');
string JSONData =  "{\"touser\":\"" + toUser + "\",\"toparty\":\"\",\"agentid\":\"123456\",\"msgtype\":\"text\",\"text\":{\"content\":\"發送消息的內容\"}}";
//獲取access_token
string access_token = GetAccess_Token(appId, secrect);
string url = "https://oapi.dingtalk.com/message/send?access_token=" + access_token;
string str = GetResponseData(JSONData, url);
SendMessageResult result = JsonConvert.DeserializeObject<SendMessageResult>(str);
if (result != null && result.errcode == 0)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{

return false;
}

}

實體沒提供,取出來,反序列化一下就OK了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM