7

我正在尝试在我的应用程序中使用来自 Google Play 的新 Android 订阅系统(我的应用内计费已经正常工作)。我已成功完成订阅计费,但我现在想使用 android 文档 (http://developer.android.com/guide/market/billing/billing_subscriptions.html) 中所示的 google api 检索有关此订阅的信息.

我希望我的服务能够执行 API 调用来检索这些信息,但是我在身份验证方面遇到了问题(使用 oauth2)。到目前为止,这就是我所做的(在我的 php 服务中):

require_once 'google-api-php-client/src/apiClient.php'

const SERVICE_ACCOUNT_NAME = 'email from services account access';
$key = 'content of my private key retrieved from services account access';    

$client = new apiClient();
$cred = new apiAssertionCredentials(SERVICE_ACCOUNT_NAME, array('https://www.googleapis.com/auth/androidpublisher'), $key);
$assertion = $cred->generateAssertion(); // This generate my encrypted JWT

然后我尝试使用此 JWT 对象检索访问令牌。问题是,当我使用给定的访问令牌时,我收到开发人员帐户不拥有应用程序的错误,这是不正确的。

(我知道这不是这样做的方法,但我只是想使用 JWT 检索 access_token 以了解它为什么不起作用,如果我按照 google apis 文档中的指示进行操作,它也不起作用)。

我需要从服务器进行此 API 调用,因此无需涉及最终用户(无需手动同意)。

4

2 回答 2

8

我遇到了同样的问题,最终发现目前服务帐户无法访问 Play API。

我不确定 Google 何时计划修复此问题,但您可以通过创建 Web 应用程序客户端 ID 并设置基本登录页面以首先使用新的 Web 应用程序客户端数据生成代码并转到 $client- 来解决此问题>createAuthUrl():

$client = new apiClient();

$key = file_get_contents(KEY_FILE);
$client->setClientId(CLIENT_ID);
$client->setClientSecret(CLIENT_SECRET);
$client->setRedirectUri(MY_WEBAPP_URL);
$client->setDeveloperKey($key);
$client->setScopes(array('https://www.googleapis.com/auth/androidpublisher'));

$authUrl = $client->createAuthUrl();
print "<a class='login' href='$authUrl'>Connect Me!</a>";

这应该会将您带到 Google 登录页面,您应该使用开发者帐户登录。当您授权应用程序时,它将带您回到您在设置客户端 ID 时定义的 Web 应用程序 URL,并将 CODE 作为获取参数。您可以使用生成令牌(更重要的是,刷新令牌),如下所示:

$url = 'https://accounts.google.com/o/oauth2/token';

$fields = array(
    'grant_type'=>'authorization_code',
    'code'=>$code,
    'client_id'=>CLIENT_ID,
    'client_secret'=>CLIENT_SECRET,
    'redirect_uri'=>MY_WEBAPP_URL
);

// cURL call to OAuth URL with $fields sent as POST

这应该会返回带有刷新令牌的 JSON 数据。保存此令牌并在您需要生成访问令牌时使用它进行另一个调用。您将基本上运行与获取刷新令牌相同的代码,但使用不同的字段:

$fields = array(
    'grant_type'=>'refresh_token',
    'refresh_token'=>$refresh_token,
    'client_id'=>CLIENT_ID,
    'client_secret'=>CLIENT_SECRET,
);

这将为您提供一个访问令牌,您可以使用它从以下 URL 获取购买数据: https://www.googleapis.com/androidpublisher/v1/applications/[PACKAGE]/subscriptions/[SKU]/purchases/[PURCHASE_TOKEN]?access_token=[ACCESS_TOKEN]

诀窍是获取刷新令牌,一旦你拥有了其余的应该非常简单。

于 2012-06-18T20:25:36.193 回答
0

我有同样的问题。发生这种情况是因为您在 Google API 中授权不拥有该应用程序的用户并尝试获取低于您的应用程序的数据。

在这个主题中,它得到了很好的描述。http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=2528691&topic=16285&ctx=topic

您应该通过 OAuth2 授权应用程序的所有者,然后使用 Google API 获取令牌。

于 2012-10-29T11:20:59.050 回答