獲取釘釘的信息,需要許多請求,也就有許多URL,所以在項目新建一個類,保存所有用到的URL。
namespace DDHelper
{
public sealed class Urls
{
/// <summary>
/// 創建會話
/// </summary>
public const string chat_create="https://oapi.dingtalk.com/chat/create";
/// <summary>
/// 獲取會話信息
/// </summary>
public const string chat_get="https://oapi.dingtalk.com/chat/get";
/// <summary>
/// 發送會話消息
/// </summary>
public const string chat_send="https://oapi.dingtalk.com/chat/send";
/// <summary>
/// 更新會話消息
/// </summary>
public const string chat_update="https://oapi.dingtalk.com/chat/update";
/// <summary>
/// 獲取部門列表
/// </summary>
public const string department_list="https://oapi.dingtalk.com/department/list";
/// <summary>
/// 根據部門ID獲取部門下人員信息
/// </summary>
public const string department_user="https://oapi.dingtalk.com/user/simplelist";
/// <summary>
/// 獲取訪問票記
/// </summary>
public const string gettoken="https://oapi.dingtalk.com/gettoken";
/// <summary>
/// 發送消息
/// </summary>
public const string message_send="https://oapi.dingtalk.com/message/send";
/// <summary>
/// 用戶列表
/// </summary>
public const string user_list="https://oapi.dingtalk.com/user/list";
/// <summary>
/// 用戶詳情
/// </summary>
public const string user_get="https://oapi.dingtalk.com/user/get";
/// <summary>
/// 獲取JSAPI的票據
/// </summary>
public const string get_jsapi_ticket="https://oapi.dingtalk.com/get_jsapi_ticket";
/// <summary>
/// 發起審批
/// </summary>
public const string get_Examination_and_approval="https://eco.taobao.com/router/rest";
}
}
獲取Tokan,也需要有接收類:
using System;
namespace DDHelper
{
/// <summary>
/// 訪問票據
/// </summary>
public class AccessToken
{
/// <summary>
/// 票據的值
/// </summary>
public string Value
{
get; set;
}
/// <summary>
/// 票據的開始時間
/// </summary>
public DateTime Begin
{
get;
set;
} = DateTime . Parse ( "1970-01-01" );
}
}
爲避免URL拼接的時候寫錯參數,新建一個小字典,保存拼接參數
namespace DDHelper
{
/// <summary>
/// Url的Key
/// </summary>
public sealed class Keys
{
/// <summary>
/// 企業id
/// </summary>
public const string corpid="corpid";
/// <summary>
/// 企業祕鑰
/// </summary>
public const string corpsecret="corpsecret";
/// <summary>
/// 開發者id
/// </summary>
public const string departmentID = "departmentID";
public const string userid = "userid";
public const string chatid = "chatid";
public const string access_token = "access_token";
public const string jsapi_ticket = "jsapi_ticket";
public const string noncestr = "noncestr";
public const string timestamp = "timestamp";
public const string url = "url";
}
}
先獲取Token
/// <summary>
/// 獲取token
/// </summary>
/// <param name="forced"></param>
private static void UpdateAccessToken (bool forced = false )
{
//ConstVars.CACHE_TIME是緩存時間(常量,也可放到配置文件中),這樣在有效期內則直接從緩存中獲取票據,不需要再向服務器中獲取。
if ( !forced && AccessToken . Begin . AddSeconds ( ConstVars . CACHE_TIME ) >= DateTime . Now )
{
return;
}
string apiurl = $"{Urls.gettoken}?{DDHelper . Keys . corpid}={AppSetting.corpid}&{DDHelper . Keys . corpsecret}={ AppSetting.corpsecret}";
TokenResult tokenResult = Analyze . Get<TokenResult> ( apiurl );
if ( tokenResult . ErrCode == ErrCodeEnum . OK )
{
AccessToken . Value = tokenResult . Access_token;
AccessToken . Begin = DateTime . Now;
}
}
接受獲取的Token,需要一個類:
namespace DDHelper
{
public class ResultPackage
{
public ErrCodeEnum ErrCode
{
get; set;
} = ErrCodeEnum . Unknown;
/// <summary>
/// 錯誤消息
/// </summary>
public string ErrMsg
{
get; set;
}
/// <summary>
/// 結果的Json形式
/// </summary>
public string Json
{
get;
set;
}
public bool IsOK ( )
{
return ErrCode == ErrCodeEnum . OK;
}
public override string ToString ( )
{
string info = $"{nameof ( ErrCode )}:{ErrCode},{nameof ( ErrMsg )}:{ErrMsg}";
return info;
}
}
}
namespace DDHelper
{
public class TokenResult :ResultPackage
{
public string Access_token
{
get; set;
}
}
}
封裝GET、POST請求的方法:
using System . Collections . Generic;
using System . IO;
using System . Net;
using System . Text;
namespace DDHelper
{
public class RequestHelper
{
/// <summary>
/// 執行基本的命令方法,以GET方法
/// </summary>
/// <param name="apiurl"></param>
/// <returns></returns>
public static string Get ( string apiurl )
{
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 ( );
return resultJson;
}
/// <summary>
/// 以post方式提交命令
/// </summary>
/// <param name="apiurl"></param>
/// <param name="jsonString"></param>
/// <returns></returns>
public static string Post ( string apiurl ,string jsonString )
{
WebRequest requset = WebRequest . Create ( @apiurl );
requset . Method = "POST";
requset . ContentType = "application/json";
byte [ ] bs = Encoding . UTF8 . GetBytes ( jsonString );
requset . ContentLength = bs . Length;
Stream newStream = requset . GetRequestStream ( );
newStream . Write ( bs ,0 ,bs . Length );
newStream . Close ( );
WebResponse response = requset . GetResponse ( );
Stream stream = response . GetResponseStream ( );
Encoding encode = Encoding . UTF8;
StreamReader reader = new StreamReader ( stream ,encode );
string resultJson = reader . ReadToEnd ( );
return resultJson;
}
/// <summary>
/// 以POST方式提交機器人消息
/// </summary>
/// <param name="apiurl">請求的URL</param>
/// <param name="jsonString">請求的json參數</param>
/// <param name="headers">請求的key-value字典</param>
/// <returns></returns>
public static string Post ( string apiurl ,string jsonString ,Dictionary<string ,string> headers = null )
{
WebRequest request = WebRequest . Create ( @apiurl );
request . Method = "POST";
request . ContentType = "application/json";
if ( headers != null )
{
foreach ( var keyValue in headers )
{
if ( keyValue . Key == "Content-Type" )
{
request . ContentType = keyValue . Value;
continue;
}
request . Headers . Add ( keyValue . Key ,keyValue . Value );
}
}
if ( string . IsNullOrEmpty ( jsonString ) )
{
request . ContentLength = 0;
}
else
{
byte [ ] bs = Encoding . UTF8 . GetBytes ( jsonString );
request . ContentLength = bs . Length;
Stream newStream = request . GetRequestStream ( );
newStream . Write ( bs ,0 ,bs . Length );
newStream . Close ( );
}
WebResponse response = request . GetResponse ( );
Stream stream = response . GetResponseStream ( );
Encoding encode = Encoding . UTF8;
StreamReader reader = new StreamReader ( stream ,encode );
string resultJson = reader . ReadToEnd ( );
return resultJson;
}
}
}
將接收的json串,轉成我們需要的類,方便處理:
using Newtonsoft . Json;
using System;
using System . Collections . Generic;
using System . IO;
using System . Xml;
using System . Xml . Serialization;
namespace DDHelper
{
public class XmlUtil
{
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type"></param>
/// <param name="xml"></param>
/// <returns></returns>
public static object Deserialize ( Type type ,string xml )
{
try
{
using ( StringReader sr = new StringReader ( xml ) )
{
XmlSerializer xmldes = new XmlSerializer ( type );
return xmldes . Deserialize ( sr );
}
}
catch ( Exception ex )
{
throw new Exception ( ex . Message );
}
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type"></param>
/// <param name="stream"></param>
/// <returns></returns>
public static object Deserialize ( Type type ,Stream stream )
{
XmlSerializer xmldex = new XmlSerializer ( type );
return xmldex . Deserialize ( stream );
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="type"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static string Serializer ( Type type ,object obj )
{
MemoryStream stream = new MemoryStream ( );
XmlSerializer xml = new XmlSerializer ( type );
try
{
//序列化對象
xml . Serialize ( stream ,obj );
}
catch ( Exception )
{
throw;
}
stream . Position = 0;
StreamReader sr = new StreamReader ( stream );
string str = sr . ReadToEnd ( );
sr . Dispose ( );
stream . Dispose ( );
return str;
}
/// <summary>
/// 讀取xml,得到發送審批結果
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
public static ApprovalResult ReadXmlToApprovalResult ( string xml )
{
XmlDocument xmlDoc = new XmlDocument ( );
xmlDoc . LoadXml ( xml );
XmlNodeList xn = xmlDoc . SelectNodes ( "//result" );
ApprovalResult appResu = new ApprovalResult ( );
foreach ( XmlElement element in xn )
{
appResu . ding_open_errcode = Convert . ToInt32 ( element . GetElementsByTagName ( "ding_open_errcode" ) [ 0 ] . InnerText );
appResu . request_id = string . Empty;
appResu . is_success = Convert . ToBoolean ( element . GetElementsByTagName ( "is_success" ) [ 0 ] . InnerText );
appResu . process_instance_id = element . GetElementsByTagName ( "process_instance_id" ) [ 0 ] . InnerText;
}
return appResu;
}
/// <summary>
/// 讀取xml,得到審批結果信息
/// </summary>
/// <param name="xml"></param>
/// <returns></returns>
public static List<ApprovalReceiveResult> ReadXmlToApprovalReceiveResult ( string xml )
{
XmlDocument xmlDoc = new XmlDocument ( );
xmlDoc . LoadXml ( xml );
XmlNodeList xn = xmlDoc . SelectNodes ( "//operation_records_vo" );
List<ApprovalReceiveResult> listApp = new List<ApprovalReceiveResult> ( );
foreach ( XmlElement element in xn )
{
ApprovalReceiveResult appResu = new ApprovalReceiveResult ( );
appResu . Date = Convert . ToDateTime ( element . GetElementsByTagName ( "date" ) [ 0 ] . InnerText );
appResu . OperationResult = element . GetElementsByTagName ( "operation_result" ) [ 0 ] . InnerText;
appResu . OperationType = element . GetElementsByTagName ( "operation_type" ) [ 0 ] . InnerText;
if ( element . ChildNodes . Count > 4 && element . ChildNodes . Item ( 3 ) . Name . Equals ( "remark" ) )
appResu . Remark = element . GetElementsByTagName ( "remark" ) [ 0 ] . InnerText;
else
appResu . Remark = string . Empty;
appResu . OperationUser = element . GetElementsByTagName ( "userid" ) [ 0 ] . InnerText;
listApp . Add ( appResu );
}
return listApp;
}
/// <summary>
/// 把Json轉爲實體類
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="result"></param>
/// <returns></returns>
public static List<T> JsonStringToObj<T> ( string result ) where T : class
{
List<T> list = new List<T> ( );
T t = JsonConvert . DeserializeObject<T> ( result );
list . Add ( t );
return list;
}
}
}
using System . Collections . Generic;
using Newtonsoft . Json;
namespace DDHelper
{
public class Analyze
{
/// <summary>
/// GET請求
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="requestUrl"></param>
/// <returns></returns>
public static T Get<T> ( string requestUrl ) where T : ResultPackage, new()
{
string resultJson = RequestHelper . Get ( requestUrl );
return AnalyzeResult<T> ( resultJson );
}
/// <summary>
/// POST請求
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="requestUrl"></param>
/// <param name="requestParamOfJsonStr"></param>
/// <returns></returns>
public static T POST<T> ( string requestUrl ,string requestParamOfJsonStr ) where T : ResultPackage, new()
{
string resultJson = RequestHelper . Post ( requestUrl ,requestParamOfJsonStr );
return AnalyzeResult<T> ( resultJson );
}
/// <summary>
/// 分析結果
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="resultJson"></param>
/// <returns></returns>
public static T AnalyzeResult<T> ( string resultJson ) where T : ResultPackage, new()
{
ResultPackage tempResult = null;
if ( !string . IsNullOrEmpty ( resultJson ) )
{
tempResult = JsonConvert . DeserializeObject<ResultPackage> ( resultJson );
}
T result = null;
if ( tempResult != null && tempResult . IsOK ( ) )
{
result = JsonConvert . DeserializeObject<T> ( resultJson );
}
else if ( tempResult != null )
{
result = tempResult as T;
}
else if ( tempResult == null )
{
result = new T ( );
}
result . Json = resultJson;
return result;
}
/// <summary>
/// POST機器人請求
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="apiurl"></param>
/// <param name="jsonString"></param>
/// <param name="headers"></param>
/// <returns></returns>
public static T POST<T> ( string apiurl ,string jsonString ,Dictionary<string ,string> headers = null ) where T : ResultPackage, new()
{
string resultJson = RequestHelper . Post ( apiurl ,jsonString ,headers );
return AnalyzeResult<T> ( resultJson );
}
}
}
上面都是爲獲取Token,及後面的請求做準備的基礎,下面獲取Token後,拼接獲取部門信息的URL
/// <summary>
/// 獲取url
/// </summary>
/// <param name="Url">url</param>
/// <param name="forceUpdate"></param>
/// <returns></returns>
private static string FormatApiUrlWithToken ( string Url ,bool forceUpdate = false )
{
//獲取token
UpdateAccessToken ( forceUpdate );
string apiurl = $"{Url}?{DDHelper . Keys . access_token}={AccessToken . Value}";
return apiurl;
}
得到Token之後,也得到了獲取部門的URL,下面就要獲取部門信息:
/// <summary>
/// 獲取部門信息並保存
/// </summary>
private void getDepartMentInfo ( )
{
string apiurl = FormatApiUrlWithToken ( Urls . department_list );
var result = Analyze . Get<DepartResultSet> ( apiurl );
List<DepartResultSet> list = XmlUtil . JsonStringToObj<DepartResultSet> ( result . Json );
if ( list . Count > 0 )
{
foreach ( DepartResultSet depart in list )
{
if ( depart . department . Count > 0 )
{
//保存部門信息到數據庫
isOk = _bll . SaveDepart ( depart . department );
if (isOk == false)
break;
}
}
}
if ( isOk == false )
{
Utility . LogHelper . WriteLog ( "部門信息保存失敗" );
}
}
上面有一個地方需要注意,部門獲取到了,也只是json串,所以需要轉成我們要的類(和獲取Token請求結果一樣,都繼承自ResultPackage類)
using System.Collections.Generic;
namespace DDHelper
{
public class DepartResultSet :ResultPackage
{
public List<Depart> department
{
get; set;
}
}
}
namespace DDHelper
{
public class Depart
{
/// <summary>
/// 部門id
/// </summary>
public string id
{
get; set;
}
/// <summary>
/// 部門名稱
/// </summary>
public string name
{
get; set;
}
/// <summary>
/// 父部門id,根部門爲1
/// </summary>
public string parentId
{
get; set;
}
/// <summary>
/// 是否同步創建一個關聯此部門的企業羣, true表示是, false表示不是
/// </summary>
public bool createDeptGroup
{
get; set;
}
/// <summary>
/// 當羣已經創建後,是否有新人加入部門會自動加入該羣, true表示是, false表示不是
/// </summary>
public bool autoAddUser
{
get; set;
}
}
}
到此處,部門信息就獲取到了,也保存到後臺了,需要的基礎類基本都有了,後面獲取其它信息就不用再建基礎類了