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

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

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

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

二 创建微应用

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

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

 

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

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

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

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

4    创建即可

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

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

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

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

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

 

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

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

    <script type="type/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
   <script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>

然后编写

 <script type="text/javascript">

dd.ready(function () {
            dd.runtime.permission.requestAuthCode({
                corpId: “上面准备资料微应用中  二.6 信息”,
                onSuccess: function (result) {
                   var code= result.code;  //获取的免登授权码,用于获取用户id
                    $.ajax({
                        url: "ceshi.ashx",//授权码传入后台,后台操作
                        type: "GET",
                        contentType: "application/json",
                        dataType: "text",
                        data: { code: code },
                        success: function (name) {
                            alert(name);  //弹出当前用户名字
                        },
                        error: function (err) {
                            alert(err);
                        }

                    });
                }
            });
        });

 </script>

2  ceshi.ashx

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

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; }
            /// <summary>
            /// 手机设备号,由钉钉在安装时随机产生
            /// </summary>
            public string deviceId { get; set; }
            /// <summary>
            /// 是否是管理员
            /// </summary>
            public string is_sys { get; set; }

            /// <summary>
            /// 级别,0:非管理员 1:超级管理员(主管理员) 2:普通管理员(子管理员) 100:老板
            /// </summary>
            public string sys_level { get; set; }
        }

public class Dingding_User
        {
            public string errcode;
            public string errmsg;
            public string userid;
            /// <summary>
            /// 成员名称
            /// </summary>
            public string name;
            /// <summary>
            /// 分机号(仅限企业内部开发调用)
            /// </summary>
            public string tel;
            /// <summary>
            /// 办公地点(ISV不可见)
            /// </summary>
            public string workPlace;
            /// <summary>
            /// 备注(ISV不可见)
            /// </summary>
            public string remark;
            /// <summary>
            /// 手机号码(ISV不可见)
            /// </summary>
            public string mobile;
            /// <summary>
            /// 员工的电子邮箱(ISV不可见)
            /// </summary>
            public string email;
            /// <summary>
            /// 员工的企业邮箱,如果员工已经开通了企业邮箱,接口会返回,否则不会返回(ISV不可见)
            /// </summary>
            public string orgEmail;
            /// <summary>
            /// 是否已经**, true表示已**, false表示未**
            /// </summary>
            public bool active;
            /// <summary>
            /// 在对应的部门中的排序, Map结构的json字符串, key是部门的Id, value是人员在这个部门的排序值
            /// </summary>
            public string orderInDepts;
            /// <summary>
            /// 是否为企业的管理员, true表示是, false表示不是
            /// </summary>
            public bool isAdmin;
            /// <summary>
            /// 是否为企业的老板, true表示是, false表示不是(【设置负责人】:主管理员登陆钉钉手机客户端 -【通讯录】-【企业名后面的管理】-【企业通讯录】-【负责人设置】进行添加则可。)
            /// </summary>
            public bool isBoss;
            /// <summary>
            /// 钉钉Id,在钉钉全局范围内标识用户的身份(不可修改
            /// </summary>
            public string dingId;
            public string unionid;
            /// <summary>
            /// 在对应的部门中是否为主管, Map结构的json字符串, key是部门的Id, value是人员在这个部门中是否为主管, true表示是, false表示不是
            /// </summary>
            public string isLeaderInDepts;
            /// <summary>
            /// 是否号码隐藏, true表示隐藏, false表示不隐藏
            /// </summary>
            public bool isHide;
            /// <summary>
            /// 成员所属部门id列表
            /// </summary>
            public string[] department;
            /// <summary>
            /// 职位信息
            /// </summary>
            public string position;
            /// <summary>
            /// 头像url
            /// </summary>
            public string avatar;

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

            ///// <summary>
            ///// 角色信息(ISV不可见),json数组格式
            ///// </summary>
            //public Roles roles;

            /// <summary>
            /// 手机号码区号
            /// </summary>
            public string stateCode;

            /// <summary>
            /// 是否是高管
            /// </summary>
            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;
        /// <summary>
        /// 更新AccessToken
        /// </summary>
        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<AccessTokenModel>(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
    {
        /// <summary>
        /// 读取缓存数据
        /// </summary>
        /// <param name="cacheKey">键</param>
        /// <returns></returns>
        public static object GetCache(string cacheKey)
        {
            var objCache = HttpRuntime.Cache.Get(cacheKey);
            return objCache;
        }
       /// <summary>
        /// 设置缓存数据
        /// </summary>
        /// <param name="cacheKey">键</param>
        /// <param name="content">值</param>
        public static void SetCache(string cacheKey, object content)
        {
            var objCache = HttpRuntime.Cache;
            objCache.Insert(cacheKey, content);
        }
       /// <summary>
        /// 设置缓存数据并且设置默认过期时间
        /// </summary>
        /// <param name="cacheKey"></param>
        /// <param name="content"></param>
        /// <param name="timeOut"></param>
        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;
            }
        }
       /// <summary>
        /// 移除指定缓存
        /// </summary>
        /// <param name="cacheKey">键</param>
        public static void RemoveAllCache(string cacheKey)
        {
            var objCache = HttpRuntime.Cache;
            objCache.Remove(cacheKey);
        }
       /// <summary>
        /// 删除全部缓存
        /// </summary>
        public static void RemoveAllCache()
        {
            var objCache = HttpRuntime.Cache;
            var cacheEnum = objCache.GetEnumerator();
            while (cacheEnum.MoveNext())
            {
                objCache.Remove(cacheEnum.Key.ToString());
            }
        }
   }

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

  /// <summary>
        /// 获取用户的信息userid
        /// </summary>
        /// <param name="code"></param>
        /// <returns></returns>
        public static string getUserinfo(string code)
        {
            GetAccessToken();
            dd_userid = JsonConvert.DeserializeObject<Access_UserInfo>(Request("user/getuserinfo?access_token=" + dd_accesstoken + "&code="+code, "GET")).userid;
            return dd_userid;

 

        }
        /// <summary>
        /// 获取用户详细信息name
        /// </summary>
        /// <returns></returns>
        public static string getUserDetail()
        {
            string result =JsonConvert.DeserializeObject<Dingding_User>(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# 开发企业内部微应用接入钉钉获取用户信息

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