C# 钉钉api接口开发(三) 免登录及自动刷新AccessToken

每次打开微应用时,需要登录,根据接口文档做免登录处理.


获取 AccessToken 根据 AccessToken去获取免登录 Ticket 然后签名,部分字段返回前台交给钉钉效验,通过之后则返回 code 根据 code 获取用户编码 通过用户编码获取用户信息.


唯一碰到的坑就是 签名的结果需要小写.


贴代码  前面的也贴出来好了 这个是钉钉demo接口的实现代码


public static class DdHelper
    {
        private static String dd_autoaddress = ConfigurationManager.AppSettings["DD_autoaddress"];
        private static String dd_host = ConfigurationManager.AppSettings["DD_host"];
        private static String dd_corpid = ConfigurationManager.AppSettings["DD_corpid"];
        private static String dd_corpsecret = ConfigurationManager.AppSettings["DD_corpsecret"];
        private static String dd_accesstoken = string.Empty;
        private static DateTime dd_accesstokentime;
        public static String jsTicket = string.Empty;
        public static String nonce = string.Empty;
        public static String jsUrl = string.Empty;
        public static int timeStamp = 0;

        /// <summary>
        /// 免登录签名
        /// </summary>
        /// <returns></returns>
        public static String GetSign() {
            jsTicket = GetTicket();
            nonce = "ERFGYHSKHSGHERUTH56460srteh60846dagh=G";
            timeStamp = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds);
            jsUrl = dd_autoaddress;
            String plainTex = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonce + "&timeStamp=" + timeStamp + "&url=" + jsUrl;
            return BLL.Lib.EncryptUtil.Sha1(plainTex).ToLower();
        }

        /// <summary>
        /// 发起请求
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="data">数据</param>
        /// <param name="reqtype">请求类型</param>
        /// <returns></returns>
        private static String Request(string url,string data,string reqtype) {
                GetAccessToken();
                if (url.IndexOf('?') == -1 && url != "gettoken")
                    url += ("?access_token=" + dd_accesstoken);
                else if (url.IndexOf('?') > -1 && url.IndexOf("gettoken") == -1)
                    url += ("&access_token=" + dd_accesstoken);
            HttpWebRequest web = (HttpWebRequest)HttpWebRequest.Create(dd_host + url);
            web.ContentType = "application/json";
            web.Method = reqtype;            
            if (data.Length > 0 && reqtype.Trim().ToUpper() == "POST")
            {
                byte[] postBytes = Encoding.UTF8.GetBytes(data);
                web.ContentLength = postBytes.Length;
                using (Stream reqStream = web.GetRequestStream())
                {
                    reqStream.Write(postBytes, 0, postBytes.Length);
                }
            }
            string html = string.Empty;
            using (HttpWebResponse response = (HttpWebResponse)web.GetResponse())
            {
                Stream responseStream = response.GetResponseStream();
                StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8);
                html = streamReader.ReadToEnd();
            }
            return html;
        }
        /// <summary>
        /// 更新AccessToken
        /// </summary>
        public static void GetAccessToken()
        {
            if (dd_accesstokentime == null || (DateTime.Now.Ticks - dd_accesstokentime.Ticks) >= 5000)
            {
                dd_accesstokentime = DateTime.Now;
                dd_accesstoken = JsonConvert.DeserializeObject<AccessTokenMod>(Request("gettoken?corpid=" + dd_corpid + "&corpsecret=" + dd_corpsecret, "", "GET")).Access_Token;
            }
        }
        /// <summary>
        /// 获取免登录令牌
        /// </summary>
        /// <returns></returns>
        public static String GetTicket() {
            string json = Request("get_jsapi_ticket?type=jsapi", "", "GET");
            JObject jo = JsonConvert.DeserializeObject<JObject>(json);
            if (Convert.ToInt32(jo["errcode"]) == 0)
                return jo["ticket"].Value<String>();
            return "";
        }
        /// <summary>
        /// 获取部门列表
        /// </summary>
        /// <param name="id">上级部门编号 允许为空</param>
        /// <returns></returns>
        public static String GetDeptList(String id="") {
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值