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

使用eBay API获取OAuth用户访问令牌时授权码无效求助

eBay生产环境OAuth授权码换令牌报错:"the provided authorization grant code is invalid or was issued to another client"

问题描述

我按照eBay OAuth授权码授予流程获取用户访问令牌,沙箱环境使用沙箱凭据能正常运行,但切换到生产环境凭据后,用授权码换取令牌时持续报错:

"the provided authorization grant code is invalid or was issued to another client"

我的C#代码如下:

var clientString = "<Client-id>" + ":" + "<client-secret>";
byte[] clientEncode = Encoding.UTF8.GetBytes(clientString);
var credentials = "Basic " + System.Convert.ToBase64String(clientEncode);

HttpWebRequest request = WebRequest.Create("https://api.ebay.com/identity/v1/oauth2/token")
    as HttpWebRequest;

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";

request.Headers.Add(HttpRequestHeader.Authorization, credentials);

var codeEncoded = HttpUtility.UrlEncode(code);

var body = "grant_type=authorization_code&code=" + codeEncoded + "&redirect_uri=" + "<return-url>";

// Encode the parameters as form data
byte[] formData = UTF8Encoding.UTF8.GetBytes(body);
request.ContentLength = formData.Length;

// Send the request
using (Stream post = request.GetRequestStream())
{
    post.Write(formData, 0, formData.Length);
}

string result = null;
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    // 原代码未完成响应读取逻辑
}

同时我在Postman中手动构造请求也得到相同错误,但用Postman内置的OAuth2授权方式却能成功生成令牌。

可能的解决方向

1. 确保授权码和环境完全匹配

  • 授权码必须从生产环境授权端点获取,不能用沙箱环境生成的授权码来换生产环境的令牌。
  • 换令牌的请求必须发送到生产环境的令牌端点:https://api.ebay.com/identity/v1/oauth2/token(你的代码里是对的)。

2. 严格匹配Client ID/Secret和Redirect URI

  • 生产环境的Client ID、Client Secret必须和获取授权码时使用的完全一致,包括大小写、无多余空格。
  • 换令牌时的redirect_uri必须和申请授权码时传入的redirect_uri丝毫不差:包括末尾的斜杠、大小写、是否编码。比如申请时用https://yourdomain.com/callback,换令牌时不能写成https://yourdomain.com/Callback或者https://yourdomain.com/callback/。
  • 登录eBay开发者后台,确认生产环境的应用已经添加了该Redirect URI,且状态为启用。

3. 保证授权码的有效性

  • eBay授权码只能使用一次,哪怕之前换令牌失败,该授权码也会失效,需要重新获取新的授权码。
  • 授权码有效期通常为5分钟,换令牌操作必须在有效期内完成。

4. 修正请求体的编码问题

你的代码中redirect_uri没有做URL编码,生产环境可能对此要求更严格,建议对其也进行编码:

var codeEncoded = HttpUtility.UrlEncode(code);
var redirectUriEncoded = HttpUtility.UrlEncode("<return-url>"); // 新增编码
var body = $"grant_type=authorization_code&code={codeEncoded}&redirect_uri={redirectUriEncoded}";

同时检查请求体参数是否有拼写错误,比如grant_type必须是authorization_code,不能有拼写错误或多余字符。

5. 验证Basic Auth的正确性

  • 确认Client ID和Secret拼接格式正确:<Client-id>:<client-secret>,中间只有一个冒号,前后无空格。
  • 可以用在线工具验证Base64编码是否正确:把Client-id:client-secret转成Base64字符串,前面加上Basic ,确保和代码生成的credentials一致。

6. 对比Postman内置请求的差异

打开Postman的「请求日志」,查看内置OAuth2方式发送的请求细节,和你手动构造的请求做对比:

  • 检查Authorization头的Basic Auth字符串是否一致
  • 查看表单参数的编码方式
  • 确认Redirect URI的格式是否完全相同
  • 核对请求头的其他字段(比如User-Agent等)是否有差异

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:37:18