C# 开发企业内部微应用接入钉钉获取用户信息

一 首先从下面的网址中下载钉钉RC开发版,然后登录账户为开发者模式(需要系统管理员开通)

https://open-doc.dingtalk.com/doc2/detail?spm=0.0.0.0.O5MWZ8&treeId=176&articleId=104958&docType=1

二 创建微应用

     1 登录账户后,单击---工作---应用中心----管理应用-----进入管理后台

D1PKhzuRSyNxAAAAAElFTkSuQmCC

 

2   进入后台--工作台---自建应用

C# 开发企业内部微应用接入钉钉获取用户信息_第1张图片

3   填写所需的信息----下一步

            C# 开发企业内部微应用接入钉钉获取用户信息_第2张图片

4    创建即可

C# 开发企业内部微应用接入钉钉获取用户信息_第3张图片

 5  可以获取到appkey和appsecret (这两个后面用于获取token)

                           C# 开发企业内部微应用接入钉钉获取用户信息_第4张图片

6     CorpId 这个后面也会用到,这些信息都先准备好

C# 开发企业内部微应用接入钉钉获取用户信息_第5张图片

 

三  前期准备工作已经完成,下面就是编写代码

   1  前台获取免登授权码         前台页面ceshi.aspx中需要引入三个js

   
   
  

然后编写

 

2  ceshi.ashx

C# 开发企业内部微应用接入钉钉获取用户信息_第6张图片

3  DingD类

1   先定义几个实体类(用于存放token,用户信息等)

 public class AccessTokenModel
        {
            public string access_token { get; set; }

            public int errcode { get; set; }

            public string errmsg { get; set; }
        }
        public class Access_UserInfo
        {
            public string errcode { get; set; }
            public string errmsg { get; set; }
            public string userid { get; set; }
            ///


            /// 手机设备号,由钉钉在安装时随机产生
            ///

            public string deviceId { get; set; }
            ///
            /// 是否是管理员
            ///

            public string is_sys { get; set; }

            ///


            /// 级别,0:非管理员 1:超级管理员(主管理员) 2:普通管理员(子管理员) 100:老板
            ///

            public string sys_level { get; set; }
        }

public class Dingding_User
        {
            public string errcode;
            public string errmsg;
            public string userid;
            ///


            /// 成员名称
            ///

            public string name;
            ///
            /// 分机号(仅限企业内部开发调用)
            ///

            public string tel;
            ///
            /// 办公地点(ISV不可见)
            ///

            public string workPlace;
            ///
            /// 备注(ISV不可见)
            ///

            public string remark;
            ///
            /// 手机号码(ISV不可见)
            ///

            public string mobile;
            ///
            /// 员工的电子邮箱(ISV不可见)
            ///

            public string email;
            ///
            /// 员工的企业邮箱,如果员工已经开通了企业邮箱,接口会返回,否则不会返回(ISV不可见)
            ///

            public string orgEmail;
            ///
            /// 是否已经激活, true表示已激活, false表示未激活
            ///

            public bool active;
            ///
            /// 在对应的部门中的排序, Map结构的json字符串, key是部门的Id, value是人员在这个部门的排序值
            ///

            public string orderInDepts;
            ///
            /// 是否为企业的管理员, true表示是, false表示不是
            ///

            public bool isAdmin;
            ///
            /// 是否为企业的老板, true表示是, false表示不是(【设置负责人】:主管理员登陆钉钉手机客户端 -【通讯录】-【企业名后面的管理】-【企业通讯录】-【负责人设置】进行添加则可。)
            ///

            public bool isBoss;
            ///
            /// 钉钉Id,在钉钉全局范围内标识用户的身份(不可修改
            ///

            public string dingId;
            public string unionid;
            ///
            /// 在对应的部门中是否为主管, Map结构的json字符串, key是部门的Id, value是人员在这个部门中是否为主管, true表示是, false表示不是
            ///

            public string isLeaderInDepts;
            ///
            /// 是否号码隐藏, true表示隐藏, false表示不隐藏
            ///

            public bool isHide;
            ///
            /// 成员所属部门id列表
            ///

            public string[] department;
            ///
            /// 职位信息
            ///

            public string position;
            ///
            /// 头像url
            ///

            public string avatar;

            ///


            /// 入职时间
            ///

            public string hiredDate;
            ///
            /// 员工工号
            ///

            public string jobnumber;
            ///
            /// 扩展属性,可以设置多种属性(但手机上最多只能显示10个扩展属性,具体显示哪些属性,请到OA管理后台->设置->通讯录信息设置和OA管理后台->设置->手机端显示信息设置)
            ///

            public string extattr;

            /


            / 角色信息(ISV不可见),json数组格式
            /

            //public Roles roles;

            ///


            /// 手机号码区号
            ///

            public string stateCode;

            ///


            /// 是否是高管
            ///

            public string isSenior;
        }

