1、以機構管理員身份在後臺創建應用,記下corpId、appkey、appsecret、agentid等信息,配置好服務器入口信息等。
2、在開發pc上安裝rc版釘釘,可以進行調試。
3、搭建開發環境,我選擇的是前端js(jquery、bootstrap等)+後端php+數據庫mysql。服務器在阿里雲上。
4、前端代碼:
index.html
<!DOCTYPE html>
<html lang="zh-cn">
<head>
。。。
<script src="js/jquery.3.2.1.min.js"></script>
<script src="js/dingtalk.open.2.7.13.js"></script>
</head>
<body>
<div class='container-fluid'>
<div class="row">
...
</div>
<div id="info"></div>
</div>
<script src="js/bootstrap.min.js"></script>
<script src="js/index.js"></script>
</body>
</html>
index.js
var _config = null;
$(function(){
$.ajaxSetup({ async: false });
$.getJSON("phpFiles/getAuthInfo.php",{"url":location.href},function(rs){
_config=rs;
var jsapilist = [
'device.notification.alert', //警告框
'device.notification.confirm',//確認框
'biz.navigation.setTitle',//設置導航欄標題
'biz.navigation.quit',//關閉頁面
'biz.util.openModal',//打開彈窗(模態窗)
'biz.contact.complexPicker'//選擇人員
] //需要使用的jsapi列表
//1、鑑權
dd.config({
agentId: "you agentid",
corpId: "your corpid", //必填,企業ID
timeStamp: _config.timestamp, // 必填,生成簽名的時間戳
nonceStr: 'abcdefg', // 必填,生成簽名的隨機串
signature: _config.signature, // 必填,簽名
jsApiList: jsapilist // 必填,需要使用的jsapi列表,注意:不要帶dd。
});
dd.error(function(err) { //驗證失敗
console.log("進入到error中");
console.log('dd error: ' + JSON.stringify(err));
})
})
dd.ready(function () {
//2、根據corpId獲取授權碼AuthCode
dd.runtime.permission.requestAuthCode({
corpId: _config.corpId,
onSuccess: function (result)
{
_config.authCode = result.code; //記下授權碼,以備不時之需
//利用api設置導航欄文字
dd.biz.navigation.setTitle({
title: '倉儲管理',
onSuccess: function (result) { },
onFail: function (err) { }
});
},
onFail: function (err) {
// alert(JSON.stringify(err))
}
})
})
})
後端代碼:
getAuthInfo.php
<?php
//獲取構建dd.config所需要的參數
function isvConfig($url)
{
//固定變量
$corpId = "your corpid";
$agentId = "your agentid";
$nonceStr = "abcdefg";
$timeStamp =time();
//獲取access_token
$urlToken="https://oapi.dingtalk.com/gettoken?appkey=yourappkey&appsecret=yourappsecret";
$data= https_request($urlToken);
$access_token = json_decode($data, true);
//獲取ticket,這裏一定要注意:上一步獲取的$access_token 是個數組,裏面下標爲access_token 的元素才真正爲access_token 值。我就掉入這個坑了。
$urlTicket="https://oapi.dingtalk.com/get_jsapi_ticket?access_token=".$access_token['access_token'];
$data= https_request($urlTicket);
$ticket=json_decode($data, true);
//生成簽名信息,這裏一定要注意:上一步獲取的$ticket是個數組,裏面下標爲ticket的元素才真正爲ticket值。我就掉入這個坑了。
$signature =sign($ticket['ticket'], $nonceStr, $timeStamp, $url);
//返回結果
return (json_encode(array("corpId"=>$corpId,"agentId"=>$agentId,"nonceStr"=>$nonceStr,"signature"=>$signature,"timestamp"=>$timeStamp,"url"=>$url,"access_token"=>$access_token,"jsapiticket"=>$ticket)));
}
//簽名函數
function sign($ticket, $nonceStr, $timeStamp, $url)
{
$plain = 'jsapi_ticket=' . $ticket .'&noncestr=' . $nonceStr .'×tamp=' . $timeStamp .'&url=' . $url;
return sha1($plain);
}
//訪問jsapi函數
function https_request($url)
{
$curl=curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result=curl_exec($curl);
curl_close($curl);
return $result;
}
echo (isvConfig($_REQUEST["url"]));
?>
以上步驟即可順利通過鑑權。鑑權後端代碼的過程如下:
(1)根據appkey和appsecret獲得access_token;
(2)根據access_token獲得jsapi_ticket;
(3)根據jsapi_ticket、noncestr(自定義隨機字符串)、timestamp(時間戳)和指定url,利用php中的哈希函數sha1()生成簽名值signature。
(4)將corpid、agentid、noncestr、signature、timestamp、url的值以JSON格式返回給前端,用於創建dd.config。