Вы можете использовать это руководство для интеграции Merchant API с существующей реализацией Content API for Shopping .
Merchant API позволяет автоматизировать рабочие процессы управления учетными записями, продуктами и запасами в Merchant Center. Варианты использования Merchant API включают в себя:
- Автоматизированное управление аккаунтом
- Автоматизированное управление продуктами
- Автоматизированное управление запасами
- Пользовательские отчеты
Улучшения по сравнению с Content API
Merchant API превосходит Content API в следующих областях:
- Суб-API с новыми функциями для вашей уникальной интеграции
- Новые методы для инвентаризации, данных о продуктах и других API.
- Возможность создавать не только первичные источники данных, но и несколько источников данных, таких как:
- Введена загрузка обзоров продуктов и отзывов продавцов.
- С помощью Merchant API вы можете включить уведомления об изменениях данных аккаунта.
Начать
Подробную информацию о Merchant API и его суб-API см. в дизайне Merchant API .
Чтобы начать использовать Merchant API, измените URL-адреса запросов на следующий формат:
https://merchantapi.googleapis.com/{SUB_API}/{VERSION}/{RESOURCE_NAME}:{METHOD}…
Дополнительную информацию см. в кратком руководстве и справочнике Merchant API.
поддержка gRPC
Merchant API поддерживает gRPC и REST. Вы можете использовать gRPC для Merchant API и REST для Content API for Shopping одновременно.
Клиентские библиотеки Merchant API требуют gRPC.
Дополнительные сведения см. в разделе использование gRPC .
Совместимость
В этом руководстве описаны общие изменения, применимые ко всему Merchant API. См. следующие руководства для внесения изменений в отдельные функции:
- Перенос управления учетными записями
- Перенос настроек доставки
- Перенос управления продуктами
- Миграция управления источниками данных
- Перенос управления запасами
- Перенести управление промоакциями
- Перенести управление отчетами
- Перенести управление источниками конверсий
- Перенести управление партнерством с местными фидами
Merchant API предназначен для работы вместе с существующими функциями Content API for Shopping v2.1.
Например, вы можете использовать API Merchant Inventories вместе с существующей реализацией products
Content API for Shopping v2.1. Вы можете использовать Content API для покупок, чтобы загрузить новый местный продукт (который вы продаете в местном магазине), а затем использовать ресурс LocalInventory
API Merchant Inventory API для управления информацией об этом продукте в магазине.
Пакетные запросы
Merchant API не поддерживает метод customBatch
, представленный в Content API для покупок. Вместо этого ознакомьтесь со статьей Отправка нескольких запросов одновременно или асинхронное выполнение вызовов.
В следующем примере показано, как вставить входные данные о продукте.
Ява
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.products.v1beta.Attributes;
import com.google.shopping.merchant.products.v1beta.InsertProductInputRequest;
import com.google.shopping.merchant.products.v1beta.ProductInput;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1beta.Shipping;
import com.google.shopping.type.Channel.ChannelEnum;
import com.google.shopping.type.Price;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to insert a product input */
public class InsertProductInputAsyncSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
private static String generateRandomString() {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuilder sb = new StringBuilder(8);
for (int i = 0; i < 8; i++) {
sb.append(characters.charAt(random.nextInt(characters.length())));
}
return sb.toString();
}
private static ProductInput createRandomProduct() {
Price price = Price.newBuilder().setAmountMicros(33_450_000).setCurrencyCode("USD").build();
Shipping shipping =
Shipping.newBuilder().setPrice(price).setCountry("GB").setService("1st class post").build();
Shipping shipping2 =
Shipping.newBuilder().setPrice(price).setCountry("FR").setService("1st class post").build();
Attributes attributes =
Attributes.newBuilder()
.setTitle("A Tale of Two Cities")
.setDescription("A classic novel about the French Revolution")
.setLink("https://exampleWebsite.com/tale-of-two-cities.html")
.setImageLink("https://exampleWebsite.com/tale-of-two-cities.jpg")
.setAvailability("in stock")
.setCondition("new")
.setGoogleProductCategory("Media > Books")
.setGtin(0, "9780007350896")
.addShipping(shipping)
.addShipping(shipping2)
.build();
return ProductInput.newBuilder()
.setChannel(ChannelEnum.ONLINE)
.setContentLanguage("en")
.setFeedLabel("CH")
.setOfferId(generateRandomString())
.setAttributes(attributes)
.build();
}
public static void asyncInsertProductInput(Config config, String dataSource) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
ProductInputsServiceSettings productInputsServiceSettings =
ProductInputsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify where to insert the product.
String parent = getParent(config.getAccountId().toString());
// Calls the API and catches and prints any network failures/errors.
try (ProductInputsServiceClient productInputsServiceClient =
ProductInputsServiceClient.create(productInputsServiceSettings)) {
// Creates five insert product input requests with random product IDs.
List<InsertProductInputRequest> requests = new ArrayList<>(5);
for (int i = 0; i < 5; i++) {
InsertProductInputRequest request =
InsertProductInputRequest.newBuilder()
.setParent(parent)
// You can only insert products into datasource types of Input "API" and "FILE", and
// of Type "Primary" or "Supplemental."
// This field takes the `name` field of the datasource.
.setDataSource(dataSource)
// If this product is already owned by another datasource, when re-inserting, the
// new datasource will take ownership of the product.
.setProductInput(createRandomProduct())
.build();
requests.add(request);
}
System.out.println("Sending insert product input requests");
List<ApiFuture<ProductInput>> futures =
requests.stream()
.map(
request ->
productInputsServiceClient.insertProductInputCallable().futureCall(request))
.collect(Collectors.toList());
// Creates callback to handle the responses when all are ready.
ApiFuture<List<ProductInput>> responses = ApiFutures.allAsList(futures);
ApiFutures.addCallback(
responses,
new ApiFutureCallback<List<ProductInput>>() {
@Override
public void onSuccess(List<ProductInput> results) {
System.out.println("Inserted products below");
System.out.println(results);
}
@Override
public void onFailure(Throwable throwable) {
System.out.println(throwable);
}
},
MoreExecutors.directExecutor());
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// Identifies the data source that will own the product input.
String dataSource = "accounts/" + config.getAccountId() + "/dataSources/{datasourceId}";
asyncInsertProductInput(config, dataSource);
}
}
Если вы используете customBatch
в Content API и вам нужна эта функция для Merchant API, сообщите нам, почему, в своем отзыве .
Идентификаторы
Чтобы соответствовать принципам улучшения API Google, мы внесли некоторые изменения в идентификаторы ресурсов Merchant API.
имя заменяет идентификатор
Все ресурсы Merchant API используют поле name
в качестве уникального идентификатора.
Вот пример того, как использовать поле name
в ваших звонках:
POST https://merchantapi.googleapis.com/inventories/v1beta/{PARENT}/regionalInventories:insert
Это новое поле name
возвращается в качестве идентификатора ресурса для всех вызовов чтения и записи в Merchant API.
Например, реализуйте метод getName()
для получения name
из ресурса и сохраните выходные данные в виде переменной вместо того, чтобы самостоятельно создавать name
из идентификаторов продавца и ресурса.
родительские поля для дочерних ресурсов
В Merchant API все дочерние ресурсы имеют parent
поле. Вы можете использовать parent
поле, чтобы указать name
ресурса, в который нужно вставить дочерний элемент, вместо передачи всего родительского ресурса. Вы также можете использовать parent
поле с методами list
для вывода списка дочерних ресурсов этого parent
.
Например, чтобы составить список местных запасов для данного продукта, укажите name
продукта в parent
поле метода list
. В этом случае данный product
является parent
для возвращаемых ресурсов LocalInventory
.
Типы
Ниже приведены некоторые общие типы, используемые в субAPI Merchant API.
Цена
Вот что изменилось в Price
в пакете Merchant Common:
API контента | Торговый API | |
---|---|---|
Поле суммы | value:string | amountMicros:int64 |
Поле валюты | currency:string | currencyCode:string |
Сумма Price
теперь записывается в микро, где 1 миллион микро эквивалентен стандартной единице вашей валюты.
В Content API for Shopping Price
представляла собой десятичное число в виде строки.
Имя поля суммы изменилось со value
на amountMicros
Имя поля валюты изменилось с currency
на currencyCode
. Формат остается ISO 4217 .