2      然后获取access_token

        CacheHelper cacheHelper = new CacheHelper();
        public static  DateTime dd_accesstokentime;
        public static string dd_accesstoken;
        public static string dd_corpid;
        public static string dd_corpsecret;
        public static string dd_userid;
        ///


        /// 更新AccessToken
        ///

        public static void GetAccessToken()
        {
            object DDToken = CacheHelper.GetCache("dd_accesstoken");
            if (DDToken == null)
            {
                dd_corpid = "";//上面准备工作的appkey
                dd_corpsecret = "";//上面准备工作的appsecret


                //获取Token
                if (dd_accesstokentime == null || (DateTime.Now.Ticks - dd_accesstokentime.Ticks) >= 5000)
                {
                    dd_accesstokentime = DateTime.Now;
                    dd_accesstoken = JsonConvert.DeserializeObject(Request("gettoken?appkey=" + dd_corpid + "&appsecret=" + dd_corpsecret, "GET")).access_token;
                }
                //Token存入缓存
                CacheHelper.SetCache("dd_accesstoken", dd_accesstoken, 115);

            }
            else
                dd_accesstoken = DDToken.ToString();
        }

3 由于token有时效性,不用每次都获取,只要在官方token失效内,所以才有了缓存类CacheHelper(网上可搜索到该类)

public class CacheHelper
    {
        ///


        /// 读取缓存数据
        ///

        ///
        ///
        public static object GetCache(string cacheKey)
        {
            var objCache = HttpRuntime.Cache.Get(cacheKey);
            return objCache;
        }
       ///
        /// 设置缓存数据
        ///

        ///
        ///
        public static void SetCache(string cacheKey, object content)
        {
            var objCache = HttpRuntime.Cache;
            objCache.Insert(cacheKey, content);
        }
       ///
        /// 设置缓存数据并且设置默认过期时间
        ///

        ///
        ///
        ///
        public static void SetCache(string cacheKey, object content, int timeOut = 3600)
        {
            try
            {
                if (content == null)
                {
                    return;
                }
                var objCache = HttpRuntime.Cache;
                //设置绝对过期时间
                //绝对时间过期。DateTime.Now.AddSeconds(10)表示缓存在3600秒后过期,TimeSpan.Zero表示不使用平滑过期策略。
                objCache.Insert(cacheKey, content, null, DateTime.Now.AddSeconds(timeOut), TimeSpan.Zero, CacheItemPriority.High, null);
                //相对过期
                //DateTime.MaxValue表示不使用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没有访问就过期。
                //objCache.Insert(cacheKey, objObject, null, DateTime.MaxValue, timeout, CacheItemPriority.NotRemovable, null); 
            }
            catch (Exception)
            {
               throw;
            }
        }
       ///
        /// 移除指定缓存
        ///

        ///
        public static void RemoveAllCache(string cacheKey)
        {
            var objCache = HttpRuntime.Cache;
            objCache.Remove(cacheKey);
        }
       ///
        /// 删除全部缓存
        ///

        public static void RemoveAllCache()
        {
            var objCache = HttpRuntime.Cache;
            var cacheEnum = objCache.GetEnumerator();
            while (cacheEnum.MoveNext())
            {
                objCache.Remove(cacheEnum.Key.ToString());
            }
        }
   }

4      下面就是获取用户id和用户信息方法

  ///


        /// 获取用户的信息userid
        ///

        ///
        ///
        public static string getUserinfo(string code)
        {
            GetAccessToken();
            dd_userid = JsonConvert.DeserializeObject(Request("user/getuserinfo?access_token=" + dd_accesstoken + "&code="+code, "GET")).userid;
            return dd_userid;

 

        }
        ///


        /// 获取用户详细信息name
        ///

        ///
        public static string getUserDetail()
        {
            string result =JsonConvert.DeserializeObject(Request("user/get?access_token=" + dd_accesstoken + "&userid=" + dd_userid, "GET")).name;
            return result;
        }


        public static string Request(string url, string method)
        {
            string urld = "https://oapi.dingtalk.com/";
            WebRequest request = WebRequest.Create(urld+url);
            WebResponse response=request.GetResponse();
            Stream stream=response.GetResponseStream();
            StreamReader reader=new StreamReader(stream);
            string content=reader.ReadToEnd();
            return content;
        }

四 然后把网站发布到服务器上,然后打开钉钉--工作---自己新建的应用----弹出钉钉当前的用户姓名

C# 开发企业内部微应用接入钉钉获取用户信息_第7张图片

以上就是通过钉钉开发微应用获取免登码以及用户信息

你可能感兴趣的:(C#)