تؤثّر المشاكل في الحساب على مستوى ظهور منتجاتك وقدرتك على المشاركة في برامج Merchant Center المختلفة. تتيح لك واجهة Accounts sub-API الحصول على قائمة بالمشاكل التي تؤثر في حساب التاجر. يساعدك ذلك في تحديد المشاكل ومعالجتها بشكل استباقي.
أنت مسؤول عن الالتزام بسياسات إعلانات Shopping والبيانات المجانية. تحتفظ Google Shopping بالحق في تنفيذ هذه السياسات واتخاذ الإجراءات المناسبة إذا عثرنا على محتوى أو سلوك يخالف هذه السياسات.
يوفّر كلّ AccountIssue
تفاصيل مثل:
-
title: ملخّص المشكلة -
severity: تشير إلى مدى خطورة المشكلة. ومن الأمثلة على ذلك:-
CRITICAL: مشكلة تؤدي إلى عدم عرض العروض -
ERROR: مشكلة قد تؤثر في العروض أو تشير إلى مشكلة. -
SUGGESTION: اقتراح للتحسين
-
-
impactedDestinations: البرامج (مثل "إعلانات Shopping" أو البيانات المجانية) والمناطق المتأثرة بالمشكلة، بالإضافة إلى مستوى الخطورة في هذه السياقات -
detail: رسالة تتضمّن المزيد من السياق حول المشكلة -
documentationUri: رابط يؤدي إلى مقالة "مركز المساعدة" حول كيفية حلّ المشكلة
اعتبارات خاصة
- التدويل (i18n): عند إدراج مشاكل الحساب، يمكنك تحديد
language_code(على سبيل المثال، "en-US" و"fr-FR") وtime_zone(مثل "America/Los_Angeles" و"Europe/Paris") في طلبك. يتحقّق هذا الاختبار من أنّ السلاسل التي يمكن لشخص عادي قراءتها في الاستجابة، مثل المشكلةdetail، قد تمت ترجمتها بشكل مناسب. في حال عدم توفير هذه الحقول، ستستخدم واجهة برمجة التطبيقات تلقائيًا اللغة الإنجليزية ("en-US") والمنطقة الزمنية "America/Los_Angeles" (توقيت المحيط الهادئ). - تقسيم البيانات على عدّة صفحات: تتيح واجهة برمجة التطبيقات تقسيم البيانات على عدّة صفحات من خلال المَعلمتَين
page_sizeوpage_tokenفيListAccountIssuesRequest. يتيح لك ذلك استرداد المشاكل في أجزاء يمكن إدارتها. الحد الأقصى لـpage_sizeهو 1000، والقيمة التلقائية هي 50. - الترتيب: يتم ترتيب المشاكل التي تعرضها واجهة برمجة التطبيقات بشكل عام حسب درجة الخطورة والأولوية الداخلية، على غرار طريقة عرضها في Merchant Center. يُرجى العِلم أنّ واجهة برمجة التطبيقات لا تتيح الترتيب المخصّص.
- مصدر البيانات: تستردّ واجهة برمجة التطبيقات الفرعية 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)
const 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 {
const 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 ListAccountIssuesPagedResponse 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();
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++;
}
return response;
}
}
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
def list_account_issues(account_id: str):
"""Lists all the account issues of an account."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = AccountIssueServiceClient(credentials=credentials)
parent = f"accounts/{account_id}"
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)
return response
except RuntimeError as e:
print("An error has occured: ")
print(e)
raise
if __name__ == "__main__":
_account_id = configuration.Configuration().read_merchant_info()
list_account_issues(_account_id)
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.api.gax.grpc.ChannelPoolSettings;
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()
.setChannelPoolSettings(ChannelPoolSettings.staticallySized(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
لإدراج المشاكل في الحسابات الفرعية لحساب بامتيازات متقدّمة، عليك
أولاً إدراج الحسابات الفرعية (مثلاً، باستخدام
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"
```