【发布时间】:2016-05-03 08:12:09
【问题描述】:
我正在尝试设置一个网络服务来查询 Google Play 购买。我们为客户存储订单信息,该服务会调用 Google Play API 来查询订阅详情。
每次我尝试查询购买时,都会出现错误:
HTTP/1.1 400 Bad Request
{
"error":{
"errors":[
{
"domain":"global",
"reason":"invalid",
"message":"Invalid Value"
}
],
"code":400,
"message":"Invalid Value"
}
}
这是我尝试过的:
- 在https://console.developers.google.com 中创建了一个启用“Google Play Android Developer API”的项目
- 为类型 Web 应用程序创建了 oAuth 2.0 client_id 和 client_secret
- 以账户所有者身份登录,我生成了一个 refresh_token
- 在https://play.google.com/apps/publish 我转到设置 -> API 访问并将项目链接到我的应用程序
代码方面,我使用了 refresh_token 来获取 access_token:
String refreshToken = "1/ljll6d9ME3Uc13jMrBweqXugV4g4timYcXXXXXXXXX";
HttpPost request = new HttpPost("https://accounts.google.com/o/oauth2/token");
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("client_id", client_id));
params.add(new BasicNameValuePair("client_secret", client_secret));
params.add(new BasicNameValuePair("refresh_token", refreshToken));
params.add(new BasicNameValuePair("grant_type", "refresh_token"));
request.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
String body = EntityUtils.toString(entity);
JSONObject json = new JSONObject(body);
String accessToken = json.getString("access_token");
这里的 access_token 有效,因为我可以用它调用这个 API 并获取响应:
String url = String.format("https://www.googleapis.com/androidpublisher/v2/applications/%s/inappproducts/%s", packageName, productId);
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
get.setHeader("Authorization", "Bearer " + accessToken);
HttpResponse response = client.execute(get);
// parse response etc...
这会返回:
{
"packageName":"com.my.app",
"sku":"com.my.app.premium",
"status":"active",
"purchaseType":"subscription",
"defaultPrice":{
//...
}
},
"listings":{
"en-US":{
"title":"My App Premium",
"description":"My App"
}
},
"defaultLanguage":"en-US",
"subscriptionPeriod":"P1Y"
}
现在,我想获取有关购买的信息。我有这样的购买信息:
{
"orderId":"GPA.1111-1111-1111-11111",
"packageName":"com.my.app",
"productId":"com.my.app.premium",
"purchaseTime":1452801843877,
"purchaseState":0,
"developerPayload":"XXXXXXXd9261023a407ae5bb6ab8XXXXXXX",
"purchaseToken":"xxxxxxxxxxxxxx.YY-J123o12-xxxxxxxxxxxxxxxmYRk2itBkNdlXhyLMjXsxxxxxxxxxxxxLfBxabaAjKbeBC0PVhHnHd1DDbFkgZtbQxxk5pDIAH3xBHu8HrcWfRgewAYnFeW9xxxxxxxxxxxxxC5TDjcBL8fhf",
"autoRenewing":true
}
String url = String.format("https://www.googleapis.com/androidpublisher/v2/applications/%s/purchases/products/%s/tokens/%s",packageName, productId, purchaseToken);
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
get.setHeader("Authorization", "Bearer " + accessToken);
HttpResponse response = client.execute(get);
// parse response etc...
由于 packageName / productId 和 access_token 似乎适用于第一次调用,并且 purchaseToken 正好在订单信息之外。什么是无效值错误?
任何帮助表示赞赏 - 不知道还有什么可以尝试的。谢谢!
更新: 我检查并验证了所有包名称和帐户设置 真正的问题似乎是我所打的服务。我将其切换为: https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/purchaseToken
我还改用了 Google Client API,因为它看起来比手动创建请求更简洁。
感谢您的帮助和回复
【问题讨论】:
-
同样的问题,你解决了吗?
-
同样的问题,你解决了吗?@Fid @Antoine 。按照第一个答案,我有同样的错误。
-
我认为我的有效载荷不正确,但我不记得具体是哪一部分。
-
拯救了我的一天!还需要把url改成“订阅”。
-
你的问题解决了吗?
标签: java google-play