gpt4 book ai didi

java - 无法从 Google Play Android Developer API 获取订阅信息

转载 作者:IT老高 更新时间:2023-10-28 20:25:41 27 4
gpt4 key购买 nike

我正在尝试使用适用于 Java 的 Google API 客户端库来获取有关在我的 Android 应用中购买的用户订阅的信息。这是我现在的做法:

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 是来自 Google 控制台的 API 访问的电子邮件地址。GOOGLE_KEY_FILE_PATH是从API Access下载的p12文件。
GOOGLE_PRODUCT_NAME 是品牌信息中的产品名称。
在 Google APIS 控制台中,“Google Play Android Developer API”服务已启用。

我得到的是:

{
"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."
}

非常感谢您对这个问题的帮助...

最佳答案

我搞定了!我遵循的步骤:

先决条件

在开始之前,我们需要生成一个刷新 token 。为此,我们首先必须创建一个 API 控制台项目:

  1. 转至APIs Console并使用您的 Android 开发人员登录帐户(与 Android Developer Console 中用于上传 APK 的帐户相同)。
  2. 选择创建项目。
  3. 转到左侧导航面板中的服务。
  4. 打开 Google Play Android 开发者 API
  5. 接受服务条款。
  6. 转到左侧导航面板中的 API 访问。
  7. 选择创建 OAuth 2.0 客户端 ID:
    • 在第一页,您需要填写产品名称,但不需要 Logo 。
    • 在第二个页面,选择web application并设置redirect URI和 Javascript 的起源。稍后我们将使用它作为重定向 URI。
  8. 选择创建客户端 ID。请记住Client IDClient secret,我们稍后会用到它们。

所以,现在我们可以生成刷新 token 了:

  1. 转到以下 URI(请注意,重定向 URI 必须与客户端 ID 中输入的值完全匹配,包括任何尾部反斜杠):

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=REDIRECT_URI&client_id=CLIENT_ID

  1. 出现提示时选择允许访问。
  2. 浏览器将使用 code 参数重定向到您的重定向 URI,该参数类似于 4/eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI。复制此值。

创建一个主类:

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_IDGOOGLE_CLIENT_SECRETGOOGLE_REDIRECT_URI 是之前的值。

终于,我们有了刷新 token !此值不会过期,因此我们可以存储在某个站点中,例如属性文件。

访问 Google Play Android Developer API

  1. 获取访问 token 。我们将需要我们之前的刷新 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;

    }

  2. 现在,我们可以访问 Android API。我对订阅的到期时间很感兴趣,所以:

    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;

    }

仅此而已!

一些步骤来自 https://developers.google.com/android-publisher/authorization .

关于java - 无法从 Google Play Android Developer API 获取订阅信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11115381/

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