最后我可以解决我最近处理访问 google API 的 OAuth2 身份验证的问题。
但是现在我在查询 android 开发人员 API 以检索有关订阅的状态信息时遇到了困难。我正在使用以下 REST API 调用:
https://www.googleapis.com/androidpublisher/v1/applications/ APP_PACKAGE /subscriptions/ SUBSCRIPTION_ID /purchases/ PURCHASE_TOKEN ?access_token= AUTH_TOKEN
- APP_PACKAGE 我上传到开发者控制台的应用程序的包名
- SUBSCRIPTION_ID为应用指定的订阅 ID(开发者控制台)
- PURCHASE_TOKEN (Yet dummy) 购买代币
- AUTH_TOKEN 从 OAuth2 检索到的身份验证令牌。
我检索到的此请求的身份验证令牌如下:
// Build the HTTP parameter
Map<String,String> params = [:]
params.put("grant_type", "refresh_token")
params.put("refresh_token", googleRefreshToken.encodeAsURL())
params.put("client_id", googleClientId.encodeAsURL())
params.put("client_secret", googleClientSecret.encodeAsURL())
// Send the POST request
// This action might throw an exception in case any parameter were wrong, invalid or not specified.
String result = HttpRequestHandler.sendRequest("https://accounts.google.com/o/oauth2/token", params);
JSONElement jsonResult = JSON.parse(result)
这工作得很好,但上面提到的 REST 调用返回 500 错误 - 没有任何给定的消息。
{
"error": {
"code": 500,
"message": null
}
}
我读到有些人有几乎类似的问题,但只有在联系取消 API时。
一些信息:
- 属于客户端 ID 的 google-user 也是 android 应用程序的所有者
- 该应用程序尚未发布
- 该应用授予 com.android.vending.BILLING 访问权限
- 我还在应用程序中实现了一个虚拟的 BillingService 和 BillingReceiver
由于我没有检索到任何错误消息,我现在真的不知道如何继续。还有其他人知道这个问题吗?
编辑 1
在玩各种测试用例时,我得到了非常奇怪的结果。例如:如果我使用 <= 7 个字符的 PURCHASE_TOKEN,那么我会收到以下响应:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "notFound",
"message": "The subscription purchase token was not found.",
"locationType": "parameter",
"location": "token"
}
],
"code": 404,
"message": "The subscription purchase token was not found."
}
}
而当我使用 PURCHASE_TOKEN > 7 个字符时,我仍然会收到 500 错误。就像从这里复制的示例令牌:rojeslcdyyiapnqcynkjyyjh
编辑 2
服务器偶尔会随机响应 503 后端错误。
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error"
}
],
"code": 503,
"message": "Backend Error"
}
}
编辑 3
如果我使用 Java API(而不是直接 URL 调用),我会得到同样的错误。
// Build token for the response
TokenResponse tokenResponse = new TokenResponse();
tokenResponse.setAccessToken(googleAccessToken);
tokenResponse.setRefreshToken(googleRefreshToken);
tokenResponse.setExpiresInSeconds(3600L);
tokenResponse.setScope(OAuth2Handler.SCOPE_ANDROID_PUBLISHER);
tokenResponse.setTokenType("Bearer");
// Init credential container
HttpRequestInitializer credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(googleClientId, googleClientSecret)
.build()
.setFromTokenResponse(tokenResponse);
// Connect to the android publisher API
Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName("NameOfMyApplicationInGooglePlayStore")
.build();
// Retrieve subscription purchase information
Androidpublisher.Purchases purchases = publisher.purchases();
Androidpublisher.Purchases.Get get = purchases.get(
packageName,
subscriptionId,
purchaseToken
);
// Analyse result
SubscriptionPurchase subscription = get.execute();
亲切的问候,克里斯托弗