5

简而言之:我可以在服务器端使用 Google Play Android Developer API 而不在 Play 商店中提供任何应用程序吗?

背景:我正在开发一个为应用程序提供每月订阅的项目。每个订阅的对应数据(购买令牌、日期等)都存储在后端数据库中。现在我想创建一个遍历每个数据集的 cronjob。对于每个订阅,我想联系 Google API 以检索订阅是否仍然有效的信息,并根据响应状态更新我们的数据库.

对于后端逻辑,我使用google-api-java-client library

要取消或验证订阅,我需要先使用 OAuth2 对自己进行身份验证。去过也做过。

new GoogleCredential.Builder()
    .setTransport(HTTP_TRANSPORT)
    .setJsonFactory(JSON_FACTORY)
    .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
    .setServiceAccountScopes("https://www.googleapis.com/auth/androidpublisher") // $1
    .setServiceAccountPrivateKeyFromP12File(new File(filePath))
    .setClientSecrets(CLIENT_ID, CLIENT_SECRET) // $2
    .build();

$1:我不知道给定的帐户范围是否有效。因为我只能在极少数例子中找到这个值,但在这个概述谷歌操场上都没有

$2 我想这是必要的,尽管我发现了很多没有提供这些信息的例子。

但是,不幸的是,当我提供无效数据(如错误的电子邮件或私钥)时,我看不到任何差异。

问题

  • 如何验证 GoogleCredential 是否正确?
  • 我可以在接下来的步骤中看到它吗,比如联系 androidpublisher API?

在下一步中,我尝试获取订阅的购买状态:

Androidpublisher publisher = new Androidpublisher.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                               .setApplicationName(GOOGLE_PRODUCT_NAME) // $1                
                               .build();
Androidpublisher.Purchases purchases = publisher.purchases();
Androidpublisher.Purchases.Get get = purchases.get("android.test.purchased", "monthly001", "mytoken"); // $2
SubscriptionPurchase subscripcion = get.execute(); 

$1:来自 API 控制台的我的虚拟产品名称-> API 访问

$2:除此之外,androidpush API不允许通过服务帐户联系它,而只能通过 Web 服务器应用程序 auth flow 联系它,我不知道在 get- 方法的参数中插入什么。

这是 API: https ://developers.google.com/android-publisher/v1/purchases/get

问题

  • 在这种情况下,包名称是什么,subscriptionId 是什么?
  • 我在哪里获取/设置这些值?

阅读本文档后,我知道有一种方法可以处理虚假/静态响应。但是,如果这也适用于订阅,或者仅适用于移动设备上的应用内计费,我无法在任何地方阅读。

无论如何,我想知道为什么/是否有任何简单的方法可以使用沙箱或某物进行开发。类似。

我仍然觉得我只是错过了一个重要的部分来理解事情应该如何运作。也许你们中的某个人可以给我一个提示如何在这个地方进行,或者可以告诉我我错在哪里。

亲切的问候,

克里斯托弗

4

1 回答 1

4

我现在可以弄清楚我以前的大部分理解问题。

=1= 生成授权 URL

String authorizeUrl = new GoogleAuthorizationCodeRequestUrl(googleClientId,callbackUrl,"https://www.googleapis.com/auth/androidpublisher").build()    
// See why: http://stackoverflow.com/questions/8433990/when-authenticating-with-oauth-and-youtube-always-get-error-invalid-grant-on
authorizeUrl += "&approval_prompt=force&access_type=offline"

=2= 认证

由于 server-webflow 不适用于 androidpublisher API,因此客户现在必须手动调用 (1) 中生成的 URL。

=3=回调

谷歌回调应该处理接下来的步骤。回调包含我们必须使用的参数“code”。

=4= 请求授权令牌

    // Build the HTTP parameter
    Map<String,String> params = [:]
    params.put("grant_type", "authorization_code")
    params.put("code", code.encodeAsURL())
    params.put("client_id", customer.googleClientId.encodeAsURL())
    params.put("client_secret", customer.googleClientSecret.encodeAsURL())
    params.put("redirect_uri", getCallbackUrl().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)

    // Map result
    OAuth2Result oAuth2Result = new OAuth2Result()
    oAuth2Result.accessToken = jsonResult.getAt("access_token")
    oAuth2Result.refreshToken = jsonResult.getAt("refresh_token")
    oAuth2Result.ttlSeconds = Integer.parseInt(jsonResult.getAt("expires_in").toString())
    oAuth2Result.tokenType = jsonResult.getAt("token_type") 

=5= 请求刷新令牌

    // Build the HTTP parameter
    Map<String,String> params = [:]
    params.put("grant_type", "refresh_token")
    params.put("refresh_token", this.customer.googleRefreshToken.encodeAsURL())
    params.put("client_id", customer.googleClientId.encodeAsURL())
    params.put("client_secret", customer.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)

    // Map result
    OAuth2Result oAuth2Result = new OAuth2Result()
    oAuth2Result.accessToken = jsonResult.getAt("access_token")
    oAuth2Result.refreshToken = jsonResult.getAt("refresh_token")
    oAuth2Result.ttlSeconds = Integer.parseInt(jsonResult.getAt("expires_in").toString())
    oAuth2Result.tokenType = jsonResult.getAt("token_type")
于 2012-10-08T10:58:18.473 回答