Android订阅和Google API

use*_*041 7 api android subscription oauth-2.0

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

我希望我的服务能够进行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
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用此JWT对象检索访问令牌.问题是,当我使用访问令牌时,我得到了开发者帐户不拥有应用程序的错误,这是不正确的.

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

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

Ahm*_*med 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>";
Run Code Online (Sandbox Code Playgroud)

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

$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
Run Code Online (Sandbox Code Playgroud)

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

$fields = array(
    'grant_type'=>'refresh_token',
    'refresh_token'=>$refresh_token,
    'client_id'=>CLIENT_ID,
    'client_secret'=>CLIENT_SECRET,
);
Run Code Online (Sandbox Code Playgroud)

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

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