Visualizzare i problemi che interessano un account commerciante

I problemi correlati all'account influiscono sulla visibilità dei tuoi prodotti e sulla tua capacità di partecipare a vari programmi Merchant Center. La sotto-API Accounts ti consente di recuperare un elenco di problemi che interessano il tuo account commerciante. In questo modo puoi identificare e risolvere i problemi in modo proattivo.

È tua responsabilità rispettare le norme relative agli annunci Shopping e alle schede senza costi. Google Shopping si riserva il diritto di applicare queste norme e di rispondere in modo appropriato se dovessimo riscontrare contenuti o comportamenti che le violano.

Ogni AccountIssue fornisce dettagli come:

  • title: un riepilogo del problema.
  • severity: la gravità del problema. Esempi:
    • CRITICAL: un problema che impedisce la pubblicazione delle offerte.
    • ERROR: un problema che potrebbe influire sulle offerte o indicare un problema.
    • SUGGESTION: un suggerimento per il miglioramento.
  • impactedDestinations: i programmi (ad es. annunci Shopping o schede senza costi) e le regioni interessate dal problema, insieme alla gravità in questi contesti.
  • detail: un messaggio con maggiori informazioni sul problema.
  • documentationUri: un link all'articolo del Centro assistenza su come risolvere il problema.

Considerazioni speciali

  • Internazionalizzazione (i18n): quando elenchi i problemi correlati all'account, puoi specificare un language_code (ad es. "en-US", "fr-FR") e un time_zone (ad es. "America/Los_Angeles", "Europe/Paris") nella richiesta. In questo modo, le stringhe leggibili in risposta, come i detail del problema, vengono localizzate in modo appropriato. Se questi campi non vengono forniti, l'API utilizza per impostazione predefinita l'inglese ("en-US") e il fuso orario "America/Los_Angeles" (ora del Pacifico).
  • Impaginazione: l'API supporta l'impaginazione tramite page_size e page_token parametri in ListAccountIssuesRequest. In questo modo puoi recuperare i problemi in blocchi gestibili. Il valore massimo di page_size è 1000, mentre il valore predefinito è 50.
  • Ordinamento: i problemi restituiti dall'API vengono generalmente ordinati in base alla gravità e a una priorità interna, in modo simile a come vengono visualizzati in Merchant Center. Tieni presente che l'API non supporta l'ordinamento personalizzato.
  • Origine dati: la sotto-API Accounts recupera i dati dallo stesso backend utilizzato dalla pagina Diagnostica in Merchant Center.

Recuperare i problemi correlati al tuo account

Per elencare i problemi correlati all'account, invia una GET richiesta al accounts.issues.list metodo:

GET https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/issues?language_code=en-GB&time_zone.id=Europe/London&page_size=10

Ecco una risposta di esempio per un subaccount sospeso per una violazione relativa a "pagina di destinazione non funzionante".

{
  "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"
    }
  ]
}

Elencare i problemi correlati all'account per un account specifico

Questo caso d'uso mostra come recuperare tutti i problemi a livello di account per un determinato account Merchant Center. Le informazioni restituite possono aiutarti a identificare e risolvere i problemi che influiscono sul rendimento e sull'idoneità del tuo account a vari programmi.

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);
  }
}

Java

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();

Python

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"

Elencare i problemi correlati all'account per tutti i subaccount di un account avanzato

Se gestisci un account avanzato, potresti dover verificare la presenza di problemi in tutti i tuoi subaccount. Questo esempio mostra come elencare i subaccount e poi, per ogni subaccount, recuperare in modo asincrono i problemi correlati all'account. Questo approccio è efficiente per la gestione di più account.

Java

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.api.gax.grpc.InstantiatingGrpcChannelProvider;
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 a channel provider. This provider manages a pool of gRPC channels
    // to enhance throughput for bulk operations. Each individual channel in the pool
    // can handle up to approximately 100 concurrent requests.
    //
    // Channel: A single connection pathway to the service.
    // Pool: A collection of multiple channels managed by this provider.
    //   Requests are distributed across the channels in the pool.
    //
    // We recommend estimating the number of concurrent requests you'll make, divide by 50 (50%
    // utilization of channel capacity), and set the pool size to that number.
    InstantiatingGrpcChannelProvider channelProvider =
        InstantiatingGrpcChannelProvider.newBuilder().setPoolSize(30).build();

    // Creates service settings using the credentials retrieved above.
    AccountsServiceSettings accountsServiceSettings =
        AccountsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .setTransportChannelProvider(channelProvider)
            .build();

    // Creates service settings using the credentials retrieved above.
    AccountIssueServiceSettings accountIssueServiceSettings =
        AccountIssueServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .setTransportChannelProvider(channelProvider)
            .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

Per elencare i problemi correlati ai subaccount di un account avanzato, devi prima elencare i subaccount (ad es. utilizzando accounts.listSubaccounts) e poi scorrere ogni ID subaccount per chiamare il accounts.issues.list metodo. Il seguente esempio di curl mostra come elencare i problemi correlati a un singolo subaccount. Ripeti questa richiesta per ogni ID subaccount.

 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"
 ```