向 Google Play Android Developer API 发出 HTTP 发布请求

Posted

技术标签:

【中文标题】向 Google Play Android Developer API 发出 HTTP 发布请求【英文标题】:Making an HTTP post request to the Google Play Android Developer API 【发布时间】:2012-08-31 12:01:16 【问题描述】:

我正在尝试授权 Google Play android Developer API。我正处于需要发出 HTTP 发布请求以交换访问令牌和刷新令牌的授权代码的步骤。 Google 给出以下示例请求:

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/v6xr77ewYqhvHSyW6UJ1w7jKwAzu&
client_id=8819981768.apps.googleusercontent.com&
client_secret=client_secret&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

我很困惑...首先,对于已安装的应用程序 (Android),没有给出 client_secret。我在 Google API 控制台中为同一个项目创建了一个 Web 应用程序,这给了我一个 client_secret,所以我使用了它,即使没有 Web 应用程序。以下代码给了我一个“invalid_grant”错误:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("https://accounts.google.com/o/oauth2/token");

try 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);
    nameValuePairs.add(new BasicNameValuePair("code", "CODE"));
    nameValuePairs.add(new BasicNameValuePair("client_id", "CLIENT_ID"));
    nameValuePairs.add(new BasicNameValuePair("client_secret", "CLIENT_SECRET"));
    nameValuePairs.add(new BasicNameValuePair("redirect_uri", "urn:ietf:wg:oauth:2.0:oob"));
    nameValuePairs.add(new BasicNameValuePair("grant_type", "authorization_code"));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    HttpResponse response = httpclient.execute(httppost);
    ....

完全取出 client_secret 给我一个“invalid_request”错误。

【问题讨论】:

您已经在问题中回答了您的问题 :-) ***.com/questions/4543894/… 找到相似之处 :-) ...但我认为您不需要 redirect_uri 参数 你能至少告诉我我给出的两个选项中的哪一个吗?已经三天了...拜托... 您看到***.com/questions/4543894/… ... 评分最高的答案了吗? List&lt;NameValuePair&gt; nameValuePairs = new ArrayList&lt;NameValuePair&gt;(x); nameValuePairs.add(new BasicNameValuePair("code", "4/v6xr77ewYqhvHSyW6UJ1w7jKwAzu")); nameValuePairs.add(new BasicNameValuePair("client_id", "8819981768.apps.googleusercontent.com"));/*...rest of the params...*/ httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));HttpResponse response = httpclient.execute(httppost); 那么你应该使用 HttpEntity 将响应转换为字符串,然后解析 json 我合作过吗? ... to wszystko było w Twoim pytaniu :) Dalej nie... caly czas dostaje "error: invalid_request" albo "error: invalid_grant" albo "error: invalid_client"... 【参考方案1】:

我就是这样解决的。我最终使用了 Web Applcation。在我的回复here 中查看更多详细信息。

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/token");

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("grant_type",    "refresh_token"));
nameValuePairs.add(new BasicNameValuePair("client_id",      CLIENT_ID));
nameValuePairs.add(new BasicNameValuePair("client_secret",  CLIENT_SECRET));
nameValuePairs.add(new BasicNameValuePair("refresh_token",  REFRESH_TOKEN));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

HttpResponse response = client.execute(post);

【讨论】:

【参考方案2】:

我已经设法在没有网络应用程序帮助的情况下从 android 应用程序中兑换访问代码以获取访问令牌只需消除 client_secret 密钥,因为它不适用于已安装的应用程序。

HttpPost httppost = new HttpPost("https://accounts.google.com/o/oauth2/token");
httppost.setHeader("Content-type", "application/x-www-form-urlencoded");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("grant_type",    "authorization_code"));
nameValuePairs.add(new BasicNameValuePair("client_id",      BLOGGER_CLIENT_ID));
nameValuePairs.add(new BasicNameValuePair("redirect_uri",  "http://localhost"));
nameValuePairs.add(new BasicNameValuePair("code", BLOGGER_ACCESS_CODE));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpClient httpClient = new DefaultHttpClient(myParams);
response = httpClient.execute(httppost);
String returnedJsonStr = EntityUtils.toString(response.getEntity());
JSONObject jsonObject = new JSONObject(returnedJsonStr);
String receivedToken = jsonObject.getString("access_token");

发表此评论的原因是,您的解决方案可能会误导某些人,他们可能认为在移动应用程序中获取访问令牌的唯一方法是通过网络应用程序,这是我在几分钟前阅读您的帖子后想到的!

为避免 invalid_grant 错误,请遵循以下代码: https://***.com/a/14141020/989418

【讨论】:

以上是关于向 Google Play Android Developer API 发出 HTTP 发布请求的主要内容,如果未能解决你的问题,请参考以下文章

Unity Google Game Play Services,不向排行榜提交分数

如何从 google play store 反编译一个 android 应用程序

如何在实时多人游戏 Google Play 游戏服务中向其他参与者发送有关房间创建的数据

“包装”恶意软件现身 Google Play,危及用户财产安全

Ionic - 将新版本上传到 Google Play Dev 会导致错误

Google Play控制台:应用尚未提供任何应用内商品。