Проблемы с аккаунтом влияют на видимость ваших товаров и возможность участия в различных программах Merchant Center. API-интерфейс Accounts позволяет получить список проблем, влияющих на ваш аккаунт продавца . Это помогает выявлять и устранять проблемы заблаговременно.
Вы несёте ответственность за соблюдение правил в отношении рекламы и бесплатных объявлений в Google Покупках . Google Покупки оставляет за собой право применять эти правила и принимать соответствующие меры в случае обнаружения контента или поведения, нарушающих эти правила.
В каждой AccountIssue
содержится следующая информация:
-
title
: Краткое изложение вопроса. -
severity
: серьёзность проблемы. Примеры:-
CRITICAL
: Проблема, из-за которой предложения не отображаются. -
ERROR
: проблема, которая может повлиять на предложения или указать на проблему. -
SUGGESTION
: Рекомендация по улучшению.
-
-
impactedDestinations
: программы (например, реклама в Google Play или бесплатные листинги) и регионы, затронутые проблемой, а также степень серьезности в этих контекстах. -
detail
: сообщение с более подробным контекстом проблемы. -
documentationUri
: ссылка на статью Справочного центра о том, как решить проблему.
Особые соображения
- Интернационализация (i18n) : при перечислении проблем с аккаунтом вы можете указать в запросе
language_code
(например, «en-US», «fr-FR») иtime_zone
(например, «America/Los_Angeles», «Europe/Paris»). Это гарантирует, что понятные человеку строки в ответе, такие какdetail
проблемы, локализованы правильно. Если эти поля не указаны, API по умолчанию использует английский язык («en-US») и часовой пояс «America/Los_Angeles» (тихоокеанское время). - Пагинация : API поддерживает пагинацию с помощью параметров
page_size
иpage_token
в запросеListAccountIssuesRequest
. Это позволяет получать задачи управляемыми фрагментами. Максимальное значениеpage_size
— 1000, а значение по умолчанию — 50. - Упорядочивание : задачи, возвращаемые API, обычно сортируются по степени серьёзности и внутреннему приоритету, аналогично тому, как они отображаются в Merchant Center. Обратите внимание, что API не поддерживает пользовательскую сортировку.
- Источник данных : ПодAPI Accounts извлекает данные из того же бэкэнда, который используется страницей диагностики в Merchant Center.
Получение информации о проблемах с вашей учетной записью
Чтобы составить список проблем с аккаунтом, отправьте GET
-запрос к методу accounts.issues.list
:
GET https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/issues?language_code=en-GB&time_zone.id=Europe/London&page_size=10
Вот пример ответа для дочерней учетной записи, которая была заблокирована из-за нарушения «целевая страница не работает».
{
"accountIssues": [
{
"name": "accounts/ACCOUNT_ID/issues/home-page-issue",
"title": "Online store not confirmed",
"severity": "CRITICAL",
"impactedDestinations": [
{
"reportingContext": "SHOPPING_ADS",
"impacts": [
{
"regionCode": "001",
"severity": "CRITICAL"
}
]
}
],
"detail": "The ownership of the online store must be verified through Merchant Center",
"documentationUri": "https://support.google.com/merchants/answer/176793?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/editorial-and-professional-standards-destination-url-down-policy",
"title": "Landing page not working",
"severity": "CRITICAL",
"impactedDestinations": [
{
"reportingContext": "SHOPPING_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
},
{
"reportingContext": "DEMAND_GEN_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
},
{
"reportingContext": "VIDEO_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
}
],
"detail": "Broken landing pages or broken links in your online store are not allowed",
"documentationUri": "https://support.google.com/merchants/answer/12079604?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/pending-phone-verification",
"title": "Your phone number needs to be verified",
"severity": "CRITICAL",
"detail": "Verify your phone number to confirm your identity",
"documentationUri": "https://support.google.com/merchants/answer/12471579?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/pending-address-and-phone",
"title": "Missing business address",
"severity": "CRITICAL",
"detail": "Provide a valid business address in Merchant Center",
"documentationUri": "https://support.google.com/merchants/answer/12471579?hl=en-US"
}
]
}
Список проблем с учетной записью для конкретной учетной записи
В этом примере показано, как получить информацию обо всех проблемах на уровне аккаунта Merchant Center. Возвращаемая информация поможет вам выявить и устранить проблемы, влияющие на эффективность вашего аккаунта и возможность участия в различных программах.
AppsScript
/**
* Lists all issues for a given Merchant Center account.
*/
function listAccountIssues() {
// IMPORTANT:
// Enable the Merchant API Accounts sub-API Advanced Service and call it
// "MerchantApiAccounts"
// Replace this with your Merchant Center ID.
const accountId = "<MERCHANT_CENTER_ID>";
// Construct the parent name
const parent = 'accounts/' + accountId;
try {
console.log('Sending list Account Issues request');
// Set pageSize to the maximum value (default: 50)
let pageSize = 100;
let pageToken;
let count = 0;
// Call the Account.Issues.list API method. Use the pageToken to iterate
// through all pages of results.
do {
response = MerchantApiAccounts.Accounts.Issues.list(parent, {pageSize, pageToken});
for (const issue of response.accountIssues) {
console.log(issue);
count++;
}
pageToken = response.nextPageToken;
} while (pageToken); // Exits when there is no next page token.
console.log('The following count of Account Issues were returned: ', count);
} catch (e) {
console.log('ERROR!');
console.log(e);
}
}
Ява
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.AccountIssue;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient.ListAccountIssuesPagedResponse;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceSettings;
import com.google.shopping.merchant.accounts.v1.AccountName;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to list all the account issues of an account.
*
* <p>If you want to query the account issues of all the sub-accounts of an advanced account, see
* ListAdvancedAccountIssuesSampleAsync.
*/
public class ListAccountIssuesSample {
public static void listAccountIssues(Config config) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
AccountIssueServiceSettings accountIssueServiceSettings =
AccountIssueServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (AccountIssueServiceClient accountIssueServiceClient =
AccountIssueServiceClient.create(accountIssueServiceSettings)) {
// Gets the account ID from the config file.
String accountId = config.getAccountId().toString();
// Creates account name to identify account.
String name = AccountName.newBuilder().setAccount(accountId).build().toString();
ListAccountIssuesRequest request =
ListAccountIssuesRequest.newBuilder().setParent(name).build();
System.out.println("Sending list account issues request:");
ListAccountIssuesPagedResponse response =
accountIssueServiceClient.listAccountIssues(request);
int count = 0;
// Iterates over all rows in all pages and prints the issue in each row.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
for (AccountIssue accountIssue : response.iterateAll()) {
System.out.println(accountIssue);
count++;
}
System.out.print("The following count of account issues were returned: ");
System.out.println(count);
} catch (Exception e) {
System.out.println("An error has occured: ");
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
listAccountIssues(config);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Accounts\V1\Client\AccountIssueServiceClient;
use Google\Shopping\Merchant\Accounts\V1\ListAccountIssuesRequest;
/**
* Lists all the account issues of an account.
*/
class ListAccountIssues
{
/**
* A helper function to create the parent string.
*
* @param array $accountId
* The account.
*
* @return string The parent has the format: `accounts/{account_id}`
*/
private static function getParent($accountId)
{
return sprintf("accounts/%s", $accountId);
}
/**
* Lists all the account issues for a given Merchant Center account.
*
* @param array $config
* The configuration data used for authentication and getting the acccount ID.
* @return void
*/
public static function listAccountIssuesSample($config): void
{
// Gets the OAuth credentials.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config.
$options = ['credentials' => $credentials];
// Creates a client.
$accountIssueServiceClient = new AccountIssueServiceClient($options);
// Creates parent.
$parent = self::getParent($config['accountId']);
// Creates the request.
$request = new ListAccountIssuesRequest(['parent' => $parent]);
// Calls the API and catches and prints any network failures/errors.
try {
print "Sending list account issues request:\n";
$response = $accountIssueServiceClient->listAccountIssues($request);
$count = 0;
// Iterates over all elements and prints the issue in each row.
foreach ($response->iterateAllElements() as $accountIssue) {
print_r($accountIssue);
$count++;
}
print "The following count of account issues were returned: ";
print $count . "\n";
} catch (ApiException $e) {
print "An error has occured: \n";
print $e->getMessage() . "\n";
}
}
/**
* Helper to execute the sample.
*
* @return void
*/
public function callSample(): void
{
$config = Config::generateConfig();
// Lists the account issues.
self::listAccountIssuesSample($config);
}
}
// Run the script
$sample = new ListAccountIssues();
$sample->callSample();
Питон
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_accounts_v1 import AccountIssueServiceClient
from google.shopping.merchant_accounts_v1 import ListAccountIssuesRequest
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def list_account_issues():
"""Lists all the account issues of an account."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = AccountIssueServiceClient(credentials=credentials)
request = ListAccountIssuesRequest(parent=_PARENT)
print("Sending list account issues request:")
# Makes the request and catches and prints any error messages.
try:
response = client.list_account_issues(request=request)
count = 0
for account_issue in response:
print(account_issue)
count += 1
print("The following count of account issues were returned: ")
print(count)
except RuntimeError as e:
print("An error has occured: ")
print(e)
if __name__ == "__main__":
list_account_issues()
cURL
curl -X GET \
"https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/issues?language_code=en-US&time_zone.id=America/Los_Angeles&page_size=50" \
--header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
--header "Accept: application/json"
Список проблем со счетами для всех субсчетов расширенного счета
Если вы управляете расширенной учётной записью, вам может потребоваться проверить наличие проблем во всех ваших дочерних учётных записях. В этом примере показано, как составить список дочерних учётных записей, а затем для каждой дочерней учётной записи асинхронно получить информацию о проблемах. Этот подход эффективен при работе с несколькими учётными записями.
Ява
import static com.google.api.core.ApiFutures.transform;
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceSettings;
import com.google.shopping.merchant.accounts.v1.AccountName;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient.ListSubAccountsPagedResponse;
import com.google.shopping.merchant.accounts.v1.AccountsServiceSettings;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesRequest;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesResponse;
import com.google.shopping.merchant.accounts.v1.ListSubAccountsRequest;
import java.io.IOException;
import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to list the account issues of all the sub-accounts of an advanced
* account.
*/
public class ListAdvancedAccountIssuesAsyncSample {
/** Returns the list of issues for the given account. */
private static ApiFuture<ListAccountIssuesResponse> getAccountIssues(
AccountIssueServiceClient accountIssueServiceClient, String account) {
return accountIssueServiceClient
.listAccountIssuesCallable()
.futureCall(ListAccountIssuesRequest.newBuilder().setParent(account).build());
}
/**
* Returns a map of account issues where key is the sub-account resource name and the value is the
* list of issues for each sub-account. Takes the API clients and the name of the advanced account
* as input.
*/
private static ApiFuture<Map<String, ListAccountIssuesResponse>> getSubAccountIssues(
AccountsServiceClient accountsServiceClient,
AccountIssueServiceClient accountIssueServiceClient,
String advancedAccount)
throws IOException {
// Creates a direct executor to run the transform functions.
Executor executor = MoreExecutors.directExecutor();
// The parent has the format: accounts/{account}
ListSubAccountsRequest request =
ListSubAccountsRequest.newBuilder().setProvider(advancedAccount).build();
System.out.println("Sending list subaccounts request:");
// Lists all sub-accounts of the advanced account.
ListSubAccountsPagedResponse listSubAccountsResponse =
accountsServiceClient.listSubAccounts(request);
// Iterates over all subAccounts and lists account issues for each.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
List<ApiFuture<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>>>
accountIssuesFutures =
StreamSupport.stream(listSubAccountsResponse.iterateAll().spliterator(), false)
.map(
account ->
transform(
getAccountIssues(accountIssueServiceClient, account.getName()),
(ListAccountIssuesResponse response) ->
new AbstractMap.SimpleEntry<>(account.getName(), response),
executor))
.collect(Collectors.toList());
// Collects all the responses into a single future.
ApiFuture<List<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>>> accountIssuesList =
ApiFutures.allAsList(accountIssuesFutures);
// Transforms the list of responses into a map.
return transform(
accountIssuesList,
(List<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>> list) ->
list.stream()
.collect(
Collectors.toMap(
AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue,
(a, b) -> a)),
executor);
}
public static void listAccountIssues(Config config) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Gets the account ID from the config file.
// Make sure to use the advanced account ID here, otherwise the API will return an error.
String accountId = config.getAccountId().toString();
// Creates account name to identify account.
String parent = AccountName.newBuilder().setAccount(accountId).build().toString();
// Creates service settings using the credentials retrieved above.
AccountsServiceSettings accountsServiceSettings =
AccountsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates service settings using the credentials retrieved above.
AccountIssueServiceSettings accountIssueServiceSettings =
AccountIssueServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (AccountsServiceClient accountsServiceClient =
AccountsServiceClient.create(accountsServiceSettings);
AccountIssueServiceClient accountIssueServiceClient =
AccountIssueServiceClient.create(accountIssueServiceSettings)) {
ApiFuture<Map<String, ListAccountIssuesResponse>> subAccountIssues =
getSubAccountIssues(accountsServiceClient, accountIssueServiceClient, parent);
ApiFutures.addCallback(
subAccountIssues,
new ApiFutureCallback<Map<String, ListAccountIssuesResponse>>() {
@Override
public void onSuccess(Map<String, ListAccountIssuesResponse> results) {
System.out.println("Account Issues");
for (Entry<String, ListAccountIssuesResponse> entry : results.entrySet()) {
System.out.println("Issues for account " + entry.getKey());
System.out.println(entry.getValue());
}
}
@Override
public void onFailure(Throwable throwable) {
System.out.println(throwable);
}
},
MoreExecutors.directExecutor());
} catch (Exception e) {
System.out.println("An error has occured: ");
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
listAccountIssues(config);
}
}
cURL
Чтобы вывести список проблем для дочерних учётных записей расширенной учётной записи, сначала необходимо вывести список дочерних учётных записей (например, с помощью accounts.listSubaccounts
), а затем пройтись по идентификаторам каждой дочерней учётной записи, вызвав метод accounts.issues.list
. В следующем примере curl показано, как вывести список проблем для одной дочерней учётной записи. Повторите этот запрос для каждого идентификатора дочерней учётной записи.
curl -X GET \
"https://merchantapi.googleapis.com/accounts/v1/accounts/{SUB_ACCOUNT_ID}/issues?language_code=en-US&time_zone.id=America/Los_Angeles&page_size=50" \
--header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
--header "Accept: application/json"
```