一、要解決的問題:
????? 釘釘微應(yīng)用開發(fā),應(yīng)對(duì)未來可能的PC端使用場(chǎng)景:PC訪問網(wǎng)頁,工作臺(tái)登陸后,通過釘釘服務(wù)端接口完成自身業(yè)務(wù)。
二、開發(fā)前準(zhǔn)備:
?????? 根據(jù)官方文檔,釘釘微應(yīng)用PC端開發(fā)和移動(dòng)端開發(fā)已經(jīng)統(tǒng)一,方便我們統(tǒng)一開發(fā),兩套使用。
?????? 前端調(diào)用釘釘API可在頁面引入對(duì)應(yīng)js文件:
<script scr="http://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>
?????? 為什么引入鑒權(quán)(dd.config)?——釘釘業(yè)務(wù)相關(guān)JSAPI必須鑒權(quán),手機(jī)原生功能可不用鑒權(quán),在dd.ready內(nèi)執(zhí)行即可。目前支持的JSAPI功能展示可參見https://wsdebug.dingtalk.com/。
??????? 鑒權(quán)原理:

1.在你的Web服務(wù)器端調(diào)用api,傳入CorpId和CorpSecret,獲取accessToken,即訪問令牌。
2.在服務(wù)器端調(diào)用api,傳入accessToken,獲取JsApiTicket,即JsApi的訪問許可(門票)。
3.按照既定規(guī)則,在后臺(tái)由JsApiTicket、NonceStr、Timestamp、本頁面Url生成字符串,計(jì)算SHA1消息摘要,即簽名Signature。
4.將AgentId、CorpId、Timestamp、NonceStr、Signature等參數(shù)傳遞到前臺(tái),在前臺(tái)調(diào)用api,得到authCode,即授權(quán)碼。
5.根據(jù)授權(quán)碼,在前臺(tái)或后臺(tái)調(diào)用api,獲得userId,進(jìn)而再根據(jù)userId,調(diào)用api獲取用戶詳細(xì)信息。
補(bǔ)充幾點(diǎn):
1.accessToken通過下圖的接口獲取,釘釘有形形色色的token。

根據(jù)應(yīng)用id和應(yīng)用密碼得到的訪問令牌:

用上述token獲取的sns訪問令牌:

掃碼免登token:(釘釘掃碼門禁)

2.??? nonceStr自定義,時(shí)間戳timestamp為服務(wù)器時(shí)間(可以理解為sign()方法調(diào)用當(dāng)時(shí)的系統(tǒng)時(shí)間與1970年1月1日差值的秒數(shù),為長(zhǎng)整型,前后臺(tái)應(yīng)一致)。

3.?? sign方法,在https://debug.dingtalk.com/可以把參數(shù)傳過去,驗(yàn)證方法獲得的sign是不是正確。在調(diào)試的時(shí)候報(bào)52011錯(cuò)誤,一度發(fā)現(xiàn)不了問題,后來用此法排除了是不是sign方法寫錯(cuò)的懷疑。

方法論:
后端代碼:

前端代碼:

dd.error方法在調(diào)試的時(shí)候很有用,我按這個(gè)步驟完成后,訪問目標(biāo)頁面一直提示52011,查看官方文檔和網(wǎng)上說明,基本是按照下邊截圖篩查:

按此步驟篩查無誤,后來又用https://debug.dingtalk.com/來確定了jsapi_ticket和sign值均正確,且沒有別的服務(wù)同時(shí)獲取jsapi_ticket,前前后后代碼看了個(gè)遍,也沒找到問題所在。后來在一個(gè)帖子的某一個(gè)人的回復(fù)里邊看到一句話:

我試了試,改了這個(gè)地方:

右圖是官方實(shí)例,估摸是哪個(gè)配置代碼程序員眼花了,沒完全按駝峰寫。要不是找到這帖子一樓一樓看,生找bug誰能發(fā)現(xiàn)…這也是企業(yè)自建服務(wù)窗微應(yīng)用獨(dú)有的問題,e應(yīng)用貌似沒問題。
至此問題解決。
