开发者社区 问答 正文

Contact.User.Read已经开通,但是一直提示没有调用该接口的权限

我做了个网站,需要接入到公司的钉钉上,作为企业内部应用,员工然后通过钉钉可以进行免登录访问,但是获取AccessToken后再获取员工的个人信息一直提示“[code] => Forbidden.AccessDenied.AccessTokenPermissionDenied [requestid] => 1739246D-94EA-7310-A5F0-7B52E8F038B7 [message] => 没有调用该接口的权限,接口权限申请参考:https://open.dingtalk.com/document/orgapp-server/add-api-permission [accessdenieddetail] => Array ( [requiredScopes] => Array ( [0] => Contact.User.Read ) )“
大家帮忙看看什么问题?
调用的代码:

// 第二步:处理回调获取access_token
function getAccessToken($config) {
    $tokenUrl = "https://api.dingtalk.com/v1.0/oauth2/userAccessToken";

    $headers = [
        'Content-Type: application/json',
        'Accept: application/json'
    ];

    $data = [
        'clientId' => $config['appKey'],
        'clientSecret' => $config['appSecret'],
        'code' => $_GET['code'],
        'grantType' => 'authorization_code'
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $tokenUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// 获取用户信息
function getUserInfo111($accessToken) {
    $url = "https://api.dingtalk.com/v1.0/contact/users/me";
    $headers = [
        'x-acs-dingtalk-access-token: ' . $accessToken
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// 第三步:获取用户信息
function getUserInfo($accessToken) {echo $accessToken;
    $userUrl = "https://api.dingtalk.com/v1.0/contact/users/me";

    $headers = [
        'Content-Type: application/json',
        'Accept: application/json',
        'x-acs-dingtalk-access-token: ' . $accessToken
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $userUrl);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

// 主流程
try {
    $tokenData = getAccessToken($config);
    if (isset($tokenData['accessToken'])) {
        $userInfo = getUserInfo($tokenData['accessToken']);
        print_r($userInfo);
        // 处理用户登录逻辑
        session_start();
        $_SESSION['dingtalk_user'] = $userInfo;
        exit;
        // 跳转到登录成功页面
        header("Location: welcome.php");
        exit;
    } else {
        throw new Exception("获取access_token失败: " . json_encode($tokenData));
    }
} catch (Exception $e) {
    die("钉钉登录失败: " . $e->getMessage());
}

权限截图:80AA5F7B-5472-4556-8119-DD8F437D21AC.png

展开
收起
livei 2025-05-17 14:49:27 72 分享 版权
0 条回答
写回答
取消 提交回答