钉钉接口 给用户发钉盘文件消息
步骤概括:
- 创建一个用于企业内部开发的H5微应用。将文件发送给指定用户,用户将收到以次应用名义发送的一条文件消息
- 服务端调用“单步上传文件”接口,上传文件获取mediaId
- 服务端调用“发送钉盘文件给指定用户”接口,把钉盘文件当做消息内容发送给用户
这里省略创建微应用的步骤。
步骤1:获取access_token (GET)
请求地址:https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret
返回说明
{ "errcode": 0, "errmsg": "ok", "access_token": "fw8ef8we8f76e6f7s8df8s" }
步骤2:调用“单步上传文件”接口,上传文件获取mediaId (POST)
文件大小 取字节;
返回说明
{ "media_id": "xxxxxxxx", "errcode":0, "errmsg":"ok" }
步骤3:发送钉盘文件给指定用户(POST)
media_id 和file_name需要转成urlEncode格式,{"errcode":40007,"errmsg":"不合法的媒体文件id"}除了media_id 不存在、为空,还有一个原因是因为没有转格式
引用 System.Web.HttpUtility;
HttpUtility.UrlEncode(" 内容 ");
返回结果
{ "errcode":0, "errmsg":"ok" }
下面贴上代码:
using System.Text; using System.IO; using System.Data; using System.Collections; using TWays.Core.DBAccess; using Newtonsoft.Json; public class DDManager { #region 公共方法 /// <summary> /// 记录日志 /// </summary> /// <param name="strMsg"></param> private void Logger(string strMsg) { string strFilePath = System.Windows.Forms.Application.StartupPath + "\\" + StaticConst.WxSendLog; TWays.Core.Loger.LogMessage(strFilePath, strMsg, true); } //我这里是把钉钉的一些信息存在了数据库里 //像APP_KEY、APP_SECRET之类的,根据自己定义的类型读取信息 private DataSet GetValue(string type) { DataSet dr = DataAdapter.Query(string.Format(SqlText.selectDDTypeValue.ToUpper(), type)); return dr; } #endregion #region 获取配置信息 /// <summary> /// 获取微应用名称 /// </summary> /// <returns></returns> public string GetAppMicorName(string type) { DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["DIC_NAME"]); } /// <summary> /// 获取APP_KEY /// </summary> /// <returns></returns> public string GetDDAppKey(string type) { //return GetConfigValue(StaticConst.WX_APP_ID); DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["APP_KEY"]); } /// <summary> /// 获取APP_SECRET /// </summary> /// <returns></returns> public string GetDDAppSecret(string type) { //return GetConfigValue(StaticConst.WX_APP_SECRET); DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["APP_SECRET"]); } /// <summary> /// 获取微应用id AGEN_ID /// </summary> /// <returns></returns> public string GetDDAgenId(string type) { //return GetConfigValue(StaticConst.WX_QY_CORP_ID); DataSet ds = GetValue(type); if (ds.Tables[0].Rows.Count < 0) return null; return TWays.Utils.ToString(ds.Tables[0].Rows[0]["AGEN_ID"]); } /// <summary> /// 获取配置信息 /// </summary> /// <param name="strKey"></param> /// <returns></returns> public string GetConfigValue(string strKey) { string strKeyValue = string.Empty; strKeyValue = TWays.Utils.ToString(System.Configuration.ConfigurationManager.AppSettings[strKey]); return strKeyValue; } #endregion #region 获取POST消息 /// <summary> /// 获取post返回来的数据 /// </summary> /// <returns></returns> public static string PostInput() { Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); return Encoding.UTF8.GetString(b); } #endregion #region 获取企业号AccessToken public string GetQyAccessToken(string type) { string QY_AppKey = this.GetDDAppKey(type);//钉钉的APP_KEY string QY_AppSecret = this.GetDDAppSecret(type);// string url = string.Format("https://oapi.dingtalk.com/gettoken?appkey={0}&appsecret={1}", QY_AppKey, QY_AppSecret); return ToAccessTokenJson(HttpRequestUtil.GetAppPage(url, 5000, Encoding.UTF8)); } public string ToAccessTokenJson(string val) { AccessToken deserializedToken = (AccessToken)JavaScriptConvert.DeserializeObject(val, typeof(AccessToken)); return deserializedToken.access_token; } #endregion #region 获取MediaId public string GetQyMediaId(string type, decimal size, string path) { string QY_MediaId = string.Empty; string strAccessToken = this.GetQyAccessToken(type); string strAgenId = this.GetDDAgenId(type); string url = string.Format("https://oapi.dingtalk.com/file/upload/single?access_token={0}&agent_id={1}&file_size={2}", strAccessToken, strAgenId, size); QY_MediaId = ToAccessMediaId(HttpRequestUtil.HttpPosturl(path, url)); return QY_MediaId; } public string ToAccessMediaId(string val) { ThumbMedia deserializedMediaId = (ThumbMedia)JavaScriptConvert.DeserializeObject(val, typeof(ThumbMedia)); return deserializedMediaId.media_id; } #endregion #region 获取用户id(判断用户是否存在) public string GetQyUserId(string token, string userId) { string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", token, userId); return ToUserJson(HttpRequestUtil.GetAppPage(url, 5000, Encoding.UTF8)); } public string ToUserJson(string val) { Hashtable t = (Hashtable)JavaScriptConvert.DeserializeObject(val, typeof(Hashtable)); if (t["errcode"].ToString() == "0") { return t["userid"].ToString(); } return ""; //User deserializedToken = (User)JavaScriptConvert.DeserializeObject(val, typeof(User)); //return deserializedToken.userid; } #endregion }