ปัญหาเกี่ยวกับบัญชีจะส่งผลต่อการแสดงผลิตภัณฑ์และความสามารถในการเข้าร่วม โปรแกรมต่างๆ ของ Merchant Center 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
ได้รับการแปลอย่างเหมาะสม หากไม่ได้ระบุช่องเหล่านี้ API จะใช้ภาษาอังกฤษ ("en-US") และเขตเวลา "America/Los_Angeles" (เวลาแปซิฟิก) เป็นค่าเริ่มต้น - การแบ่งหน้า: API รองรับการแบ่งหน้าผ่านพารามิเตอร์
page_size
และpage_token
ในListAccountIssuesRequest
ซึ่งจะช่วยให้คุณ ดึงข้อมูลปัญหาในส่วนที่จัดการได้page_size
สูงสุดคือ 1, 000 และ ค่าเริ่มต้นคือ 50 - การจัดลำดับ: โดยทั่วไป API จะแสดงปัญหาตามความรุนแรง และลำดับความสำคัญภายใน คล้ายกับวิธีที่แสดงใน Merchant Center โปรดทราบว่า API ไม่รองรับการจัดเรียงที่กำหนดเอง
- แหล่งข้อมูล: Sub-API ของบัญชีจะดึงข้อมูลจากแบ็กเอนด์เดียวกันกับที่หน้าการวินิจฉัยใน 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
ต่อไปนี้คือตัวอย่างการตอบกลับสำหรับบัญชีย่อยที่ถูกระงับเนื่องจากละเมิดนโยบาย "หน้า Landing Page ใช้งานไม่ได้"
{
"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);
}
}
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"
แสดงปัญหาระดับบัญชีสำหรับบัญชีย่อยทั้งหมดของบัญชีขั้นสูง
หากคุณจัดการบัญชีขั้นสูง คุณอาจต้องตรวจสอบปัญหาในบัญชีย่อยทั้งหมด ตัวอย่างนี้แสดงวิธีแสดงบัญชีย่อย แล้วดึงปัญหาของบัญชีแต่ละบัญชีย่อยแบบไม่พร้อมกัน วิธีนี้ มีประสิทธิภาพในการจัดการหลายบัญชี
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.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"
```