دریافت اعلان‌های فشار برای تغییرات داده‌های محصولتان

می‌توانید از Merchant Notifications API برای دریافت اعلان‌های فشار برای تغییرات داده‌های محصول استفاده کنید. برای مثال، اگر در اعلان‌های تغییر وضعیت محصول مشترک شوید، می‌توانید در زمان رد شدن یک محصول به شما اطلاع داده شود. می‌توانید مشترک اعلان‌های هر یک از حساب‌های فرعی یا سایر حساب‌های مرتبط شوید .

این راهنما نمونه هایی از نحوه مدیریت اعلان ها برای تغییرات وضعیت محصول را ارائه می دهد. می‌توانید با تغییر مقدار فیلد registeredEvent در درخواست‌های خود، از این مثال‌ها برای مدیریت اعلان‌های رویدادهای دیگر استفاده کنید. برای فهرست کامل انواع رویدادها، به مرجع API اطلاعیه‌های تجاری مراجعه کنید.

مشترک شوید

برای دریافت اعلان‌ها، به callBackUri نیاز دارید. URI پاسخ به تماس شما باید شرایط زیر را داشته باشد:

  • باید یک آدرس HTTPS در دسترس عموم با گواهینامه SSL معتبر، امضا شده توسط یک مرجع گواهی باشد.
  • باید درخواست‌های HTTP POST را با هدر Content-Type و مقدار application/json بپذیرد.
  • برای تأیید دریافت اعلان، باید یکی از کدهای پاسخ زیر را برگردانید.
    • 102
    • 200
    • 201
    • 202
    • 204

می‌توانید از همان URI برگشت به تماس برای چندین اشتراک استفاده کنید. برای به حداقل رساندن بار درخواست‌های فشار به یک URI واحد، برای به حداقل رساندن بار درخواست‌های ارسال به یک URI، توصیه می‌کنیم از یک URI برگشت به تماس منحصربه‌فرد برای هر حساب پیشرفته ، برای هر نوع رویداد استفاده کنید.

در اینجا یک نمونه درخواست برای اشتراک در اعلان‌های مربوط به تغییرات وضعیت محصول برای یک حساب تجاری خاص آمده است.

POST https://merchantapi.googleapis.com/notifications/v1/accounts/MERCHANT_ID/notificationsubscriptions/
{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/TARGETMERCHANT_ID",
  "callBackUri": "https://example.com"
}

موارد زیر را جایگزین کنید:

  • MERCHANT_ID : شناسه منحصربه‌فرد حسابی که باید اعلان‌ها را دریافت کند.
  • TARGETMERCHANT_ID : شناسه منحصر به فرد حسابی که می خواهید درباره آن اعلان دریافت کنید.

اگر حساب Merchant Center شما یک حساب مستقل و بدون حساب پیوندی است و می‌خواهید برای حساب خود اعلان‌هایی دریافت کنید، هر دو این متغیرها را با شناسه حساب خود جایگزین کنید.

تماس‌های موفق name برای اشتراک شما برمی‌گردانند، از جمله شناسه اشتراک:

{
  "name":"accounts/MERCHANT_ID/notificationsubscriptions/subscriptionId",
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/TARGETMERCHANT_ID",
  "callBackUri": "https://example.com"
}

می توانید از این name برای GET و DELETE اشتراک های فردی استفاده کنید.

می‌توانید با قرار دادن "allManagedAccounts": true به جای targetAccount در درخواست خود، در اعلان‌های تغییرات وضعیت محصول برای همه حساب‌های پیوندشده خود مشترک شوید:

POST https://merchantapi.googleapis.com/notifications/v1/accounts/MERCHANT_ID/notificationsubscriptions/

{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "allManagedAccounts": true,
  "callBackUri": "https://example.com"
}

برای به‌روزرسانی یک اشتراک موجود، PATCH با یک update_mask استفاده کنید تا فیلدهایی را که می‌خواهید به‌روزرسانی کنید و مقادیر جدید را در بدنه JSON مشخص کنید:

PATCH https://merchantapi.googleapis.com/notifications/v1/accounts/MERCHANT_ID/notificationsubscriptions/SUBSCRIPTION_ID?update_mask=callBackUri

{
  "​callBackUri": "https://my-own-personal-domain.com"
}

رمزگشایی اعلان ها

پس از ایجاد اشتراک، اعلان‌هایی را به callBackUri مشخص شده در قالب زیر دریافت می‌کنید:

{"message":{"data":"{base64_encoded_string}"}}

داده های اعلان کدگذاری شده است. می توانید داده ها را به یک قالب متنی قابل خواندن رمزگشایی کنید تا در پیاده سازی خود از آن استفاده کنید. در اینجا یک نمونه کنترلر بوت فنری وجود دارد که ممکن است برای پردازش داده های کدگذاری شده استفاده کنید:

