釘釘的官網上有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已經獲取成功。
歡迎打描左側二維碼打賞。
轉載請注明出處。