钉钉开发系列(一)access_token的获取

钉钉的官网上有java、php、nodejs版的Demo,就是没有当下比较盛行的语言C#的,而我们又需要采用C#来开发,于是只得自己来整。钉钉的开发方式和微信的开发方式大体上是一致的,特别是在客户端,直接用微信的weui都没有问题。所以如果有微信开发经验的会比较容易上手。

要进行钉钉开发,先要注册,之后得到corpId和corpSecret,然后利用这两个值来得到最重要的数据access_token。为了方便配置和使用,我们将corpId和corpSecret放到了配置文件中,WinForm下可以放到App.conf中,Web下可以放到Web.config中。如下

App.config



  
    
    
  

Web.config





  
    
    
  
  
    
    
  
  
    
      
        
        
      
    
  


这里我们定义一个ConfigHelper类来获取这两个数据。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;

namespace DDSDK
{
    public class ConfigHelper
    {
        #region FetchCorpID Function  
        /// 
        /// 获取CorpID
        /// 
        /// 
        public static String FetchCorpID()
        {
            return FetchValue("CorpID");
        }
        #endregion

        #region FetchCorpSecret Function
        /// 
        /// 获取CorpSecret
        /// 
        /// 
        public static String FetchCorpSecret()
        {
            return FetchValue("CorpSecret");
        }
        #endregion   

        #region FetchValue Function              
        private static String FetchValue(String key)
        {
            String value = ConfigurationManager.AppSettings[key];
            if (value == null)
            {
                throw new Exception($"{key} is null.请确认配置文件中是否已配置.");
            }
            return value;
        }
        #endregion
    }
}
我们定义一个AccessToken的类来存储票据

/// 
    /// 访问票据
    /// 
    public class AccessToken
    {
        /// 
        /// 票据的值
        /// 
        public String Value { get; set; }

        /// 
        /// 票据的开始时间
        /// 
        public DateTime Begin { get; set; } = DateTime.Parse("1970-01-01");        
    }
获取票据(项目中需要引用Newtonsoft.Json,建议使用nuget来安装,可以很好的解决兼容性)

 /// 
        /// 创建静态字段,保证全局一致
        /// 
        public static AccessToken AccessToken = new AccessToken();

        #region UpdateAccessToken
        /// 
        ///更新票据
        /// 
        /// true:强制更新.false:按缓存是否到期来更新
        public static void UpdateAccessToken(bool forced = false)
        {         
           //ConstVars.CACHE_TIME是缓存时间(常量,也可放到配置文件中),这样在有效期内则直接从缓存中获取票据,不需要再向服务器中获取。
           if (!forced && AccessToken.Begin.AddSeconds(ConstVars.CACHE_TIME) >= DateTime.Now)
            {//没有强制更新,并且没有超过缓存时间
                return;
            }

            string CorpID = ConfigHelper.FetchCorpID();
            string CorpSecret = ConfigHelper.FetchCorpSecret();
            string TokenUrl = Urls.gettoken;
            string apiurl = $"{TokenUrl}?{Keys.corpid}={CorpID}&{Keys.corpsecret}={CorpSecret}";

            WebRequest request = WebRequest.Create(@apiurl);
            request.Method = "GET";
            WebResponse response = request.GetResponse();
            Stream stream = response.GetResponseStream();
            Encoding encode = Encoding.UTF8;
            StreamReader reader = new StreamReader(stream, encode);
            string resultJson = reader.ReadToEnd();

            TokenResult tokenResult=JsonConvert.DeserializeObject(resultJson);
            if (tokenResult.ErrCode== ErrCodeEnum.OK)
            {
                AccessToken.Value = tokenResult.Access_token;
                AccessToken.Begin = DateTime.Now;
            }
        }
        #endregion
为了能将获取的JSON串直接反序列化成类,我们又定义了TokenResult的类。

        public class TokenResult
        {
            /// 
            /// 错误码
            /// 
            public ErrCodeEnum ErrCode { get; set; } = ErrCodeEnum.Unknown;

            /// 
            /// 错误消息
            /// 
            public string ErrMsg { get; set; }

            public string Access_token { get; set; }
        }
将请求返回的错误码定义成枚举,代码如下

 public enum ErrCodeEnum
    {
        OK = 0,

        VoildAccessToken = 40014,

        /// 
        /// 未知
        /// 
        Unknown = int.MaxValue
    }

下面是测试截图

钉钉开发系列(一)access_token的获取_第1张图片

其中ApiTool是一个静态的类,在UpdateAccessToken方法中会去更新AccessToken,具体可以参看《钉钉开发系列(二)结构封装》的UpdateAccessToken方法。在ApiTool内部定义了一个AccessToken的静态变量,用于缓存票据,在UpdateAccessToken的时候会更新AccessToken。

至此,access_token已经获取成功。

欢迎打描左侧二维码打赏。

转载请注明出处。






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