使用Microsoft Partner Center API获取客户订阅时出现500错误
调用Microsoft Partner Center API获取客户订阅返回HTTP 500内部服务器错误排查
问题场景
作为微软直接合作伙伴,使用Get-PartnerCustomerSubscription PowerShell命令可正常获取客户订阅,但手动调用Partner Center API的GET请求获取指定客户订阅时,返回HTTP 500内部服务器错误。相关代码及错误信息如下:
调用代码
$CustomerId = "CUSTOMERIDOFCUSTOMERINCSPPORTAL" $Headers = @{ "Authorization" = "Bearer $($PartnerRefreshToken)" "Accept" = "application/json" } $SubsUri = "https://api.partnercenter.microsoft.com/v1/customers/$CustomerId/subscriptions" $SubsUriResponse = Invoke-RestMethod -Headers $Headers -Uri $SubsUri -Method GET
错误信息
Invoke-RestMethod : { "statusCode": 500, "message": "Internal server error", "activityId": "73e5479e-0f8c-4ecd-a26f-055ac17e124c" } At line:1 char:20 + ... iResponse = Invoke-RestMethod -Headers $Headers -Uri $SubsUri -Method ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
排查与解决方案
1. 验证令牌类型与权限
- 核心错误点:代码中直接使用
Refresh Token作为Authorization头的令牌,而Partner Center API要求的是Access Token。Refresh Token仅用于获取新的Access Token,无法直接用于API授权。 - 解决方式:通过Refresh Token换取有效的Access Token,确保令牌的受众(audience)为
https://api.partnercenter.microsoft.com,且包含PartnerCenter.Read.All或PartnerCenter.ReadWrite.All权限。
2. 补充必要请求头
部分Partner Center API要求指定客户端标识头,缺少可能引发服务器内部错误。建议补充以下头信息:
"MS-PartnerCenter-Client" = "PowerShell-Custom-Script/1.0" # 自定义客户端标识,格式可自行定义
同时明确API版本,将Accept头修改为:
"Accept" = "application/json; v=1.0"
3. 确认客户ID格式
确保$CustomerId为合作伙伴中心门户中客户的GUID格式租户ID,而非域名或其他别名。API仅接受GUID格式的客户ID,别名无法被正确解析。
4. 排查服务器端异常
记录返回的activityId(73e5479e-0f8c-4ecd-a26f-055ac17e124c),通过微软合作伙伴支持渠道提交工单,该ID可帮助微软工程师定位服务器端的具体故障原因(如客户数据异常、服务临时波动等)。
修正后的示例代码
# 替换为通过Refresh Token获取到的有效Access Token $accessToken = "YOUR_VALID_ACCESS_TOKEN" $CustomerId = "CUSTOMER_GUID" $Headers = @{ "Authorization" = "Bearer $accessToken" "Accept" = "application/json; v=1.0" "MS-PartnerCenter-Client" = "PowerShell-Custom-Script/1.0" } $SubsUri = "https://api.partnercenter.microsoft.com/v1/customers/$CustomerId/subscriptions" try { $SubsUriResponse = Invoke-RestMethod -Headers $Headers -Uri $SubsUri -Method GET $SubsUriResponse } catch { # 捕获更详细的错误响应内容 $errorStream = $_.Exception.Response.GetResponseStream() $reader = New-Object System.IO.StreamReader($errorStream) $reader.BaseStream.Position = 0 $reader.DiscardBufferedData() $errorBody = $reader.ReadToEnd() Write-Host "详细错误信息: $errorBody" }
内容的提问来源于stack exchange,提问作者Christoffer Klarskov Jakobsen
相关产品推荐
相关产品推荐

