C#+ashx+Js 获取钉钉个人对话ID进行发送消息

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

猜你喜欢

转载自blog.csdn.net/kongwei521/article/details/79617430
今日推荐