این راهنما فرایند انتقال از «میانای برنامهسازی کاربردی محتوا برای Shopping» به Merchant API را برای مدیریت دادههای کسبوکار توضیح میدهد.
میتوانید از این راهنما برای انتقال پیادهسازی Content API for Shopping موجود خود به Merchant API استفاده کنید. برای کسب اطلاعات بیشتر درباره جزئیات «میانای برنامهسازی کاربردی بازرگان» و میاناهای برنامهسازی کاربردی فرعی آن، طراحی «میانای برنامهسازی کاربردی بازرگان» را ببینید.
شروع کنید
برای شروع استفاده از Merchant API، نشانیهای وب درخواستتان را به قالب زیر تغییر دهید:
https://merchantapi.googleapis.com/{SUB_API}/{VERSION}/{RESOURCE_NAME}:{METHOD}…
برای استفاده از Merchant API، باید حساب Merchant Center و پروژه Google Cloud خود را بااستفاده از روش «ثبت توسعهدهنده» پیوند دهید، به این صورت:
POST https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/developerRegistration:registerGcp
{
developer_email:"example-email@example.com"
}
برای اطلاعات بیشتر، راهنمای شروع سریع و مرجع «میانای برنامهسازی کاربردی فروشنده» را ببینید.
بهبودها نسبت به Content API ویژه Shopping
Merchant API به شما امکان میدهد گردشهای کار را در Merchant Center خودکارسازی و سادهسازی کنید و قابلیتهای پیشرفتهای را در مقایسه با Content API ویژه Shopping ارائه میدهد.
موارد استفاده کلیدی:
- مدیریت خودکار حساب
- مدیریت خودکارسازیشده محصول
- مدیریت خودکار سیاهه
- گزارشدهی سفارشی
زمینههای بهبود کلیدی:
- میاناهای برنامهسازی کاربردی فرعی با ویژگیهای جدید، ازجمله:
- ردیابی سفارش از سابقه ردیابی سفارش کسبوکار پشتیبانی میکند تا برآوردهای دقیق و صحیحی از ارسال به مشتریان ارائه دهد. نشانهای آن همچنین فهرستگان بهبودیافته با ارسال رایگان و سریع را فعال میکند.
- حلوفصل کردن مشکلات دسترسی به محتوای تشخیص خرابی و کنشهای پشتیبانی را به همان روشی که در رابط کاربری Merchant Center دردسترس است فراهم میکند.
- منابع جدید در حسابها میانای برنامهسازی کاربردی فرعی.
OmnichannelSettingsپیکربندی حساب را برای ارائه خدمات چندکانالی، مانند «فهرستگانهای محلی رایگان» (FLL) و «آگهیهای فهرست موجودی محلی» (LIA)، مدیریت میکند.LfpProvidersبرای دادههای موجودی به شرکای «مشارکت فیدهای محلی» (LFP) متصل میشود.GbpAccountsبه حساب «نمایه کسبوکار Google» برای دادههای فروشگاه محلی متصل میشود.OnlineReturnPolicyامکان ایجاد، حذف، و بهروزرسانی خطمشیهای آنلاین شما را فراهم میکند.
- روشهای جدید برای موجودی، دادههای محصولات، و دیگر میاناهای برنامهسازی کاربردی، ازجمله:
- روش جدیدی در میانای برنامهسازی کاربردی فرعی Products.
-
ProductsUpdateبه شما امکان میدهد محصولات تکی را بدون نیاز به ارائه همه فیلدهای لازم برایProductInputبهروز کنید.
- امکان ایجاد نه تنها منابع داده اصلی، بلکه منابع داده متعدد مانند:
- بارگذاری مرورهای محصول و مرورهای فروشنده را معرفی میکند
- با Merchant API، میتوانید اعلانهای مربوط به تغییرات دادههای حساب را فعال کنید
چه چیزی تغییر کرده است
- حداکثر
pageSizeاز ۲۵۰ به ۱۰۰۰ ردیف در هر فراخوانی API افزایش یافت. - تأخیری که برای درج محصول، تبلیغات، مرورهای محصول، و مرورهای فروشنده پساز ایجاد
DataSourcesوجود داشت برطرف شد. - راهاندازی تعریف بهروزشده برای
clickPotentialRankدرproductViewجدول در میانای برنامهسازی کاربردی فرعی «گزارشدهی»:- رتبهبندی محصولات براساس
clickPotentialبه مقادیر بین ۱ تا ۱۰۰۰ نرمالسازی میشود.
- رتبهبندی محصولات براساس
AccountIdAliasدرAccountRelationshipمنبع امکان مدیریت بهتر ساختارهای پیچیده حساب را فراهم میکند. برای مثال، بازارها بهجای شناسه داخلی فروشنده، مثل شناسه حساب، از نام مستعار تعریفشده توسط کاربر استفاده میکنند.
پشتیبانی از gRPC
Merchant API از gRPC و REST پشتیبانی میکند. میتوانید بهطور همزمان از gRPC برای Merchant API و از REST برای Content API ویژه Shopping استفاده کنید.
کتابخانههای کارخواه «میانای برنامهسازی کاربردی بازرگان» به gRPC نیاز دارند.
برای اطلاعات بیشتر، به نمای کلی gRPC مراجعه کنید.
سازگاری
این راهنما تغییرات کلی را که بر کل «میانای برنامهسازی کاربردی بازرگان» اعمال میشود شرح میدهد.
Merchant API بهگونهای طراحی شده است که در کنار ویژگیهای موجود در Content API ویژه Shopping کار کند.
برای مثال، میتوانید از Merchant Inventories API در کنار پیادهسازی
Content API for Shopping v2.1
products موجودتان استفاده کنید. میتوانید از Content API for Shopping برای بارگذاری محصول محلی جدید (که در فروشگاه محلی میفروشید) استفاده کنید، سپس از منبع Merchant Inventories API LocalInventory برای مدیریت اطلاعات موجودی در فروشگاه برای آن محصول استفاده کنید.
بهبودهای ساختاری نسبت به Content API
«میانای برنامهسازی کاربردی بازرگان» در زمینههای زیر نسبت به «میانای برنامهسازی کاربردی محتوا» بهبود یافته است:
- میاناهای برنامهسازی کاربردی فرعی با ویژگیهای جدید برای ادغام منحصربهفرد شما
- روشهای جدید برای موجودی، دادههای محصولات، و دیگر میاناهای برنامهسازی کاربردی
- امکان ایجاد نه تنها منابع داده اصلی، بلکه منابع داده متعدد، مانند:
- بارگذاری مرورهای محصول و مرورهای فروشنده را معرفی میکند
- با Merchant API، میتوانید اعلانهای مربوط به تغییرات دادههای حساب را فعال کنید.
- قابلیت فیلتر کردن را برای منبع حسابها معرفی میکند
این تغییرات را با جزئیات بیشتری درنظر بگیرید.
نسخهبندی و میاناهای برنامهسازی کاربردی فرعی
«میانای برنامهسازی کاربردی فروشنده» مفاهیم نسخهبندی و میاناهای برنامهسازی کاربردی فرعی را معرفی میکند. طراحی واحدی آن با امکان تمرکز بر میاناهای برنامهسازی کاربردی فرعی موردنیاز و تسهیل انتقالهای آینده به نسخههای جدیدتر، استفاده از آن را آسانتر میکند. نسخهبندی با نشانیهای وب درخواست شما اعمال خواهد شد.این استراتژی شبیه به تجربه Google Ads API است.
درخواستهای قویتر
درخواستهای نشانی وب «میانای برنامهسازی کاربردی بازرگان» برای فراخوانی «میانای برنامهسازی کاربردی بازرگان» به پارامترهای بیشتری نیاز دارد. این شامل منبع، نسخه، نام (شناسهها)، و روش (روشهای غیر استاندارد) میشود. برای اطلاعات بیشتر درباره این موضوع، شناسههای حساب و محصول و نمونهها را ببینید.
اصول AIP برای شناسهها
درحالیکه Content API for Shopping از شناسهها برای شناسایی منابع استفاده میکند (برای مثال،
merchantId، productId)، Merchant API از
name
شناسه برای همراستا شدن با AIP استفاده میکند (به
اصول بهبود API مراجعه کنید).
شناسه {name} شامل شناسه منبع و والد آن (یا احتمالاً چندین والد) است، بهطوریکه {name} برابر با accounts/{account}/products/{product} است
همه فراخوانیهای خواندن و نوشتن فیلد name را بهعنوان شناسه منبع برمیگردانند.
{name} همچنین شامل شناسههای مجموعه accounts/ و products/ است.
«میانای برنامهسازی کاربردی بازرگان» از {account} برای اشاره به شناسه Merchant Center و از {product} برای اشاره به شناسههای محصول استفاده میکند.
برای مثال، روش getName() را برای بازیابی name از منبع پیادهسازی کنید و برونداد را بهجای اینکه خودتان name را از شناسههای فروشنده و منبع بسازید، بهعنوان متغیر ذخیره کنید.
در اینجا مثالی از نحوه استفاده از فیلد name در تماسهایتان آورده شده است:
POST https://merchantapi.googleapis.com/inventories/v1/{PARENT}/regionalInventories:insert
جدول نشان میدهد که درخواست Content API ویژه Shopping products.get چگونه تغییر میکند:
| Content API for Shopping | میانای برنامهسازی کاربردی فروشنده |
|---|---|
GET https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/products/{productId}
|
GET https://merchantapi.googleapis.com/products/v1/{name}
|
برای جزئیات بیشتر، تغییرات شناسه را مرور کنید.
بهعنوان مثال دیگر، بازیابی محصول با شناسه en~US~1234 از
شناسه Merchant Center 4321 بااستفاده از Merchant API بهصورت زیر خواهد بود:
GET
https://merchantapi.googleapis.com/products/v1/accounts/4321/products/en~US~1234
که در آن {name} برابر با accounts/4321/products/en~US~1234 است. این فیلد نام جدید
بهعنوان شناسه منبع برای همه تماسهای خواندن و نوشتن در Merchant
API برگردانده میشود.
در Content API ویژه Shopping، دونقطه (:) نشانگر جداکننده در نام محصول است
درحالیکه در Merchant API، تیلدا (~) این عملکرد را انجام میدهد. شناسه Merchant API
بخش channel را ندارد.
برای مثال، شناسه محصول در Content API ویژه Shopping:
channel:contentLanguage:feedLabel:offerId.
در «میانای برنامهسازی کاربردی بازرگان» به این تبدیل میشود:
contentLanguage~feedLabel~offerId.
فیلدهای والد برای منابع فرزند
در Merchant API، همه منابع فرزند فیلد
parent
را دارند. میتوانید از فیلد parent برای مشخص کردن {name} منبع برای درج فرزند در آن استفاده کنید، بهجای اینکه کل منبع والد را بگذرانید. همچنین میتوانید از فیلد parent با
list استفاده کنید
برای مثال، برای فهرست کردن موجودیهای محلی برای محصولی معین، name محصول را در فیلد
parent
برای روش
list
مشخص کنید. در این مورد، product ارائهشده parent منابع
LocalInventory
برگشتی است.
GET
https://merchantapi.googleapis.com/inventories/v1/{parent}/localInventories
برای بازیابی همه موجودیهای محلی برای محصول en~US~1234 و حساب 4321
درخواست بهاین شکل خواهد بود
GET
https://merchantapi.googleapis.com/inventories/v1/accounts/4321/products/en~US~1234/localInventories
«ولی» accounts/{account}/products/{product} است. توجه داشته باشید که در این مورد، منبع
localInventories
دو ولی دارد که در شناسه نام (accounts/ و
products/) گنجانده شدهاند، زیرا حساب ولی منبع محصول است.
تعداد مشترک
استفاده از شمارشهای مشترک باعث ایجاد سازگاری بیشتر میشود.
فیلد
Destination.DestinationEnum
سطوحی را که باید منابع شما در آنها نمایش داده شود مشخص میکند.
DestinationEnum همه مقادیر دردسترس را برای هدفیابی مقصد فهرست میکند و در همه میاناهای برنامهسازی کاربردی فرعی، برای نمونه برای تبلیغات
ویژگیها، یکپارچه است.
فیلد
ReportingContext.ReportingContextEnum
نشاندهنده زمینهای است که مشکلات حساب و محصول شما در آن اعمال میشود.
این فیلد در روشهای گزارشدهی مختلف استفاده میشود (برای مثال، برای
IssueSeverityPerReportingContext).
سازگاری با نسخه قدیمی
با شروع استفاده از Merchant API، یکپارچهسازی موجود شما در Content API for Shopping بدون وقفه به کار خود ادامه میدهد. برای اطلاعات بیشتر، سازگاری را ببینید.
پساز انتقال میاناهای برنامهسازی کاربردی فرعی به Merchant API، توصیه میکنیم فقط از Merchant API برای میاناهای برنامهسازی کاربردی فرعی منتقلشده استفاده کنید.
دردسترس بودن فراخوانی رویه از دور (gRPC)
gRPC روش توصیهشده جدید برای ادغام با «میانای برنامهسازی کاربردی بازرگان» است.
مزایای آن شامل موارد زیر است:
- زبانناشناس
- بر میانگیری پروتکل تکیه دارد
از HTTP/2 برای ارائه راهحلهای مقیاسپذیر با عملکرد بالا استفاده میکند (مرجع RPC)
اگر از کتابخانههای مشتری یا نمونههای کد ما استفاده میکنید، gRPC سازوکار انتقال پیشفرض است.
برای اطلاعات بیشتر درباره gRPC، به موارد زیر مراجعه کنید:
دستهای سفارشی به دستهای داخلی تبدیل میشود
وقتی از تماسهای ناهمزمان استفاده میکنید، دستهبندی کارآمدتر عمل میکند. درباره استفاده از تماسهای موازی برای دستیابی به دستهای کردن در Merchant API و نحوه بازسازی کد برای درخواستهای همزمان بیشتر بدانید.
برای کمک به تسریع انتقال، کتابخانههای کارخواه را توصیه میکنیم.
«میانای برنامهسازی کاربردی فروشنده» از روش
customBatch
ویژه در «میانای برنامهسازی کاربردی محتوا ویژه Shopping» پشتیبانی نمیکند. بهجای آن، ارسال چندین درخواست بهطور همزمان یا اجرای ناهمزمان تماسها را ببینید.
نمونه 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.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.products.v1.Availability;
import com.google.shopping.merchant.products.v1.Condition;
import com.google.shopping.merchant.products.v1.InsertProductInputRequest;
import com.google.shopping.merchant.products.v1.ProductAttributes;
import com.google.shopping.merchant.products.v1.ProductInput;
import com.google.shopping.merchant.products.v1.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1.Shipping;
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();
ProductAttributes attributes =
ProductAttributes.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(Availability.IN_STOCK)
.setCondition(Condition.NEW)
.setGoogleProductCategory("Media > Books")
.addGtins("9780007350896")
.addShipping(shipping)
.addShipping(shipping2)
.build();
return ProductInput.newBuilder()
.setContentLanguage("en")
.setFeedLabel("CH")
.setOfferId(generateRandomString())
.setProductAttributes(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 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.
ProductInputsServiceSettings productInputsServiceSettings =
ProductInputsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.setTransportChannelProvider(channelProvider)
.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);
}
}
اگر از
customBatch در
Content API استفاده میکنید و این ویژگی را برای Merchant API نیاز دارید، در
بازخورد خود به ما بگویید چرا.
ویژگیهای انحصاری
ویژگیهای آینده فقط در «میانای برنامهسازی کاربردی فروشنده» نشان داده خواهد شد. (چند استثنا وجود خواهد داشت، مانند مشخصات فید سالانه ۲۰۲۵.)
ویژگیهای انحصاری «میانای برنامهسازی کاربردی بازرگان» شامل موارد زیر میشود
- Reviews API. از «مرورها» برای پیادهسازی و مدیریت ردهبندیهای محصول و فروشگاهتان استفاده کنید. برای اطلاعات بیشتر، مرور فروشنده و مرور محصول را ببینید.
- اعلانها: برای دریافت اعلانهای لحظهای مربوط به تغییرات دادههای حساب و محصول ثبتنام کنید.
قیمت
این موارد برای Price در بسته «مشترک فروشنده» تغییر کرده است:
| Content API for Shopping | میانای برنامهسازی کاربردی فروشنده | |
|---|---|---|
| فیلد مبلغ | value:string |
amountMicros:int64 |
| فیلد ارز | currency:string
|
currencyCode:string |
مقدار Price اکنون به میکرو ثبت میشود، جایی که ۱ میلیون میکرو معادل واحد استاندارد ارز شما است.
در «میانای برنامهسازی کاربردی محتوا برای خرید»، Price عدد اعشاری در قالب یک
رشته بود.
نام فیلد مقدار از value به amountMicros تغییر کرده است
نام فیلد واحد پولی از currency به currencyCode تغییر کرده است. قالب همچنان ISO 4217 است.
جدیدترین بهروزرسانیها و اعلانها
برای بهروزرسانیهای دقیقتر، یادداشتهای انتشار مربوط به هر زیر API را ببینید. برای بهروزرسانیهای منظمتر و تجمیعی «میانای برنامهسازی کاربردی بازرگان»، جدیدترین بهروزرسانیهای ما را مرور کنید.
برای جزئیات دقیقتر و آشنایی بیشتر با Merchant API، نمای کلی سایت توسعهدهندگان و راهنمای کلی انتقال را برای جزئیات بیشتر مشاهده کنید.
برای جزئیات درباره «میانای برنامهسازی کاربردی بازرگان» و میاناهای برنامهسازی کاربردی فرعی آن، طراحی «میانای برنامهسازی کاربردی بازرگان» را ببینید.