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;
}
}
}
}