雖釘釘開發文檔上寫着不須要JSAPI籤權,但這僅僅是針對Android手機前端
因此爲了保險起見,在使用JSAPI前,都須要籤權。後端
不然:dd.ready({}) 將不會執行。api
JSAPI籤權步驟:服務器
1.獲取accessTokenapp
請求方式:GET(HTTPS)
請求地址:https://oapi.dingtalk.com/gettoken?corpid=id&corpsecret=secret
參數說明:函數
參數post |
參數類型url |
必須spa |
說明代理 |
corpid |
String |
是 |
企業Id |
corpsecret |
String |
是 |
企業應用的憑證密鑰 |
返回說明:(token有效期是:7200s)
{
"errcode": 0,
"errmsg": "ok",
"access_token": "fw8ef8we8f76e6f7s8df8s"
}
2.獲取jsapi_ticket
請求說明
請求方式:GET(HTTPS)
請求地址:https://oapi.dingtalk.com/get_jsapi_ticket?access_token=ACCESS_TOKEN
參數說明:
參數 |
參數類型 |
必須 |
說明 |
access_token |
String |
是 |
調用接口憑證 |
type |
String |
否 |
目前只支持jsapi |
正確時返回示例以下:
{
"errcode": 0,
"errmsg": "ok",
"ticket": "dsf8sdf87sd7f87sd8v8ds0vs09dvu09sd8vy87dsv87",
"expires_in": 7200
}
參數 |
說明 |
errcode |
錯誤碼 |
errmsg |
錯誤信息 |
ticket |
用於JS API的臨時票據 |
expires_in |
票據過時時間 |
出錯時返回示例以下:
{
"errcode": 45009,
"errmsg": "接口調用超過限制"
}
3.獲取簽名參數
在前端進行免登鑑權以前,咱們要先拿到一些免登鑑權的參數,主要有有url, nonceStr, agentId, timeStamp, corpId 。
參數 |
說明 |
企業 |
ISV |
url |
當前網頁的URL,不包含#及其後面部分 |
|
|
nonceStr |
隨機串,本身定義 |
|
|
agentId |
應用的標識 |
編輯企業應用能夠看到 |
在ISV調用get_auth_info接口裏面能夠獲取 |
timeStamp |
時間戳 |
當前時間,可是前端和服務端進行校驗時候的值要一致 |
當前時間,可是前端和服務端進行校驗時候的值要一致 |
corpId |
企業ID |
企業ID,在開發者後臺中企業視圖下開發者帳號設置裏面能夠看到 |
經過在頁面地址上追加?corpId=CORPID進行獲取 |
注:url參數須要注意,若是url中?號後有中文參數,則參數須要進行URLDecoder.decode(「name=中&age=18」);處理
4.生成簽名
在服務端經過sign(ticket, nonceStr, timeStamp, url)計算前端校驗須要使用的簽名信息。
代碼展現:
public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException {
String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp)
+ "&url=" + url;
try {
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
sha1.reset();
sha1.update(plain.getBytes("UTF-8"));
return bytesToHex(sha1.digest());
} catch (NoSuchAlgorithmException e) {
throw new OApiResultException(e.getMessage());
} catch (UnsupportedEncodingException e) {
throw new OApiResultException(e.getMessage());
}
}
//將bytes類型的數據轉化爲16進制類型
private static String bytesToHex(byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
將:url,nonceStr,agentId,timeStamp,corpId,signature傳遞到前端頁面,在前端HTML5頁面使用jsapi提供的dd.config接口進行簽名校驗。
封裝成JSON 字符串:
"{\"jsticket\":\"" + ticket + "\",\"signature\":\"" + signature + "\",\"nonceStr\":\"" + nonceStr + "\",\"timeStamp\":\""
+ timeStamp + "\",\"corpId\":\"" + Env.CORP_ID + "\",\"agentid\":\"" + Config.agentId + "\"}"
5.引入JS
<script src="http://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>
注:若是頁面地址是HTTPS協議,這個js的src也必須使用HTTPS,即:
<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>
6.JSAPI鑑權
示例代碼:
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 |
String |
是 |
微應用ID,普通企業能夠經過OA後臺的微應用-設置查看agentId,點擊查看。ISV須要經過調用受權成功後的get_auth_info獲取受權方的agentId |
corpId |
String |
是 |
企業ID |
timeStamp |
String |
是 |
生成簽名的時間戳 |
nonceStr |
String |
是 |
生成簽名的隨機串 |
signature |
String |
是 |
JS-API簽名,能夠參考簡易教程中的獲取簽名的示例代碼 |
type |
number |
否 |
若是是要調用服務窗的jsapi,請填1 |
jsApiList |
Array |
是 |
須要調用的jsapi列表 |
URL不一致致使免登報錯52013,簽名校驗失敗?
經過error接口處理失敗驗證
dd.config驗證失敗會執行error函數,錯誤信息能夠在返回的error參數中參看,下面爲error信息示例:
dd.error(function(error){
/**
{
errorMessage:"錯誤信息",// errorMessage 信息會展現出釘釘服務端生成簽名使用的參數,請和您生成簽名的參數做對比,找出錯誤的參數
errorCode: "錯誤碼"
}
**/
alert('dd error: ' + JSON.stringify(err));
});