You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP连接Microsoft Dynamics CRM遇AADSTS90002租户未找到错误求助

解决AADSTS90002租户未找到错误及Dynamics CRM连接问题

可能的错误原因及对应修复

1. 云环境端点不匹配

如果你的Dynamics CRM是**中国区(世纪互联)**实例,必须使用中国区的Azure AD认证端点,而非国际版:

  • 国际版端点:https://login.microsoftonline.com/{tenant-id}/oauth2/token
  • 中国区端点:https://login.partner.microsoftonline.cn/{tenant-id}/oauth2/token

这是触发AADSTS90002最常见的原因——即使租户ID正确,跨云环境请求也会被判定为租户不存在。

2. 请求缺少必要的HTTP头及配置

你的curl请求未设置Content-Type头,且未启用SSL验证(部分服务器会因此拒绝请求),修改认证代码如下:

$clientId = 'xxx-xxx-xx-xx-xx';
$clientSecret = 'test';
$resource = 'https://test.crm4.dynamics.com';
// 确认此处端点对应你的云环境
$tokenEndpoint = 'https://login.microsoftonline.com/xxx-xxx-xxx-xxx-xxx/oauth2/token';

$params = array(
    'grant_type' => 'client_credentials',
    'client_id' => $clientId,
    'client_secret' => $clientSecret,
    'resource' => $resource
);
$query = http_build_query($params);

$ch = curl_init($tokenEndpoint);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 添加Content-Type头,确保参数被正确解析
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/x-www-form-urlencoded'
));
// 生产环境建议开启SSL验证,测试阶段可临时关闭
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

$response = curl_exec($ch);
// 新增CURL错误捕获,排查请求是否到达Azure AD
if(curl_errno($ch)){
    echo "CURL Error: ".curl_error($ch);
    curl_close($ch);
    exit;
}
curl_close($ch);

$data = json_decode($response, true);
print_r($response);

3. 验证Resource参数正确性

确认$resource的值是Dynamics CRM实例的根URL,不带尾部斜杠(如https://test.crm4.dynamics.com),且拼写完全正确(包括区域后缀crm4是否匹配实际实例)。

4. 应用注册的租户归属

即使租户ID正确,若用于认证的应用注册是在其他租户创建的,也会触发此错误。请确认Client ID对应的应用注册是在目标租户下创建的,且已授予Dynamics CRM的应用权限(而非委派权限)。

获取销售线索代码的优化建议

在获取线索时增加错误处理逻辑,避免因API返回异常导致报错:

if (isset($data['access_token'])) {
    $accessToken = $data['access_token'];
    $leadsEndpoint = 'https://test.crm4.dynamics.com/api/data/v9.1/leads';
    $headers = array(
        'Authorization: Bearer ' . $accessToken,
        'Accept: application/json',
        'OData-MaxVersion: 4.0',
        'OData-Version: 4.0',
    );

    $ch = curl_init($leadsEndpoint);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);

    $response = curl_exec($ch);
    if(curl_errno($ch)){
        echo "CURL Error: ".curl_error($ch);
        curl_close($ch);
        exit;
    }
    curl_close($ch);

    $leads = json_decode($response, true);
    // 检查返回数据是否有效
    if(isset($leads['value']) && is_array($leads['value'])){
        foreach ($leads['value'] as $lead) {
            // 使用空值合并运算符避免未定义索引报错
            $leadId = $lead['leadid'] ?? 'N/A';
            $fullName = $lead['fullname'] ?? 'N/A';
            $email = $lead['emailaddress1'] ?? 'N/A';

            echo "Lead ID: $leadId\n";
            echo "Full Name: $fullName\n";
            echo "Email: $email\n";
            echo "\n";
        }
    } else {
        echo "Failed to retrieve leads: " . ($leads['error']['message'] ?? 'Unknown error');
    }
} else {
    $errorMsg = $data['error_description'] ?? 'Authentication failed';
    echo "Authentication Error: $errorMsg";
}

额外注意事项

  • 若服务器PHP版本较低(如PHP 7.0及以下),确保json_decode、http_build_query等函数可用,且curl扩展已启用并支持SSL。
  • 应用注册需在Dynamics CRM中配置正确的应用权限(如crm.ReadWrite.All),并完成管理员同意。

内容的提问来源于stack exchange,提问作者Fllorinaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:22:54