1. 程式人生 > >釘釘微應用接入釘釘免登陸配置記錄。NET實現

釘釘微應用接入釘釘免登陸配置記錄。NET實現

on() token mission 文件 當前 關於 必須 實現 回復

在這裏記錄一下我配置的釘釘接入微應用遇到的坑。搞了我幾天天才調通。頭皮發麻,現在梳理一下,以免別人也入坑。

1.釘釘接入主要要獲取釘釘企業員工的ID,然後去自己的應用的數據庫裏進行匹配然後實現免登陸的操作。

2.這裏面主要有2個重要操作:一個是鑒權,一個是免登。如果只是簡單的免登操作,其實不需要鑒權的,鑒權的目的是為了可以調用其他jsapi接口使用釘釘其他接口。

3.如果要鑒權,要放在免登操作的前面。

4.下面是釘釘上文檔找來的圖片,這張圖的已經有點落伍了,圖上的CorpSecret已經沒有了。獲取Token已經變成通過AgentId和AppSecret來獲得,具體看下文。

技術分享圖片

5.下面來說一下從頭到位的具體流程

  a.首先登陸釘釘創建應用,獲取到4個我們要用到的重要的值:corpId,AgentId,AppKey,AppSecret, 這個四個值分別為企業ID,應用ID,應用Key,應用密鑰。

技術分享圖片

  b.我們來說下這個四個值的作用:企業ID corpId 是為了獲取Code碼,Code碼是為了獲取到用戶的基礎信息UserId,然後通過UserId,就可以獲取到完整的信息。AppKey和AppSecret是為了獲取Token值,前面Code 和userId要獲取用戶的信息必須要和Token一起才能獲取用戶信息。

6.現在來看一下具體的獲取Token操作

  

        public
string GetDingToken() { string token = string.Empty; if (string.IsNullOrEmpty(token)) { string url = string.Format("https://oapi.dingtalk.com/gettoken?corpid={0}&corpsecret={1}", _appId, _appSecret); string json = HttpHelper.GetDataGetHtml(url);//HTTP請求的幫助類,這個類跟本文沒有關系,就不貼上來了。 Access_Token access_token
= JsonHelper.JsonDeserialize<Access_Token>(json); token = access_token.access_token; } return token; }

7.獲取通過Code基礎信息的操作(獲取的信息非常有限只有一個userId有用為了獲取整個用戶的信息)

        public Access_UserInfo GetUserInfo(string code)
        {
            string url = string.Format("https://oapi.dingtalk.com/user/getuserinfo?access_token={0}&code={1}", GetDingToken(), code);
            string json = HttpHelper.GetDataGetHtml(url);
            return JsonHelper.JsonDeserialize<Access_UserInfo>(json);
        }

8.通過 userId獲取釘釘用戶信息的操作(關於免登陸的操作相關的後臺代碼就這些了,剩下還有鑒權相關的一些代碼後臺代碼和前臺獲獲取Code的一些前端請求代碼)

  

        public DingUser GetUeser(string uid)
        {
            string url = string.Format("https://oapi.dingtalk.com/user/get?access_token={0}&userid={1}", GetDingToken(), uid);
            string json = HttpHelper.GetDataGetHtml(url);
            return JsonHelper.JsonDeserialize<DingUser>(json);
        }

9.鑒權的前端配置代碼(這裏要先引用釘釘JS文件,以前區分手機可客戶端後來不區分了)

dd.config({
    agentId: ‘‘, // 必填,微應用ID
    corpId: ‘‘,//必填,企業ID
    timeStamp: , // 必填,生成簽名的時間戳
    nonceStr: ‘‘, // 必填,生成簽名的隨機串
    signature: ‘‘, // 必填,簽名
    type:0/1,   //選填。0表示微應用的jsapi,1表示服務窗的jsapi;不填默認為0。該參數從dingtalk.js的0.8.3版本開始支持
    jsApiList : [
        ‘runtime.info‘,
        ‘biz.contact.choose‘,
        ‘device.notification.confirm‘,
        ‘device.notification.alert‘,
        ‘device.notification.prompt‘,
        ‘biz.ding.post‘,
        ‘biz.util.openLink‘,
    ] // 必填,需要使用的jsapi列表,註意:不要帶dd。
});

 這個幾個的參數說明上面已經有備註,這些需要從後臺返回這些參數。agentId,和CorpId是現成的,timeStamp生成一個就好了,nonceStrye也是隨機生成的一個編碼,

,主要是signature是需要幾個參數拼成一起生成的。下面看看鑒權的後臺代碼(signature需要ticket+noncestr+timestamp+當前url一起生成)JSAPI鑒權官方文檔

下面是NET實現的代碼

        private Access_Sdk GetSdk(string url)
        {
           
            string noncestr = GuidTo16String();
            string timestamp = DateTime.Now.Ticks.ToString();
            Access_Ticket access_Ticket = GetTicket();
            string str1 = "jsapi_ticket=" + access_Ticket.ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url + "";
            string signature = str1.Sha1();
            Access_Sdk sdk = new Access_Sdk();
            sdk.Noncestr = noncestr;
            sdk.Timestamp = timestamp;
            sdk.Signature = signature;
            return sdk;
        }

這段代碼主要有2個要說明的地方一個就是生成Ticket,一個就是 Sha1進行編碼。

生成Ticket的編碼

        private Access_Ticket GetTicket()
        {
            string url = string.Format("https://oapi.dingtalk.com/get_jsapi_ticket?access_token={0}", GetDingToken());
            string json = HttpHelper.GetDataGetHtml(url);
            return JsonHelper.JsonDeserialize<Access_Ticket>(json);
        }

sha1加密

        public static string Sha1(this string str)
        {
            var buffer = Encoding.UTF8.GetBytes(str);
            var data = SHA1.Create().ComputeHash(buffer);

            var sb = new StringBuilder();
            foreach (var t in data)
            {
                sb.Append(t.ToString("X2"));
            }

            return sb.ToString().ToLower();
        }
 

後臺的主要代碼我都貼上了,下面貼下前臺的獲取Code的代碼

dd.ready(function() {
    dd.runtime.permission.requestAuthCode({
        corpId: _config.corpId, // 企業id
        onSuccess: function (info) {
                  code = info.code // 通過該免登授權碼可以獲取用戶身份
        }});
});

到這裏就結束了,本來想寫的詳細點,但是感覺還挺難得,其實這個東西不難,主要是第一次搞的時候,沒有清楚的文檔,遇到一兩個坑很煩人。心態都爆炸了。

後面我盡量放一份完整的demo實例上來,說的不清楚的大家可以留言,我一定會回復的。

釘釘微應用接入釘釘免登陸配置記錄。NET實現