近期有个需求,需要把H5网页嵌入钉钉桌面,然后通过接口获取钉钉用户的用户信息实现统一认证

 

 

应用开发流程

注册企业: 进入OA管理后台,通过一系列流程,完成企业注册。

创建微应用: 进入钉钉管理后台后可以进入 “企业应用-应用管理” 页面创建微应用。

需要填写应用Logo、应用名称、功能介绍、首页地址等必填信息。

完成后,可在钉钉App的“工作”Tab下找到企业,可以查看到微应用入口。

 

免登流程

大致分四步:

 

1、前端获取钉钉免登授权码code;

2、后端获取access_token;

3、使用授权码code和access_token换取用户userid;

4、通过access_token和userid换去用户详情userinfo。

 

 

 

第一步:获取授权码code。

<script src="//g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>

  <script type="text/javascript">

    dd.ready(function() {

        dd.runtime.permission.requestAuthCode({

            corpId: "XXXXXXXXXXXXXXXXXXXXXXXXXXX", //你们企业钉钉的CORPID

            onSuccess: function(result) {

                {

                    var code = result.code;

                    // alert(code);

                    var url = '/ttttt/?c=dd&code='+code;   //把code传给后端

                    window.location.href = url;

                }

            },

            onFail : function(err) {

                alert('出错了, ' + JSON.stringify(err));

            }

        });

    });

</script>

 

第二步:后台获取access_token

$access_token = getToken();

//后台获取access_token

function getToken(){

    $AppKey = 'XXXXXXXXXXXXXXXXXXXX';

    $AppSecret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

    //判断token是否存在

    // if(!Redis::exists('access_token_rep')){

        //根据code 获取access_token

        // echo 'eeee';exit;

        $getTokenUrl = 'https://oapi.dingtalk.com/gettoken?appkey='.$AppKey.'&appsecret='.$AppSecret;        

        $result = (geturl($getTokenUrl));  //发送get请求

        // var_dump($result);

        if($result['errcode'] == 0){

            $access_token = $result['access_token'];

            //将token保存到reids中

            // Redis::setex('access_token_rep', 3600*2, $access_token);

        }else{

            return false;

        }

    // }else{

    //     $access_token = Redis::get('access_token_rep');

    // }

    return $access_token;

}

 

第三步、第四步:换取userId加获取userinfo

$userinfo = getUserInfo($access_token,$code);

//换取userId加获取userinfo
function getUserInfo($access_token,$code){
    //获取token
//    $access_token = $this->getToken();
    //获取用户的userId
    $getUserIdUrl = 'https://oapi.dingtalk.com/user/getuserinfo?access_token='.$access_token.'&code='.$code;
    // echo $getUserIdUrl.'<br>';
    $userIdResult = geturl($getUserIdUrl);    
    // var_dump($userIdResult);
    if($userIdResult['errcode'] == 0){
    $userid = $userIdResult['userid'];
    // echo $userid.'<br>';
    //获取用户详细信息
    $getInfoUrl = 'https://oapi.dingtalk.com/user/get?access_token='.$access_token.'&userid='.$userid;
    $getInfoReslt = geturl($getInfoUrl);
    //获取用户信息成功
    // var_dump($getInfoReslt);
    $email = $getInfoReslt['email'];
    $name = $getInfoReslt['name'];
    if($email != '' && $name != '')             
    return array($email,$name);
    }
  }

function geturl($url){
    $headerArray =array("Content-type:application/json;","Accept:application/json");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output,true);
    return $output;
}