最近项目需求需要跟钉钉和ERP结合项目,而且是使用C#来进行,应该怎么做呢?

首先先说下需求,这次项目需要完成几个需求:

1.使用C# 调用钉钉接口发送工作通知

2.想某个同事发送待办消息

现在开始

  1. 注册开发者账号: 在钉钉开放平台注册一个开发者账号,创建一个应用,获得应用的AppKeyAppSecret

  2. 开发者后台 (dingtalk.com)

  3. 获取Access Token: 在你的C#代码中,通过AppKey和AppSecret获取访问令牌(Access Token)。你需要定期刷新Access Token,因为它们有过期时间。

第二:新建项目

这应该是最简单的基础

namespace YourProjectName
{
    class Program
    {
        static void Main(string[] args)
        {
            // 实例化 DingTalkApi 类
            DingTalkApi dingTalkApi = new DingTalkApi();

            // 调用 AfterBindData 方法
            dingTalkApi.AfterBindData(EventArgs.Empty).Wait(); // 这里使用了 .Wait() 以同步的方式调用异步方法

            // 等待用户按下 Enter 键退出程序
            Console.WriteLine("按下 Enter 键退出...");
            Console.ReadLine();
        }
    }
}
class DingTalkApi
{
    private const string AppKey = "AppKey ";
    private const string AppSecret = "AppSecret ";
    private const string DingTalkApiBaseUrl = "https://oapi.dingtalk.com/";
    private const string DingTalkApiBaseUrl2 = "https://api.dingtalk.com/";

    // 第一步
    public async Task AfterBindData(EventArgs e)
    {
        try
        {
            Console.WriteLine("开始发送钉钉消息");

            // 调用.NET Core代码发送待办信息给钉钉
            await SendTodoMessage(); // 使用 await 以异步方式调用异步方法
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            // 处理异常,例如记录到日志
        }
    }

    // 第二部
    private async Task SendTodoMessage()
    {
        try
        {
            // 获取Access Token
            var accessToken = await GetAccessToken();

            // 获取部门
            //var depIdList = await GetDepartment(accessToken);

            // 用部门ID获取所有用户ID循环去访问每一个部门来获取用户ID
            //var ListId = await GetTotalUserIds(accessToken, depIdList);
            // 拿取自己的ID即可
            var userId = "";
            // 机器人发送消息(权限没有 钉钉开放平台应用里开通权限)
            //var a = await GetRobotMessage(accessToken, userId);

            // 发送工作通知消息 userId 发送人ID
            var a = await GetWorkMessage(accessToken, userId);

            // 获取用户unionid
            //var unionid = await GetUnionid(accessToken, userId);
            var unionid = "";

            // 发送的内容
            var payload = new
            {
                subject = "您有采购订单未审核,请及时审核!",
                creatorId = unionid,
                description = "应用可以调用该接口发起一个钉钉待办任务",
                dueTime = "1702516848000",
                detailUrl = new
                {
                appUrl = "#",
                pcUrl = "#"
                },
                // 执行人 
                executorIds = new List<string>
                {
                    ""
                },
                isOnlyShowExecutor = true, // 或者 false,根据实际需求设置
                priority = 20, // 根据实际需求设置
                notifyConfigs = new
                {
                    dingNotify = "1"
                }
            };

            // 发送待办信息给钉钉
            //await SendTodoMessageToDingTalk(accessToken, unionid, payload);
        }
        catch (Exception ex)
        {
            
            // 处理异常,例如记录到日志ex.Message
        }
    }

    //发送工作消息
    public class Msg
    {
        public string msgtype { get; set; }
        public Text text { get; set; }
    }

    public class Text
    {
        public string content { get; set; }
    }

    //发送工作通知消息 userId 发送人ID
    private async Task<string> GetWorkMessage(string accessToken, string userId)
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                var url = $"{DingTalkApiBaseUrl}topapi/message/corpconversation/asyncsend_v2?access_token={accessToken}";

                // 构建请求参数
                var requestContent = new
                {
                    agent_id = 00000,
                    msg = new Msg
                    {
                        msgtype = "text",
                        text = new Text
                        {
                            content = "测试工作通知"
                        }
                    },
                    userid_list = ""
                };

                // 将请求参数转换为 JSON
                string jsonContent = JsonSerializer.Serialize(requestContent);

                // 发送 POST 请求
                var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");

                // 添加请求头
                //httpContent.Headers.Add("x-acs-dingtalk-access-token", accessToken);

                var response = await httpClient.PostAsync(url, httpContent);



