釘釘企業內部應用開發之鑑權實現過程

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 .'&timestamp=' . $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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章