微博API https://api.weibo.com/oauth2/access_token 报错

我调用微博api的获取access_token接口报错:
{"error":"invalid_grant","error_code":21325,"request":"/oauth2/access_token","error_uri":"/oauth2/access_token","error_description":"invalid authorization code:7abb88384ea0a118814aadde61bdcccb"}
调用方式是:
https://api.weibo.com/oauth2/access_token?client_id=%E8%87%AA%E5%B7%B1%E7%9A%84appkey&client_secret=%E8%87%AA%E5%B7%B1%E7%9A%84appsecret&grant_type=authorization_code&redirect_uri=%E5%9B%9E%E8%B0%83%E5%9C%B0%E5%9D%80&code=7abb88384ea0a118814aadde61bdcccb

这到底是为什么,是因为code值不能重复使用吗,还是其它原因,我这是在postman上面测试的,用HttpWebRequest结果是一直报400服务器错误,我c#是这样调用的(我看说明是要使用post,但是值是拼在url上的,body可以不传值,我用postman也是post调用,但是值直接拼在url上,没有写在body中,能调但是报上面错):



 public static string HttpPost(string Url, string postDataStr)
        { 
                int I = 0; 
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
                CookieContainer cookieCon = new CookieContainer(); 
                request.Method = "POST";
                request.Timeout = 50000;  
                request.CookieContainer = cookieCon;
                request.KeepAlive = true;
                request.ProtocolVersion = HttpVersion.Version10; 
                request.ServicePoint.Expect100Continue = false; 
                Stream myRequestStream = request.GetRequestStream();
                StreamWriter myStreamWriter = new StreamWriter(myRequestStream);
                myStreamWriter.Write(postDataStr);
                myStreamWriter.Close();
                string retString = null; 
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                if (response != null)
                {
                    response.Cookies = cookieCon.GetCookies(response.ResponseUri);
                    Stream myResponseStream = response.GetResponseStream();
                    StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
                    retString = myStreamReader.ReadToEnd();
                    myStreamReader.Close();
                    myResponseStream.Close();
                    myResponseStream.Dispose(); 
                    myRequestStream.Close();
                    myRequestStream.Dispose();
                }

                return retString; 

        }

postDataStr值我照样也传了值

该回答引用ChatGPT

1、 提供的信息,你调用微博API获取access_token时返回了错误信息"invalid_grant",错误代码为21325,错误描述为"invalid authorization code:7abb88384ea0a118814aadde61bdcccb"。这个错误通常是由于授权码(authorization code)已过期或无效导致的。

2、 授权码是一种临时凭证,用于在授权码模式下交换访问令牌。授权码通常只能使用一次,过期时间也很短,因此需要在获取授权码后尽快使用。如果授权码已过期或无效,再次使用它进行访问令牌的获取时就会报错"invalid_grant"。

3、 建议你检查一下你的授权码是否过期或者是否已经被使用过。如果是这个问题,需要重新获取授权码并使用新的授权码进行访问令牌的获取。

4、另外,关于你使用的C#代码,根据你提供的信息,似乎没有把授权码作为参数传递给接口。在获取授权码后,你需要把授权码作为参数加入到请求的URL中。具体来说,在你的URL中加入参数"code=你的授权码",例如:

https://api.weibo.com/oauth2/access_token?client_id=你的appkey&client_secret=你的appsecret&grant_type=authorization_code&redirect_uri=回调地址&code=你的授权码

5、 另外,建议你尝试使用POST方式发送请求,因为POST方式更加安全,也更容易传递授权码等敏感信息。如果还有问题,可以提供更多的信息和代码,以便更好地帮助你解决问题。

  • 参考GPT的内容和自己的思路:

  • 根据微博API的文档,这个错误是指授权码无效。也就是说,你传递的code参数无效或已过期。每个授权码只能使用一次,且必须在10分钟内使用。如果授权码已过期或已使用,则需要重新获取授权码并调用接口。

  • 如果你在Postman上测试成功,但在C#中失败,那么可能是因为你没有正确地构造POST请求。虽然API的参数可以拼接在URL中,但是官方建议使用POST请求将参数放在请求体中。可以尝试在C#中修改请求的ContentType为application/x-www-form-urlencoded,并将参数拼接在请求体中,然后重新尝试一下。
  • 另外,如果你使用的是网页授权的方式获取access_token,那么你需要先获取code,然后再将code传递给获取access_token的接口。在获取code时,需要用户进行授权操作,授权后才能获取到code。如果你直接调用获取access_token的接口并传递一个code,那么很可能会出现无效授权码的错误。

400就是提交数据的字段名称或者是字段类型和后台的实体类不一致,导致无法封装;请求的参数设置不对