错误401谷歌api php客户端通过服务器安卓inapppurchase验证



我需要在我的服务器上验证用户之前在我的Android应用程序中进行的每一次Android购买。我认为使用谷歌api php客户端可以很容易地验证和管理服务器中的令牌。但没有任何样本,昨天谷歌发布了新版本0.6.3,提供应用内购买服务。

我遵循了->*code.google.com/p/google-api-php-client/wiki/OAuth2#Service_Accounts*

在我的代码上,google.com/apis/console/我推送了"google Play Android Developer API",并在API访问中配置了"服务帐户"。

从Android客户端APP,服务器接收PACKAGE_NAME、PRODUCT_ID并购买TOKEN。

我的服务器代码如下:

require_once '../../src/Google_Client.php';
require_once '../../src/contrib/Google_AndroidpublisherService.php';
// Set your client id, service account name, and the path to your private key.
// For more information about obtaining these keys, visit:
// https://developers.google.com/console/help/#service_accounts
const CLIENT_ID = 'asdf.apps.googleusercontent.com';
const SERVICE_ACCOUNT_NAME = 'asdf@developer.gserviceaccount.com';
// Make sure you keep your key.p12 file in a secure location, and isn't
// readable by others.
const KEY_FILE = '../../asdf/privatekey.p12';;
$client = new Google_Client();
$client->setApplicationName({APP_PACKAGE_NAME});
// Set your cached access token. Remember to replace $_SESSION with a
// real database or memcached.
session_start();
if (isset($_SESSION['token'])) {
 $client->setAccessToken($_SESSION['token']);
}
// Load the key in PKCS 12 format (you need to download this from the
// Google API Console when the service account was created.
$key = file_get_contents(KEY_FILE);
$client->setAssertionCredentials(new Google_AssertionCredentials(
    SERVICE_ACCOUNT_NAME,
    array('https://www.googleapis.com/auth/androidpublisher'),
    $key)
);
$client->setClientId(CLIENT_ID);
$service = new Google_AndroidPublisherService($client);
$res = $service->inapppurchases->get({APP_PACKAGE_NAME},{APP_PACKAGE_NAME.PRODUCT_ID}, {PURCHASE_TOKEN});
var_dump($res);

显示的错误为:

Google_ServiceException: Error calling GET https://www.googleapis.com/androidpublisher
/v1.1/applications/{APP_PACKAGE_NAME}/inapp/{APP_PACKAGE_NAME.PRODUCT_ID}/purchases
/{PURCHASE_TOKEN}: (401) This developer account does not own the application. in 
/.../google-api-php-client/src/io/Google_REST.php on line 66 Call Stack: 0.0201 
266376 1. {main}() ............

代币是正确的,我在Google API控制台中使用相同的帐户(https://code.google.com/apis/console)和谷歌开发者控制台(https://play.google.com/apps/publish/)。我只使用服务帐户api,不使用web应用程序的客户端ID和简单api访问。为了安全起见,我在这里更改了一些代码值。

有人能帮我知道我使用谷歌API验证购买服务器时出了什么问题吗?我如何认识我的应用程序的所有者?是否与Google Apis新项目、项目域、项目编号、项目ID等有关。。。?

我想我的问题是因为我试图将服务帐户与谷歌应用程序Gmail自己的帐户(非@Gmail.com帐户)一起使用。我不得不将域范围的权限委托给我的服务帐户。我必须如下实例化一个Android发布服务:(仅在Google Api Drive文档中创建)。我在Google_AssertionCredentials中以编程方式添加了"sub"参数,如下所示:

$auth = new Google_AssertionCredentials(
SERVICE_ACCOUNT_NAME,
'https://www.googleapis.com/auth/androidpublisher',
$key);
$auth->sub = "myown@email.com";
$client->setAssertionCredentials($auth);

Google Play Android开发者API中的文档非常糟糕,而Google支持也于事无补,他们会将您重定向到文档。Google PHP开发人员甚至不知道服务帐户是如何工作的。尽管我自己已经找到了答案,但谷歌需要改进所有新的Google Play In-app Billing API版本3。

相关内容

  • 没有找到相关文章

最新更新