@RestController
public class ExampleController {
@RequestMapping(value = "/push",
  method = RequestMethod.POST,
  consumes = {"application/json"},
  produces = {"text/plain"})
  @ResponseStatus(HttpStatus.OK)
  public void doStuff(@RequestBody String message) {
        //wrapped message
        JSONObject jsonObject = new JSONObject(message);
        JSONObject jsonMessage = jsonObject.getJSONObject("message");
        message = jsonMessage.getString("data");
        byte[] decodedBytes = Base64.getDecoder().decode(message);
        String decodedMessage = new String(decodedBytes);
        // Implement your business logic here
  }
}

در اینجا نمونه ای از یک base64_encoded_string است که رمزگشایی شده است:

{
  "account": "accounts/TARGETMERCHANT_ID",
  "managingAccount": "accounts/MERCHANT_ID",
  "resourceType": "PRODUCT",
  "attribute": "STATUS",
  "changes": [{
    "oldValue": "approved",
    "newValue": "disapproved",
    "regionCode": "US",
    "reportingContext": "SHOPPING_ADS"
  }, {
    "oldValue": "approved",
    "newValue": "disapproved",
    "regionCode": "JP",
    "reportingContext": "SHOPPING_ADS"
  },{
    "oldValue": "approved",
    "newValue": "disapproved",
    "regionCode": "GE",
    "reportingContext": "SHOPPING_ADS"
  }],
  "resourceId": "ONLINE~en~US~1234",
  "resource": "accounts/TARGETMERCHANT_ID/products/ONLINE~en~US~1234",
  "expirationTime": "2024-10-22T02:43:47.461464Z",
  "eventTime": "2024-03-21T02:43:47.461464Z"
}

اگر فیلد oldValue در اعلان وجود نداشته باشد، محصول جدیدی به حساب شما اضافه شده است. اگر فیلد newValue وجود نداشته باشد، محصول از حساب شما حذف شده است.

در صورتی که محصول حذف شده باشد، قسمت expirationTime وجود نخواهد داشت.

فیلد reportingContext فقط ( SHOPPING_ADS , LOCAL_INVENTORY_ADS , YOUTUBE_SHOPPING , YOUTUBE_CHECKOUT , YOUTUBE_AFFILIATE ) را از مقدار فهرست ReportingContextEnum پشتیبانی می کند.

برای رویداد تغییر وضعیت محصول، فیلدهای oldValue و newValue یکی از این مقادیر را خواهند داشت: ( approved ، pending ، disapproved ، ``).

فیلد eventTime زمان ایجاد خود رویداد را نگه می‌دارد، اگر می‌خواهید سفارش پیام را انجام دهید باید به مقدار آن فیلد تکیه کنید و به ترتیب دریافت پیام‌ها متکی نباشید.

برای جزئیات بیشتر، قالب ProductStatusChangeMessage را دنبال کنید.

اجرای خود را تست کنید

در اینجا یک نمونه اعلان وجود دارد که می توانید برای آزمایش URI و رمزگشایی پاسخ به تماس خود استفاده کنید:

curl --header "Content-Type: application/json" --header "Accept: text/plain" --request POST --data '{"message":{"data":
"ewogICJhY2NvdW50IjogImFjY291bnRzLzEyMzQiLAogICJtYW5hZ2luZ0FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIsCiAgInJlc291cmNlVHlwZSI6ICJQUk9EVUNUIiwKICAiYXR0cmlidXRlIjogIlNUQVRVUyIsCiAgImNoYW5nZXMiOiBbewogICAgIm9sZFZhbHVlIjogImFwcHJvdmVkIiwKICAgICJyZWdpb25Db2RlIjogIlVTIiwKICAgICJyZXBvcnRpbmdDb250ZXh0IjogIlNIT1BQSU5HX0FEUyIKICB9XSwKICAicmVzb3VyY2VJZCI6ICJPTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAicmVzb3VyY2UiOiAiYWNjb3VudHMvMTIzNC9wcm9kdWN0cy9PTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAiZXhwaXJhdGlvblRpbWUiOiAiMjAyNC0xMC0yMlQwMjo0Mzo0Ny40NjE0NjRaIiwKICAiZXZlbnRUaW1lIjogIjIwMjQtMDMtMjFUMDI6NDM6NDcuNDYxNDY0WiIKfQ=="}}' https://{callBackUri}

در پاسخ به این تماس، URI پاسخ به تماس شما باید یک کد پاسخ موفق را برگرداند. پیام رمزگشایی شده باید دارای مقدار زیر باشد:

{
  "account": "accounts/1234",
  "managingAccount": "accounts/5678",
  "resourceType": "PRODUCT",
  "attribute": "STATUS",
  "changes": [{
    "oldValue": "approved",
    "regionCode": "US",
    "reportingContext": "SHOPPING_ADS"
  }],
  "resourceId": "ONLINE~en~US~000000000000",
  "resource": "accounts/1234/products/ONLINE~en~US~000000000000",
  "expirationTime": "2024-10-22T02:43:47.461464Z",
  "eventTime": "2024-03-21T02:43:47.461464Z"
}