1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebTestDingTalkApi.WebForm1" %>
2
3 <!DOCTYPE html>
4
5 <html xmlns="http://www.w3.org/1999/xhtml">
6 <head runat="server">
7 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8 <title></title>
9 <script src="jquery-1.8.2.min.js"></script>
10 <script type="text/javascript" src="http://g.alicdn.com/dingding/open-develop/1.6.9/dingtalk.js"></script>
11 <script src="app.js"></script>
12 <script>
13 //获取会话ID只能用一次
14 var cid = '';
15 var fnReady = $(function ()
16 {
17 var fnError = function () {
18 alert("鉴权失败");
19 };
20 var jsApiList = ["biz.chat.pickConversation", "biz.chat.chooseConversationByCorpId", "biz.chat.toConversation"];
21
22 global.configJsSdk(jsApiList, fnReady, fnError);
23 });
24 </script>
25 </head>
26 <body>
27 <form id="form1" runat="server">
28 <div>
29 <asp:Button ID="btnGroupSend" runat="server" Text="群消息发送" OnClick="btnGroupSend_Click" />
30 <asp:Button ID="btnFtFSend" runat="server" Text="部门群组、单个人消息发送" OnClick="btnFtFSend_Click" />
31 <asp:Button ID="btnPtSend" runat="server" Text="普通会话消息发送" OnClick="btnPtSend_Click" />
32 </div>
33
34 </form>
35 </body>
36 </html>
app.js代码:
1 var global = {
2 corpId: '',
3 configJsSdk: function (jsApiList, fnReady, fnError) {
4 /// <summary>配置微信的JSSDK</summary>
5 /// <param name="jsApiList" type="function">要请求的api列表,以['biz.chat.chooseConversationByCorpId','biz.chat.toConversation']的形式</param>
6 /// <param name="fnReady" type="function">dd.ready调用的函数</param>
7 /// <param name="fnError" type="function">dd.error调用的函数</param>
8 var url = window.location.href;
9 alert(url);
10 //从后台取出jsapi-oauth配置信息
11 var signRequest = {
12 url:"Handler1.ashx?jsapi-oauth=oauth&href=" + url,
13 type: 'GET',
14 dataType: 'json',
15 success: function (response, textStatus, jqXHR) {
16 //获取jsapi签名成功
17 if( response != null)
18 if (response.errcode =="OK" )
19 {
20 try {
21 global.corpId = response.corpId;
22 const config =
23 {
24 agentId: response.agentId,
25 corpId: response.corpId,
26 timeStamp: response.timeStamp,
27 nonceStr: response.nonceStr,
28 signature: response.signature,
29 jsApiList: jsApiList
30 };
31
32 dd.config(config);
33 // alert(JSON.stringify(config));
34 dd.ready(function ()
35 {
36
37 alert('ready');
38 //根据corpid选择会话获取chatId
39 //dd.biz.chat.chooseConversationByCorpId(
40 // {
41 // corpId: 'dingb6aa72b99615cb3c', //企业id
42 // isConfirm: 'true', //是否弹出确认窗口,默认为true
43 // onSuccess: function (data) {
44 // alert(JSON.stringify(data));
45 // },
46 // onFail: function (err) { alert('dd error: ' + JSON.stringify(err)); }
47 // });
48 //打开与某个用户的聊天页面(单聊会话)
49 //biz.chat.openSingleChat({
50 // corpId: 'dingb6aa72b99615cb3c', // 企业id
51 // userId: 'xxx', // 用户的工号
52 // onSuccess: function () { },
53 // onFail: function () { }
54 //})
55 //会话信息
56 dd.biz.chat.pickConversation({
57 corpId: global.corpId, //企业id
58 isConfirm:'false', //是否弹出确认窗口,默认为true
59 onSuccess: function (data) {
60 alert("获取"+data.cid);
61 $.ajax({
62 type: "post",
63 url: "Handler1.ashx",
64 data: "FTTSendMessage=" + data.cid,
65 datatype: "json",
66 async: false,
67 success: function (msg, textstatus, xmlhttprequest) {
68 alert('会话 OK: ' + JSON.stringify(msg));
69 },
70 error: function (errorinfo) {
71 alert("会话错误。");
72 }
73 });
74 },
75 onFail: function () { }
76 });
77 ding消息
78 //dd.biz.ding.create({
79 // users: ['121820590530614633'],// 用户列表,工号
80 // corpId: 'dingb6aa72b99615cb3c', // 企业id
81 // type: 1, // 附件类型 1:image 2:link
82 // alertType: 2, // 钉发送方式 0:电话, 1:短信, 2:应用内
83 // alertDate: { "format": "yyyy-MM-dd HH:mm", "value": "2017-09-24 08:00" },
84 // attachment: {
85 // images: [''],
86 // }, // 附件信息
87 // text: '星期一开会讨论周发注事情', // 正文
88 // bizType: 0, // 业务类型 0:通知DING;1:任务;2:会议;
89 // confInfo: {
90 // bizSubType: 0, // 子业务类型如会议:0:预约会议;1:预约电话会议;2:预约视频会议;(注:目前只有会议才有子业务类型)
91 // location: '某某会议室', //会议地点;(非必填)
92 // startTime: { "format": "yyyy-MM-dd HH:mm", "value": "2017-09-24 08:00" },// 会议开始时间
93 // endTime: { "format": "yyyy-MM-dd HH:mm", "value": "2017-09-24 09:00" }, // 会议结束时间
94 // remindMinutes: 30, // 会前提醒。单位分钟-1:不提醒;0:事件发生时提醒;5:提前5分钟;15:提前15分钟;30:提前30分钟;60:提前1个小时;1440:提前一天;
95 // remindType: 2 // 会议提前提醒方式。0:电话, 1:短信, 2:应用内
96 // },
97
98 // //taskInfo: {
99 // // ccUsers: ['100', '101'], // 抄送用户列表,工号
100 // // deadlineTime: { "format": "yyyy-MM-dd HH:mm", "value": "2015-05-09 08:00" }, // 任务截止时间
101 // // taskRemind: 30// 任务提醒时间,单位分钟0:不提醒;15:提前15分钟;60:提前1个小时;180:提前3个小时;1440:提前一天;
102 // //},
103
104 // onSuccess: function (info) {
105 // alert('ding OK: ' + JSON.stringify(info));
106 // //onSuccess将在点击发送之后调用
107 // },
108 // onFail: function (err) { alert('ding error: ' + JSON.stringify(err)); }
109 //})
110
111 });
112
113 dd.error(function (err) {
114 if (err == null) {
115 alert('dd error: ' + JSON.stringify(err));
116 }
117 else {
118 fnError();
119 }
120 });
121 }
122 catch (e) {
123 alert('dd error: ' + JSON.stringify(e));
124 }
125
126 //global.corpId = response.corpId;
127 //const config = {
128 // agentId: response.agentId || '',
129 // corpId: corpId || '',
130 // timeStamp: response.timeStamp || '',
131 // nonceStr: response.nonceStr || '',
132 // signature: response.signature || '',
133 // jsApiList: jsApiList || []
134 //};
135 //dd.config(config);
136 //alert(JSON.stringify(config));
137 //dd.ready(function () {
138 // if (fnReady != null) {
139 // fnReady();
140 // }
141 //});
142 //dd.biz.chat.chooseConversationByCorpId({
143 // corpId: 'dingb6aa72b99615cb3c', //企业id
144 // // isConfirm:'true', //是否弹出确认窗口,默认为true
145 // onSuccess: function (data) {
146 // alert(JSON.stringify(data));
147 // },
148 // onFail: function () { }
149 //});
150
151 //dd.error(function (err) {
152 // if (err == null) {
153 // alert('dd error: ' + JSON.stringify(err));
154 // }
155 // else {
156 // fnError();
157 // }
158 //});
159 }
160 else//签名失败弹出提示信息
161 {
162 alert(JSON.stringify(response.errmsg) + 'sign');
163 }
164 },
165 error: function () {
166
167 }
168 };
169 $.ajax(signRequest);
170 }
171
172 }
config 配置钉钉公司开放账号、密匙和应用ID
1 <?xml version="1.0" encoding="utf-8"?>
2 <!--
3 有关如何配置 ASP.NET 应用程序的详细信息,请访问
4 https://go.microsoft.com/fwlink/?LinkId=169433
5 -->
6 <configuration>
7 <!--
8 有关 web.config 更改的说明,请参见 http://go.microsoft.com/fwlink/?LinkId=235367。
9
10 可在 <httpRuntime> 标记上设置以下特性。
11 <system.Web>
12 <httpRuntime targetFramework="4.5.1" />
13 </system.Web>
14 -->
15 <system.web>
16 <compilation targetFramework="4.6.1" />
17 <httpRuntime />
18 <pages controlRenderingCompatibilityVersion="4.0" />
19 </system.web>
20 <appSettings>
21 <!--自己在钉钉创建应用的名义发送消息-->
22 <add key="AgentID" value="12646174893" />
23 <!--钉钉中接收的部门id-->
24 <add key="DeptID" value="2542023339" />
25 <!--钉钉中公司开发者账号及密匙-->
26 <add key="CorpID" value="34aa72b99615cb3c" />
27 <add key="CorpSecret" value="344i6cKV1ZddUREwg3rK454545N_y8u4W_gl1IQfF3JKBcCi" />
28 </appSettings>
29 </configuration>
一般处理程序 handler C#代码:
1 using Newtonsoft.Json;
2 using System;
3 using System.Web;
4 using System.Web.Script.Serialization;
5 using static WebTestDingTalkApi.ApiTool;
6
7 namespace WebTestDingTalkApi
8 {
9 /// <summary>
10 /// Handler1 的摘要说明
11 /// </summary>
12 public class Handler1 : IHttpHandler
13 {
14
15 public void ProcessRequest(HttpContext context)
16 {
17 context.Response.ContentType = "text/plain";
18 if (!string.IsNullOrEmpty(context.Request["jsapi-oauth"])&& !string.IsNullOrEmpty(context.Request["href"]))
19 {
20 if (!false && AccessToken.Begin.AddSeconds(ConstVars.CACHE_TIME) >= DateTime.Now)
21 {//没有强制更新,并且没有超过缓存时间
22 return;
23 }
24 //string CorpID = ConfigHelper.FetchCorpID();
25 //string CorpSecret = ConfigHelper.FetchCorpSecret();
26 //string TokenUrl = Urls.gettoken;
27 //string apiurl = $"{TokenUrl}?{Keys.corpid}={CorpID}&{Keys.corpsecret}={CorpSecret}";
28 //TokenResult tokenResult = Analyze.Get<TokenResult>(apiurl);
29 //if (tokenResult.ErrCode == ErrCodeEnum.OK)
30 //{
31 // AccessToken.Value = tokenResult.Access_token;
32 // AccessToken.Begin = DateTime.Now;
33 //}
34 #region //旧的测试
35 var nonceStr = Guid.NewGuid().ToString();
36 var timeStamp = DingTalkAuth.GetTimeStamp();
37 //获取jsapi_ticket
38 var sign = string.Empty;
39 ApiTool.EndUpdateAccessToken(false);
40 string apiurl = $"{Urls.get_jsapi_ticket}?{Keys.access_token}={AccessToken.Value}";
41
42 var result = Analyze.Get<SendMessageResult>(apiurl);
43 JavaScriptSerializer js = new JavaScriptSerializer();
44 dynamic modelDy = js.Deserialize<dynamic>(result.Json); //反序列化
45 //进行JS-API权限签名获取signature 时间戳等
46 var signature = DingTalkAuth.GetGenSigurate(nonceStr, timeStamp, modelDy["ticket"], "http://open.dingtalk.com", ref sign);
47 // 这里参数的顺序要按照 key 值 ASCII 码升序排序
48 string rawstring = $"{Keys.jsapi_ticket}=" + modelDy["ticket"]
49 + $"&{Keys.noncestr}=" + nonceStr
50 + $"&{Keys.timestamp}=" + DingTalkAuth.GetTimeStamp()
51 + $"&{Keys.url}=" + context.Request["href"];
52 var config = new
53 {
54 agentId = ConfigHelper.FetchAgentID(),
55 corpId = ConfigHelper.FetchCorpID(),
56 timeStamp = DingTalkAuth.GetTimeStamp(),
57 nonceStr = nonceStr,
58 signature = sign,
59 errcode= modelDy["errcode"],
60 errmsg= modelDy["errmsg"],
61 url = context.Request["href"],
62 rawstring = rawstring,
63 jsticket = modelDy["ticket"]
64 };
65 #endregion
66 // string json = JsonConvert.SerializeObject(config);
67 var hh = SignPackageHelper.FetchSignPackage(//"http://localhost:63079/WebForm1.aspx",
68 context.Request["href"],
69 SignPackageHelper.FetchJSTicket());
70 string json = js.Serialize(hh);
71 context.Response.Write(json);
72 }
73 //员工可以在微应用中把消息发送到同企业的人或群,消息发送管理是个人向个人或者群发送,发送普通消息需要的
74 //cid和群消息的chatid不一样,(通过JSAPI之pickConversation接口唤起联系人界面选择之后即可拿到会话cid,之//后您可以使用获取到的cid调用此接口)。
75 if (!string.IsNullOrEmpty(context.Request["FTTSendMessage"]))
76 {
77 var txtmsg = new
78 {
79 sender = "01276230686802",//消息发送者员工ID
80 cid = context.Request["FTTSendMessage"],//群消息或者个人聊天会话Id
81 msgtype = MsgType.text.ToString(),
82 text = new
83 {
84 content = "hello"
85 }
86 };
87 string apiurl = ApiTool.FormatApiUrlWithToken(Urls.conversation_message_send);
88 string json = JsonConvert.SerializeObject(txtmsg);
89 var result = Analyze.Post<SendMessageResult>(apiurl, json);
90 context.Response.Write(result);
91 }
92 }
93
94 public bool IsReusable
95 {
96 get
97 {
98 return false;
99 }
100 }
101 }
102 }