钉钉开发系列(一)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已经获取成功。
欢迎打描左侧二维码打赏。
转载请注明出处。

浙公网安备 33010602011771号