Anda dapat menggunakan panduan ini untuk memigrasikan implementasi Content API for Shopping yang ada ke Merchant API. Untuk informasi selengkapnya tentang detail Merchant API dan sub-API-nya, lihat Desain Merchant API.
Mulai
Untuk mulai menggunakan Merchant API, ubah URL permintaan Anda ke format berikut:
https://merchantapi.googleapis.com/{SUB_API}/{VERSION}/{RESOURCE_NAME}:{METHOD}…
Untuk informasi selengkapnya, lihat panduan cepat dan referensi Merchant API.
Peningkatan dibandingkan Content API
Merchant API memungkinkan Anda mengotomatiskan dan menyederhanakan alur kerja di Merchant Center serta menawarkan kemampuan yang lebih baik daripada Content API.
Kasus penggunaan utama:
- Pengelolaan akun otomatis
- Pengelolaan produk otomatis
- Pengelolaan inventaris otomatis
- Pelaporan kustom
Area peningkatan utama:
- Sub-API dengan fitur baru untuk integrasi unik Anda
- Metode baru untuk inventaris, data produk, dan API lainnya
- Kemampuan untuk membuat tidak hanya sumber data utama, tetapi beberapa sumber data seperti:
- Memperkenalkan upload ulasan produk dan ulasan penjual
- Dengan Merchant API, Anda dapat mengaktifkan notifikasi untuk perubahan pada data akun
Dukungan gRPC
Merchant API mendukung gRPC dan REST. Anda dapat menggunakan gRPC untuk Merchant API dan REST untuk Content API for Shopping secara bersamaan.
Library klien Merchant API memerlukan gRPC.
Untuk informasi selengkapnya, lihat ringkasan gRPC.
Kompatibilitas
Panduan ini menjelaskan perubahan umum yang berlaku untuk seluruh Merchant API. Untuk perubahan pada fitur tertentu, di navigasi, temukan bagian Migrasi dari Content API, yang mencantumkan panduan individual.
Merchant API dirancang untuk berfungsi bersama fitur Content API for Shopping versi 2.1 yang ada.
Misalnya, Anda dapat menggunakan Merchant Inventories API bersama dengan implementasi
products
Content API for Shopping v2.1 yang ada. Anda
dapat menggunakan Content API for Shopping untuk mengupload produk lokal
baru (yang Anda jual
di toko lokal), lalu menggunakan referensi Merchant Inventories API
LocalInventory
untuk mengelola informasi di toko untuk produk tersebut.
Permintaan batch
Merchant API tidak mendukung metode
customBatch
yang ditampilkan di Content API for Shopping. Sebagai gantinya, lihat Mengirim beberapa
permintaan sekaligus atau jalankan panggilan
secara asinkron.
Contoh berikut menunjukkan cara menyisipkan input produk.
Java
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")
.addGtin("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 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);
}
}
Jika Anda menggunakan
customBatch
di
Content API, dan memerlukan fitur ini untuk Merchant API, beri tahu kami alasannya dalam
masukan Anda.
Pengenal
Agar selaras dengan prinsip peningkatan API Google, kami telah membuat beberapa perubahan pada ID untuk resource Merchant API.
nama menggantikan ID
Semua resource Merchant API menggunakan kolom
name
sebagai ID uniknya.
Berikut adalah contoh cara menggunakan kolom name
dalam panggilan Anda:
POST https://merchantapi.googleapis.com/inventories/v1beta/{PARENT}/regionalInventories:insert
Kolom name
baru ini ditampilkan sebagai ID resource untuk semua panggilan baca dan
tulis di Merchant API.
Misalnya, terapkan metode getName()
untuk mengambil name
dari
resource, dan simpan output sebagai variabel, bukan membuat name
dari ID bisnis dan resource sendiri.
Untuk permintaan HTTP, kolom name
diambil dari URL. Ini akan mengganti
name
yang diberikan dalam isi permintaan HTTP.
Pembatas
Merchant API menggunakan tilde, bukan titik dua, sebagai pembatas.
Tabel berikut membandingkan ID produk untuk Content API dan Merchant API:
Content API | Merchant API |
---|---|
channel:contentLanguage:feedLabel:offerId . Misalnya, online:en:US:sku123 |
channel~contentLanguage~feedLabel~offerId . Misalnya, online~en~US~sku123 |
kolom induk untuk resource turunan
Di Merchant API, semua resource turunan memiliki
kolom
parent
. Anda dapat menggunakan kolom parent
untuk menentukan name
resource tempat
memasukkan turunan, bukan meneruskan seluruh resource induk. Anda juga dapat
menggunakan kolom parent
dengan
metode list
untuk mencantumkan resource turunan dari parent
tersebut.
Misalnya, untuk mencantumkan inventaris lokal untuk produk tertentu, tentukan
name
produk di
kolom
parent
untuk
metode
list
. Dalam hal ini, product
yang diberikan adalah parent
dari resource
LocalInventory
yang ditampilkan.
Jenis
Berikut adalah beberapa jenis umum yang dibagikan di seluruh sub-API Merchant API.
Harga
Berikut yang berubah untuk Price
dalam paket Merchant Common:
Content API | Merchant API | |
---|---|---|
Kolom jumlah | value:string |
amountMicros:int64 |
Kolom mata uang | currency:string
|
currencyCode:string |
Jumlah Price
kini dicatat dalam mikro, dengan 1 juta mikro setara dengan unit standar mata uang Anda.
Di Content API for Shopping, Price
adalah angka desimal dalam bentuk
string.
Nama kolom jumlah telah diubah dari value
menjadi amountMicros
Nama kolom mata uang telah diubah dari currency
menjadi currencyCode
. Formatnya
tetap ISO 4217.