在這裏記錄一下我配置的釘釘接入微應用遇到的坑。搞了我幾每天才調通。頭皮發麻,如今梳理一下,以避免別人也入坑。前端
1.釘釘接入主要要獲取釘釘企業員工的ID,而後去本身的應用的數據庫裏進行匹配而後實現免登錄的操做。數據庫
2.這裏面主要有2個重要操做:一個是鑑權,一個是免登。若是隻是簡單的免登操做,其實不須要鑑權的,鑑權的目的是爲了能夠調用其餘jsapi接口使用釘釘其餘接口。json
3.若是要鑑權,要放在免登操做的前面。api
4.下面是釘釘上文檔找來的圖片,這張圖的已經有點落伍了,圖上的CorpSecret已經沒有了。獲取Token已經變成經過AgentId和AppSecret來得到,具體看下文。app
5.下面來講一下從頭到位的具體流程post
a.首先登錄釘釘建立應用,獲取到4個咱們要用到的重要的值:corpId,AgentId,AppKey,AppSecret, 這個四個值分別爲企業ID,應用ID,應用Key,應用密鑰。ui
b.咱們來講下這個四個值的做用:企業ID corpId 是爲了獲取Code碼,Code碼是爲了獲取到用戶的基礎信息UserId,而後經過UserId,就能夠獲取到完整的信息。AppKey和AppSecret是爲了獲取Token值,前面Code 和userId要獲取用戶的信息必需要和Token一塊兒才能獲取用戶信息。this
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 + "×tamp=" + 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實例上來,說的不清楚的你們能夠留言,我必定會回覆的。