Получить информацию о подписке на покупки в Google Play через API
Вызов Google API получил это сообщение:
{
"error": {
"errors": [
{
"domain": "androidpublisher",
"reason": "permissionDenied",
"message": "The current user has insufficient permissions to perform the requested operation."
}
],
"code": 401,
"message": "The current user has insufficient permissions to perform the requested operation."
}
}
или это сообщение об ошибке (ДОБАВЛЕНО):
{
"error": {
"errors": [
{
"domain": "androidpublisher",
"reason": "projectNotLinked",
"message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console."
}
],
"code": 403,
"message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console."
}
}
Я следую всем указаниям, которые нашел, и у меня продолжает появляться эта ошибка.
НА МОЕЙ СИСТЕМЕ
Мой код
try {
ini_set('max_execution_time', 3000);
$client = new Google_Client();
if ($credentials_file = $this->checkServiceAccountCredentialsFilePlay()) {
// set the location manually
$client->setAuthConfig($credentials_file);
} elseif (getenv('GOOGLE_APPLICATION_CREDENTIALS')) {
// use the application default credentials
$client->useApplicationDefaultCredentials();
} else {
$rv= "missingServiceAccountDetailsWarning()";
return [$rv];
}
$client->addScope("https://www.googleapis.com/auth/androidpublisher");
$serviceAndroidPublisher = new \Google_Service_AndroidPublisher($client);
$servicePurchaseSubscription = $serviceAndroidPublisher->purchases_subscriptions;
$rv = $servicePurchaseSubscription->get(
"com.my.app",
"sub1month",
"ajgbkxxxxxxxxx.AO-J1OxTOKENTOKENTOKEN-"
);
} catch (\Exception $e) {
return $e->getMessage();
}
Файл учетных данных
{
"type": "service_account",
"project_id": "project-id",
"private_key_id": "abababababababababababababababababa",
"private_key": "-----BEGIN PRIVATE KEY-----KEYBASE64=\n-----END PRIVATE KEY-----\n",
"client_email": "google-play-account@project-id.iam.gserviceaccount.com",
"client_id": "123450000000000000000",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-play-account%40project-id.iam.gserviceaccount.com"
}
В GOOGLE ИГРАТЬ НА КОНСОЛЬ
Я связываю проект с игровой консолью Google
Я добавляю учетную запись службы в консоль Google Play
Он присутствует в пользовательском меню консоли Google Play
ПО КОНСОЛИ РАЗРАБОТЧИКА API Google
ДОБАВИТЬ К сведению: мой "идентификатор проекта" находится в организации.
В консоли разработчика Google я дал все возможные разрешения учетной записи службы:
И, конечно, я включил API разработчика Google Play Android (показывая мои ошибки):
0 ответов
У меня такая же проблема.
В моем случае я использовал google app engine (python) в качестве бэкэнд-сервиса. Сначала я связал новый облачный проект Google в консоли Google Play. Я не совсем уверен, является ли это основной причиной того, что я получил ошибку 401 "Недостаточно прав доступа", но после переключения связанного проекта на мой облачный проект (который я использовал для движка приложения) это сработало на следующий день. Сразу после смены аккаунта я получил ошибку 403 "проекты не связаны". Итак, я предполагаю, что Google не сразу распознает изменение связанных проектов, и вам нужно подождать несколько часов.
Если вы используете механизм приложений, вы должны убедиться, что ваша учетная запись службы по умолчанию для механизма приложений содержит файл учетных данных JSON. Он не создан по умолчанию.
Вот код Python:
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
# production environment
credentials = oauth2client.contrib.appengine.AppAssertionCredentials(scope='https://www.googleapis.com/auth/androidpublisher')
http = credentials.authorize(httplib2.Http(memcache))
response = googleapiclient.discovery.build('androidpublisher', 'v3').purchases().subscriptions()\
.get(packageName=package_name, subscriptionId=subscription.product_id, token=subscription.token)\
.execute(http)
else:
# local environment
# setting the scope is not needed because the api client handles everything automatically
credentials = google.oauth2.service_account.Credentials.from_service_account_file('local_dev.json')
response = googleapiclient.discovery.build('androidpublisher', 'v3', credentials=credentials).purchases().subscriptions()\
.get(packageName=package_name, subscriptionId=subscription.product_id, token=subscription.token)\
.execute()