1. 程式人生 > >C#+ashx+Js 獲取釘釘個人對話ID進行傳送訊息

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