C#+ashx+Js 獲取釘釘個人對話ID進行傳送訊息
阿新 • • 發佈:2019-01-30
Aspx頁面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebTestDingTalkApi.WebForm1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="jquery-1.8.2.min.js"></script> <script type="text/javascript" src="http://g.alicdn.com/dingding/open-develop/1.6.9/dingtalk.js"></script> <script src="app.js"></script> <script> //獲取會話ID只能用一次 var cid = ''; var fnReady = $(function () { var fnError = function () { alert("鑑權失敗"); }; var jsApiList = ["biz.chat.pickConversation", "biz.chat.chooseConversationByCorpId", "biz.chat.toConversation"]; global.configJsSdk(jsApiList, fnReady, fnError); }); </script> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="btnGroupSend" runat="server" Text="群訊息傳送" OnClick="btnGroupSend_Click" /> <asp:Button ID="btnFtFSend" runat="server" Text="部門群組、單個人訊息傳送" OnClick="btnFtFSend_Click" /> <asp:Button ID="btnPtSend" runat="server" Text="普通會話訊息傳送" OnClick="btnPtSend_Click" /> </div> </form> </body> </html>
app.js程式碼:
var global = { corpId: '', configJsSdk: function (jsApiList, fnReady, fnError) { /// <summary>配置微信的JSSDK</summary> /// <param name="jsApiList" type="function">要請求的api列表,以['biz.chat.chooseConversationByCorpId','biz.chat.toConversation']的形式</param> /// <param name="fnReady" type="function">dd.ready呼叫的函式</param> /// <param name="fnError" type="function">dd.error呼叫的函式</param> var url = window.location.href; alert(url); //從後臺取出jsapi-oauth配置資訊 var signRequest = { url:"Handler1.ashx?jsapi-oauth=oauth&href=" + url, type: 'GET', dataType: 'json', success: function (response, textStatus, jqXHR) { //獲取jsapi簽名成功 if( response != null) if (response.errcode =="OK" ) { try { global.corpId = response.corpId; const config = { agentId: response.agentId, corpId: response.corpId, timeStamp: response.timeStamp, nonceStr: response.nonceStr, signature: response.signature, jsApiList: jsApiList }; dd.config(config); // alert(JSON.stringify(config)); dd.ready(function () { alert('ready'); //根據corpid選擇會話獲取chatId //dd.biz.chat.chooseConversationByCorpId( // { // corpId: 'dingb6aa72b99615cb3c', //企業id // isConfirm: 'true', //是否彈出確認視窗,預設為true // onSuccess: function (data) { // alert(JSON.stringify(data)); // }, // onFail: function (err) { alert('dd error: ' + JSON.stringify(err)); } // }); //開啟與某個使用者的聊天頁面(單聊會話) //biz.chat.openSingleChat({ // corpId: 'dingb6aa72b99615cb3c', // 企業id // userId: 'xxx', // 使用者的工號 // onSuccess: function () { }, // onFail: function () { } //}) //會話資訊 dd.biz.chat.pickConversation({ corpId: global.corpId, //企業id isConfirm:'false', //是否彈出確認視窗,預設為true onSuccess: function (data) { alert("獲取"+data.cid); $.ajax({ type: "post", url: "Handler1.ashx", data: "FTTSendMessage=" + data.cid, datatype: "json", async: false, success: function (msg, textstatus, xmlhttprequest) { alert('會話 OK: ' + JSON.stringify(msg)); }, error: function (errorinfo) { alert("會話錯誤。"); } }); }, onFail: function () { } }); ////ding訊息 //dd.biz.ding.create({ // users: ['121820590530614633'],// 使用者列表,工號 // corpId: 'dingb6aa72b99615cb3c', // 企業id // type: 1, // 附件型別 1:image 2:link // alertType: 2, // 釘傳送方式 0:電話, 1:簡訊, 2:應用內 // alertDate: { "format": "yyyy-MM-dd HH:mm", "value": "2017-09-24 08:00" }, // attachment: { // images: [''], // }, // 附件資訊 // text: '星期一開會討論周發注事情', // 正文 // bizType: 0, // 業務型別 0:通知DING;1:任務;2:會議; // confInfo: { // bizSubType: 0, // 子業務型別如會議:0:預約會議;1:預約電話會議;2:預約視訊會議;(注:目前只有會議才有子業務型別) // location: '某某會議室', //會議地點;(非必填) // startTime: { "format": "yyyy-MM-dd HH:mm", "value": "2017-09-24 08:00" },// 會議開始時間 // endTime: { "format": "yyyy-MM-dd HH:mm", "value": "2017-09-24 09:00" }, // 會議結束時間 // remindMinutes: 30, // 會前提醒。單位分鐘-1:不提醒;0:事件發生時提醒;5:提前5分鐘;15:提前15分鐘;30:提前30分鐘;60:提前1個小時;1440:提前一天; // remindType: 2 // 會議提前提醒方式。0:電話, 1:簡訊, 2:應用內 // }, // //taskInfo: { // // ccUsers: ['100', '101'], // 抄送使用者列表,工號 // // deadlineTime: { "format": "yyyy-MM-dd HH:mm", "value": "2015-05-09 08:00" }, // 任務截止時間 // // taskRemind: 30// 任務提醒時間,單位分鐘0:不提醒;15:提前15分鐘;60:提前1個小時;180:提前3個小時;1440:提前一天; // //}, // onSuccess: function (info) { // alert('ding OK: ' + JSON.stringify(info)); // //onSuccess將在點擊發送之後呼叫 // }, // onFail: function (err) { alert('ding error: ' + JSON.stringify(err)); } //}) }); dd.error(function (err) { if (err == null) { alert('dd error: ' + JSON.stringify(err)); } else { fnError(); } }); } catch (e) { alert('dd error: ' + JSON.stringify(e)); } //global.corpId = response.corpId; //const config = { // agentId: response.agentId || '', // corpId: corpId || '', // timeStamp: response.timeStamp || '', // nonceStr: response.nonceStr || '', // signature: response.signature || '', // jsApiList: jsApiList || [] //}; //dd.config(config); //alert(JSON.stringify(config)); //dd.ready(function () { // if (fnReady != null) { // fnReady(); // } //}); //dd.biz.chat.chooseConversationByCorpId({ // corpId: 'dingb6aa72b99615cb3c', //企業id // // isConfirm:'true', //是否彈出確認視窗,預設為true // onSuccess: function (data) { // alert(JSON.stringify(data)); // }, // onFail: function () { } //}); //dd.error(function (err) { // if (err == null) { // alert('dd error: ' + JSON.stringify(err)); // } // else { // fnError(); // } //}); } else//簽名失敗彈出提示資訊 { alert(JSON.stringify(response.errmsg) + 'sign'); } }, error: function () { } }; $.ajax(signRequest); } }
config 配置釘釘公司開放賬號、密匙和應用ID
<?xml version="1.0" encoding="utf-8"?> <!-- 有關如何配置 ASP.NET 應用程式的詳細資訊,請訪問 https://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <!-- 有關 web.config 更改的說明,請參見 http://go.microsoft.com/fwlink/?LinkId=235367。 可在 <httpRuntime> 標記上設定以下特性。 <system.Web> <httpRuntime targetFramework="4.5.1" /> </system.Web> --> <system.web> <compilation targetFramework="4.6.1" /> <httpRuntime /> <pages controlRenderingCompatibilityVersion="4.0" /> </system.web> <appSettings> <!--自己在釘釘建立應用的名義傳送訊息--> <add key="AgentID" value="12646174893" /> <!--釘釘中接收的部門id--> <add key="DeptID" value="2542023339" /> <!--釘釘中公司開發者賬號及密匙--> <add key="CorpID" value="34aa72b99615cb3c" /> <add key="CorpSecret" value="344i6cKV1ZddUREwg3rK454545N_y8u4W_gl1IQfF3JKBcCi" /> </appSettings> </configuration>
一般處理程式 handler C#程式碼:
using Newtonsoft.Json;
using System;
using System.Web;
using System.Web.Script.Serialization;
using static WebTestDingTalkApi.ApiTool;
namespace WebTestDingTalkApi
{
/// <summary>
/// Handler1 的摘要說明
/// </summary>
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
if (!string.IsNullOrEmpty(context.Request["jsapi-oauth"])&& !string.IsNullOrEmpty(context.Request["href"]))
{
if (!false && 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}";
//TokenResult tokenResult = Analyze.Get<TokenResult>(apiurl);
//if (tokenResult.ErrCode == ErrCodeEnum.OK)
//{
// AccessToken.Value = tokenResult.Access_token;
// AccessToken.Begin = DateTime.Now;
//}
#region //舊的測試
var nonceStr = Guid.NewGuid().ToString();
var timeStamp = DingTalkAuth.GetTimeStamp();
//獲取jsapi_ticket
var sign = string.Empty;
ApiTool.EndUpdateAccessToken(false);
string apiurl = $"{Urls.get_jsapi_ticket}?{Keys.access_token}={AccessToken.Value}";
var result = Analyze.Get<SendMessageResult>(apiurl);
JavaScriptSerializer js = new JavaScriptSerializer();
dynamic modelDy = js.Deserialize<dynamic>(result.Json); //反序列化
//進行JS-API許可權簽名獲取signature 時間戳等
var signature = DingTalkAuth.GetGenSigurate(nonceStr, timeStamp, modelDy["ticket"], "http://open.dingtalk.com", ref sign);
// 這裡引數的順序要按照 key 值 ASCII 碼升序排序
string rawstring = $"{Keys.jsapi_ticket}=" + modelDy["ticket"]
+ $"&{Keys.noncestr}=" + nonceStr
+ $"&{Keys.timestamp}=" + DingTalkAuth.GetTimeStamp()
+ $"&{Keys.url}=" + context.Request["href"];
var config = new
{
agentId = ConfigHelper.FetchAgentID(),
corpId = ConfigHelper.FetchCorpID(),
timeStamp = DingTalkAuth.GetTimeStamp(),
nonceStr = nonceStr,
signature = sign,
errcode= modelDy["errcode"],
errmsg= modelDy["errmsg"],
url = context.Request["href"],
rawstring = rawstring,
jsticket = modelDy["ticket"]
};
#endregion
// string json = JsonConvert.SerializeObject(config);
var hh = SignPackageHelper.FetchSignPackage(//"http://localhost:63079/WebForm1.aspx",
context.Request["href"],
SignPackageHelper.FetchJSTicket());
string json = js.Serialize(hh);
context.Response.Write(json);
}
//員工可以在微應用中把訊息傳送到同企業的人或群,訊息傳送管理是個人向個人或者群傳送,傳送普通訊息需要的
//cid和群訊息的chatid不一樣,(通過JSAPI之pickConversation介面喚起聯絡人介面選擇之後即可拿到會話cid,之//後您可以使用獲取到的cid呼叫此介面)。
if (!string.IsNullOrEmpty(context.Request["FTTSendMessage"]))
{
var txtmsg = new
{
sender = "01276230686802",//訊息傳送者員工ID
cid = context.Request["FTTSendMessage"],//群訊息或者個人聊天會話Id
msgtype = MsgType.text.ToString(),
text = new
{
content = "hello"
}
};
string apiurl = ApiTool.FormatApiUrlWithToken(Urls.conversation_message_send);
string json = JsonConvert.SerializeObject(txtmsg);
var result = Analyze.Post<SendMessageResult>(apiurl, json);
context.Response.Write(result);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
}