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


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

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

    App.config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <appSettings>
        <add key="CorpID" value="AAAAAA"/>
        <add key="corpSecret" value="111111"/>
      </appSettings>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
    
    Web.config
    <?xml version="1.0" encoding="utf-8"?>
    
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <customErrors mode="Off" />
      </system.web>
      <appSettings>
        <add key="CorpID" value="AAAAAA" />
        <add key="corpSecret" value="111111" />
      </appSettings>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    
    </configuration>
    

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

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Text;
    
    namespace DDSDK
    {
        public class ConfigHelper
        {
            #region FetchCorpID Function  
            /// <summary>
            /// 获取CorpID
            /// </summary>
            /// <returns></returns>
            public static String FetchCorpID()
            {
                return FetchValue("CorpID");
            }
            #endregion
    
            #region FetchCorpSecret Function
            /// <summary>
            /// 获取CorpSecret
            /// </summary>
            /// <returns></returns>
            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的类来存储票据

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

     /// <summary>
            /// 创建静态字段,保证全局一致
            /// </summary>
            public static AccessToken AccessToken = new AccessToken();
    
            #region UpdateAccessToken
            /// <summary>
            ///更新票据
            /// </summary>
            /// <param name="forced">true:强制更新.false:按缓存是否到期来更新</param>
            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<TokenResult>(resultJson);
                if (tokenResult.ErrCode== ErrCodeEnum.OK)
                {
                    AccessToken.Value = tokenResult.Access_token;
                    AccessToken.Begin = DateTime.Now;
                }
            }
            #endregion
    为了能将获取的JSON串直接反序列化成类,我们又定义了TokenResult的类。

            public class TokenResult
            {
                /// <summary>
                /// 错误码
                /// </summary>
                public ErrCodeEnum ErrCode { get; set; } = ErrCodeEnum.Unknown;
    
                /// <summary>
                /// 错误消息
                /// </summary>
                public string ErrMsg { get; set; }
    
                public string Access_token { get; set; }
            }
    将请求返回的错误码定义成枚举,代码如下

     public enum ErrCodeEnum
        {
            OK = 0,
    
            VoildAccessToken = 40014,
    
            /// <summary>
            /// 未知
            /// </summary>
            Unknown = int.MaxValue
        }

    下面是测试截图

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

    至此,access_token已经获取成功。

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

    转载请注明出处。






  • 相关阅读:
    文本框只能输入数字
    Excel 文件读取
    C# 时间格式
    window 锁屏
    窗体程序 (控件随窗体变化而变化)
    dataGridView操作数据(增加 读取 绑定 获取选择的单元格 选中整行单元格时颜色变换 更新数据 锁定列的位置 添加行 列头的方法)
    集合
    登录窗体关闭 show() showDialog()
    查询字符串中字母出现的个数
    pytorch F.cross_entropy(x,y)理解
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7604934.html
Copyright © 2020-2023  润新知