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
相关产品推荐
相关产品推荐

