1. 程式人生 > >釘釘開發系列(一)access_token的獲取

釘釘開發系列(一)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已經獲取成功。

歡迎打描左側二維碼打賞。

轉載請註明出處。