gpt4 book ai didi

java - Google Play Developer API - 查询购买 token 返回无效值

转载 作者:太空狗 更新时间:2023-10-29 22:35:13 30 4
gpt4 key购买 nike

我正在尝试设置一个网络服务来查询 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"
}
}

这是我尝试过的:

在代码方面,我使用 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,因为它看起来比手动创建请求更简洁。

感谢帮助和回复

最佳答案

First I want to share with you what is 400 bad request and what is the real cause for occuring it?

Ans: 表示查询无效。例如,父 ID 缺失或请求的维度或指标组合无效。

建议的操作:您需要更改 API 查询才能使其正常工作。

资源链接: Standard Error Responses

您的问题:

您的代码运行正常并返回相关的 json 文件作为输出。但是过了一段时间后,想获取购买信息时就不行了。它给出错误消息 “HTTP/1.1 400 Bad Request”

根本原因:

对于刷新 token ,响应总是包含一个新的访问 token 。响应如下所示:

{
"access_token":"1/fFBGRNJru1FQd44AzqT3ZgXXXXXX",
"expires_in":3920,
"token_type":"Bearer",
}

因此,访问 token 有一个到期时间。过期后,访问 token 将失效。

还有一个限制。将发行的刷新 token 的数量是有限制的;每个客户端/用户组合一个限制,所有客户端的每个用户另一个限制。

因此,就您而言,您已经超过了创建刷新 token 的限制。

解决方案:

因此,您首先需要撤销 token 。然后将刷新 token 保存在长期存储中,只要它们仍然有效,就可以继续使用它们。

由于您正在使用刷新 token ,因此您需要将 http 发布请求 https://accounts.google.com/o/oauth2/token 更改为 https://www .googleapis.com/oauth2/v4/token

因此您的代码将如下所示:

String refreshToken = "1/ljll6d9ME3Uc13jMrBweqXugV4g4timYcXXXXXXXXX";
HttpPost request = new HttpPost("https://www.googleapis.com/oauth2/v4/token");
List<NameValuePair> params = new ArrayList<NameValuePair>();
...............
...............

撤销程序:

有两种撤销方式。

  1. 用户可以通过访问 Account Settings 来撤销访问权限
  2. 应用程序也可以通过编程方式撤销授予它的访问权限。

要以编程方式撤销 token ,您的应用程序会向 https://accounts.google.com/o/oauth2/revoke 发出请求并将 token 作为参数包含在内:

curl https://accounts.google.com/o/oauth2/revoke?token={token}

token 可以是访问 token 或刷新 token 。如果token是access token,并且有相应的refresh token,那么refresh token也会被撤销。

N.B: If the revocation is successfully processed, then the status code of the response is 200. For error conditions, a status code 400 is returned along with an error code.

资源链接:

  1. Offline access, Using refresh token and Revoke a token

关于java - Google Play Developer API - 查询购买 token 返回无效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35019357/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com