                // 处理响应
                if (response.IsSuccessStatusCode)
                {
                    var responseContent = await response.Content.ReadAsStringAsync();
                    JObject jObject = JObject.Parse(responseContent);

                    // 获取 access_token
                    string errcode = (string)jObject["errcode"];

                    Console.WriteLine($"errcode: {errcode}");
                    return errcode;
                }
                else
                {
                    // 处理响应错误,根据需要返回或抛出异常
                    var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
                    throw new Exception(errorMessage);
                }
            }
        }
        catch (Exception ex)
        {
            // 处理异常,例如记录到日志
            Console.WriteLine($"Error: {ex.Message}");
            return null;
        }
    }


    // 使用机器人发送消息给某个用户
    private async Task<string> GetRobotMessage(string accessToken, string userId)
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                var url = $"{DingTalkApiBaseUrl2}v1.0/robot/ding/send";

                // 构建请求参数
                var requestContent = new
                {
                    RobotCode = "dingrtytmbzbzfcXXXXX",
                    RemindType = 1,
                    ReceiverUserIdList = new List<string>
                    {
                        "123123312"
                    },
                    Content = "钉钉,让进步发生",
                };

                // 将请求参数转换为 JSON
                string jsonContent = JsonSerializer.Serialize(requestContent);

                // 发送 POST 请求
                var httpContent = new StringContent(jsonContent, Encoding.UTF8, "application/json");

                // 添加请求头
                httpContent.Headers.Add("x-acs-dingtalk-access-token", accessToken);

                var response = await httpClient.PostAsync(url, httpContent);



                // 处理响应
                if (response.IsSuccessStatusCode)
                {
                    var responseContent = await response.Content.ReadAsStringAsync();
                    JObject jObject = JObject.Parse(responseContent);

                    // 获取 access_token
                    string unionid = (string)jObject["result"]["unionid"];
                    Console.WriteLine($"Unionid: {unionid}");
                    return unionid;
                }
                else
                {
                    // 处理响应错误,根据需要返回或抛出异常
                    var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
                    throw new Exception(errorMessage);
                }
            }
        }
        catch (Exception ex)
        {
            // 处理异常,例如记录到日志
            Console.WriteLine($"Error: {ex.Message}");
            return null;
        }
    }


    // 获取用户unionid
    private async Task<string> GetUnionid(string accessToken, string userId)
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                var url = $"{DingTalkApiBaseUrl}topapi/v2/user/get?access_token={accessToken}";

                // 构建请求参数084433060226083038
                var requestContent = new
                {
                    userid = userId
                };

                // 将请求参数转换为 JSON
                string jsonContent = JsonSerializer.Serialize(requestContent);

                // 发送 POST 请求
                var response = await httpClient.PostAsync(
                    url,
                    new StringContent(jsonContent, Encoding.UTF8, "application/json")
                );

                // 处理响应
                if (response.IsSuccessStatusCode)
                {
                    var responseContent = await response.Content.ReadAsStringAsync();
                    JObject jObject = JObject.Parse(responseContent);

                    // 获取 access_token
                    string unionid = (string)jObject["result"]["unionid"];
                    Console.WriteLine($"Unionid: {unionid}");
                    return unionid;
                }
                else
                {
                    // 处理响应错误,根据需要返回或抛出异常
                    var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
                    throw new Exception(errorMessage);
                }
            }
        }
        catch (Exception ex)
        {
            // 处理异常,例如记录到日志
            Console.WriteLine($"Error: {ex.Message}");
            return null;
        }
    }

    // 获取所有部门ID
    private async Task<List<long>> GetDepartment(string accessToken)
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                var url = $"{DingTalkApiBaseUrl}topapi/v2/department/listsub?access_token={accessToken}";
                var response = await httpClient.PostAsync(url, null);

                if (response.IsSuccessStatusCode)
                {
                    var responseContent = await response.Content.ReadAsStringAsync();
                    return ParseDepartmentIds(responseContent);
                }
                else
                {
                    var errorMessage = $"Error getting department details: {response.StatusCode} - {response.ReasonPhrase}";
                    throw new Exception(errorMessage);
                }
            }
        }
        catch (Exception ex)
        {
            // 处理异常,例如记录到日志
            Console.WriteLine($"Error: {ex.Message}");
            return null;
        }
    }
    // 批量获取ID
    private static List<long> ParseDepartmentIds(string jsonResponse)
    {
        var departmentIds = new List<long>();

        try
        {
            var jsonDocument = JsonDocument.Parse(jsonResponse);

            if (jsonDocument.RootElement.TryGetProperty("result", out var resultElement) && resultElement.EnumerateArray().Any())
            {
                foreach (var departmentElement in resultElement.EnumerateArray())
                {
                    if (departmentElement.TryGetProperty("dept_id", out var deptIdElement) && deptIdElement.TryGetInt64(out var deptId))
                    {
                        departmentIds.Add(deptId);
                    }
                }
            }

            return departmentIds;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error parsing department IDs: {ex.Message}");
            return null;
        }
    }

    // 利用部门去获取所有用户ID
    private async Task<List<string>> GetTotalUserIds(string accessToken, List<long> depIdList)
    {
        var totalUserIds = new List<string>();

        foreach (var depId in depIdList)
        {
            var userids = await GetDepUserId(accessToken, depId);

            if (userids != null)
            {
                totalUserIds.AddRange(userids);
            }
        }

        return totalUserIds;
    }

    private async Task<List<string>> GetDepUserId(string accessToken, long depId)
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                var url = $"{DingTalkApiBaseUrl}topapi/user/listid?access_token={accessToken}";

                // 构建请求参数
                var requestContent = new
                {
                    dept_id = depId
                };

                string jsonContent = JsonSerializer.Serialize(requestContent);

                var response = await httpClient.PostAsync(
                    url,
                    new StringContent(jsonContent, Encoding.UTF8, "application/json")
                );

                if (response.IsSuccessStatusCode)
                {
                    var responseContent = await response.Content.ReadAsStringAsync();
                    return ParseUserIds(responseContent);
                }
                else
                {
                    var errorMessage = $"Error getting user details: {response.StatusCode} - {response.ReasonPhrase}";
                    throw new Exception(errorMessage);
                }
            }
        }
        catch (Exception ex)
        {
            // 处理异常,例如记录到日志
            Console.WriteLine($"Error: {ex.Message}");
            return null;
        }
    }

    private static List<string> ParseUserIds(string jsonResponse)
    {
        var userIds = new List<string>();

        try
        {
            using (JsonDocument jsonDocument = JsonDocument.Parse(jsonResponse))
            {
                // 检查是否存在根元素
                if (jsonDocument.RootElement.TryGetProperty("errcode", out var errcodeElement) && errcodeElement.GetInt32() == 0)
                {
                    // 获取 userid_list 数组
                    if (jsonDocument.RootElement.TryGetProperty("result", out var resultElement) && resultElement.TryGetProperty("userid_list", out var userIdListElement))
                    {
                        if (userIdListElement.EnumerateArray().Any())
                        {
                            userIds.AddRange(userIdListElement.EnumerateArray().Select(id => id.GetString()));
                        }
                    }
                }
                else
                {
                    // 处理错误情况
                    var errmsg = jsonDocument.RootElement.GetProperty("errmsg").GetString();
                    throw new Exception($"Error getting user IDs: {errmsg}");
                }
            }

            return userIds;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error parsing user IDs: {ex.Message}");
            return null;
        }
    }






    // 获取Token
    private async Task<string> GetAccessToken()
    {
        using (var httpClient = new HttpClient())
        {
            var url = $"{DingTalkApiBaseUrl}gettoken?appkey={AppKey}&appsecret={AppSecret}";
            var response = await httpClient.GetAsync(url);
            var content = await response.Content.ReadAsStringAsync();


            JObject jObject = JObject.Parse(content);

            // 获取 access_token
            string accessToken = (string)jObject["access_token"];
            Console.WriteLine($"Access Token: {accessToken}");

            return accessToken;
        }

        // 解析 JSON 响应的方法

    }


    // 发送待办内容
    private async Task SendTodoMessageToDingTalk(string accessToken, string unionId, object payload)
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                var url = $"https://api.dingtalk.com/v1.0/todo/users/{unionId}/tasks?operatorId={unionId}";
                
                string jsonPayload = JsonSerializer.Serialize(payload);
                //JObject jsonPayload = JObject.Parse(payload);

                var httpContent = new StringContent(jsonPayload, Encoding.UTF8, "application/json");

                // 添加请求头
                httpContent.Headers.Add("x-acs-dingtalk-access-token", accessToken);

                var response = await httpClient.PostAsync(url, httpContent);
                var result = await response.Content.ReadAsStringAsync();

                // 处理响应,根据实际情况进行处理
                if (response.IsSuccessStatusCode)
                {
                    Console.WriteLine(result);
                }
                else
                {
                    Console.WriteLine($"Error: {response.StatusCode} - {result}");
                }
            }
        }
        catch (Exception ex)
        {
            // 处理异常,例如记录到日志
            Console.WriteLine($"Error: {ex.Message}");
        }
    }

}


以上我获取的是所有部门里的用户ID,你可以获取自己的

接口以及方法我写好了

如果有不懂就点点赞,私信我也可以。希望帮助到你

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着牛的奇兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值