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了!