无法从谷歌的预订信息播放的Android开发者API [英] Unable to get the subscription information from Google Play Android Developer API
问题描述
I'trying使用谷歌的API客户端库for Java来获取有关我的Android应用程序购买的用户订阅的信息。下面是我在做什么现在:
I'trying to use Google APIs Client Library for Java to get information about user's subscriptions purchased in my android app. Here is how I'm doing for now:
HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
JsonFactory JSON_FACTORY = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(GOOGLE_CLIENT_MAIL)
.setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher")
.setServiceAccountPrivateKeyFromP12File(new File(GOOGLE_KEY_FILE_PATH))
.build();
Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).
setApplicationName(GOOGLE_PRODUCT_NAME).
build();
Androidpublisher.Purchases purchases = publisher.purchases();
Get get = purchases.get("XXXXX", subscriptionId, token);
SubscriptionPurchase subscripcion = get.execute(); //Exception returned here
GOOGLE_CLIENT_MAIL
是从谷歌控制台API访问权限的电子邮件地址。
GOOGLE_KEY_FILE_PATH
是由API访问下载的P12文件。
GOOGLE_PRODUCT_NAME
是从品牌信息产品名称。
在谷歌API控制台服务谷歌播放Android开发者API已启用。
GOOGLE_CLIENT_MAIL
is the email address from API Access from the Google Console.
GOOGLE_KEY_FILE_PATH
is the p12 file downloaded from the API Access.
GOOGLE_PRODUCT_NAME
is the product name from the branding information.
In Google APIS Console the Service "Google Play Android Developer API" is enabled.
什么我得到的是:
{
"code" : 401,
"errors" : [ {
"domain" : "androidpublisher",
"message" : "This developer account does not own the application.",
"reason" : "developerDoesNotOwnApplication"
} ],
"message" : "This developer account does not own the application."
}
我真的AP preciate您的帮助,这个问题...
I really appreciate your help for this issue...
推荐答案
我得到它的工作!我的步骤如下:
I got it working! The steps I followed:
开始之前,我们需要生成一个刷新令牌。要做到这一点,我们必须首先创建一个API控制台项目:
Before start, we need to generate a refresh token. To do this first we have to create an APIs console project:
- 转到 API控制台,并与你的Android开发者登录 帐户(在 Android开发者控制台用来上传的APK相同的帐户)。
- 选择创建项目。
- 转到服务在左侧导航面板。
- 旋转的谷歌播放Android开发者API 的上。
- 在接受本服务条款。
- 转至左侧导航面板的API访问。
- 选择创建的OAuth 2.0客户端ID:
- 在第一页上,则需要填写产品名称,而是一个 不需要标志。
- 在第二页,选择 Web应用程序,然后将重定向URI 和Javascript的起源。我们将用它以后的重定向URI。
- Go to the APIs Console and log in with your Android developer account (the same account used in Android Developer Console to upload the APK).
- Select Create project.
- Go to Services in the left-hand navigation panel.
- Turn the Google Play Android Developer API on.
- Accept the Terms of Service.
- Go to API Access in the left-hand navigation panel.
- Select Create an OAuth 2.0 client ID:
- On the first page, you will need to fill in the product name, but a logo is not required.
- On the second page, select web application and set the redirect URI and Javascript origins. We will use it later the redirect URI.
所以,现在我们可以生成刷新令牌:
So, now we can generate the refresh token:
- 转到下面的URI(注意,重定向URI必须在客户端ID输入的完全价值,包括任何尾随的反斜杠匹配):
<一个href="https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=$c$c&access_type=offline&redirect_uri=REDIRECT_URI&client_id=CLIENT_ID">https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=$c$c&access_type=offline&redirect_uri=REDIRECT_URI&client_id=CLIENT_ID
- 选择允许访问提示时。
- 在浏览器将被重定向到您的重定向URI用的 code 参数,这将类似于4 / eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI。复制此值。
- Select Allow access when prompted.
- The browser will be redirected to your redirect URI with a code parameter, which will look similar to 4/eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI. Copy this value.
创建一个主类:
public static String getRefreshToken(String code)
{
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/token");
try
{
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);
nameValuePairs.add(new BasicNameValuePair("grant_type", "authorization_code"));
nameValuePairs.add(new BasicNameValuePair("client_id", GOOGLE_CLIENT_ID));
nameValuePairs.add(new BasicNameValuePair("client_secret", GOOGLE_CLIENT_SECRET));
nameValuePairs.add(new BasicNameValuePair("code", code));
nameValuePairs.add(new BasicNameValuePair("redirect_uri", GOOGLE_REDIRECT_URI));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
org.apache.http.HttpResponse response = client.execute(post);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer buffer = new StringBuffer();
for (String line = reader.readLine(); line != null; line = reader.readLine())
{
buffer.append(line);
}
JSONObject json = new JSONObject(buffer.toString());
String refreshToken = json.getString("refresh_token");
return refreshToken;
}
catch (Exception e) { e.printStackTrace(); }
return null;
}
GOOGLE_CLIENT_ID
, GOOGLE_CLIENT_SECRET
和 GOOGLE_REDIRECT_URI
是previously值。
GOOGLE_CLIENT_ID
, GOOGLE_CLIENT_SECRET
and GOOGLE_REDIRECT_URI
are the previously values.
最后,我们有我们的刷新令牌!此值不会过期,所以我们可以在一些网站的存储,就像一个属性文件。
Finally, we have our refresh token! This value does not expire, so we can store in some site, like a property file.
-
获取访问令牌。我们需要我们的previosly刷新令牌:
Getting the access token. We will need our previosly refresh token:
private static String getAccessToken(String refreshToken){
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/token");
try
{
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("grant_type", "refresh_token"));
nameValuePairs.add(new BasicNameValuePair("client_id", GOOGLE_CLIENT_ID));
nameValuePairs.add(new BasicNameValuePair("client_secret", GOOGLE_CLIENT_SECRET));
nameValuePairs.add(new BasicNameValuePair("refresh_token", refreshToken));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
org.apache.http.HttpResponse response = client.execute(post);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer buffer = new StringBuffer();
for (String line = reader.readLine(); line != null; line = reader.readLine())
{
buffer.append(line);
}
JSONObject json = new JSONObject(buffer.toString());
String accessToken = json.getString("access_token");
return accessToken;
}
catch (IOException e) { e.printStackTrace(); }
return null;
}
现在,我们可以访问到Android API。我在订阅的到期时间有趣,所以:
Now, we can access to the Android API. I'm interesting in the expiration time of a subscription, so:
private static HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
private static JsonFactory JSON_FACTORY = new com.google.api.client.json.jackson2.JacksonFactory();
private static Long getSubscriptionExpire(String accessToken, String refreshToken, String subscriptionId, String purchaseToken){
try{
TokenResponse tokenResponse = new TokenResponse();
tokenResponse.setAccessToken(accessToken);
tokenResponse.setRefreshToken(refreshToken);
tokenResponse.setExpiresInSeconds(3600L);
tokenResponse.setScope("https://www.googleapis.com/auth/androidpublisher");
tokenResponse.setTokenType("Bearer");
HttpRequestInitializer credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setClientSecrets(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET)
.build()
.setFromTokenResponse(tokenResponse);
Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).
setApplicationName(GOOGLE_PRODUCT_NAME).
build();
Androidpublisher.Purchases purchases = publisher.purchases();
Get get = purchases.get(GOOGLE_PACKAGE_NAME, subscriptionId, purchaseToken);
SubscriptionPurchase subscripcion = get.execute();
return subscripcion.getValidUntilTimestampMsec();
}
catch (IOException e) { e.printStackTrace(); }
return null;
}
而这一切!
有些步骤是从<一个href="https://developers.google.com/android-publisher/authorization">https://developers.google.com/android-publisher/authorization.
这篇关于无法从谷歌的预订信息播放的Android开发者API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!