Nhận thông báo đẩy về những thay đổi đối với dữ liệu tài khoản của bạn

Bạn có thể sử dụng Merchant Notifications API để nhận thông báo đẩy về các thay đổi đối với dữ liệu tài khoản. Ví dụ: nếu đăng ký nhận thông báo về thay đổi trạng thái sản phẩm, bạn có thể được thông báo theo thời gian thực khi một sản phẩm bị từ chối. Bạn có thể đăng ký nhận thông báo của mọi tài khoản phụ hoặc tài khoản được liên kết khác.

Hướng dẫn này cung cấp ví dụ về cách quản lý thông báo cho các thay đổi về trạng thái sản phẩm. Bạn có thể sử dụng các ví dụ này để quản lý thông báo cho các sự kiện khác bằng cách thay đổi giá trị của trường registeredEvent trong các yêu cầu của bạn. Để biết danh sách đầy đủ các loại sự kiện, hãy xem tài liệu tham khảo Merchant Notifications API.

Đăng ký

Để nhận thông báo, bạn cần có callBackUri. URI lệnh gọi lại phải đáp ứng các yêu cầu sau:

  • Phải là một địa chỉ HTTPS có thể truy cập công khai, có chứng chỉ SSL hợp lệ và do một tổ chức phát hành chứng chỉ ký.
  • Phải chấp nhận các yêu cầu HTTP POST có tiêu đề Content-Type và giá trị application/json.
  • Phải trả về một trong các mã phản hồi sau đây để xác nhận rằng đã nhận được thông báo.
    • 102
    • 200
    • 201
    • 202
    • 204

Bạn có thể sử dụng cùng một URI gọi lại cho nhiều gói thuê bao. Bạn nên sử dụng một URI gọi lại duy nhất cho mỗi tài khoản nâng cao và mỗi loại sự kiện để giảm thiểu tải các yêu cầu đẩy đến một URI.

Dưới đây là yêu cầu mẫu về việc đăng ký nhận thông báo về các thay đổi đối với trạng thái sản phẩm cho một tài khoản người bán cụ thể. Sử dụng mã người bán của tài khoản sẽ nhận được thông báo dưới dạng merchantId trong URL yêu cầu và mã người bán của tài khoản sẽ nhận được thông báo dưới dạng targetMerchantId trong nội dung yêu cầu. Nếu tài khoản của bạn là một tài khoản độc lập không có tài khoản được liên kết và bạn muốn nhận thông báo cho tài khoản của riêng mình, hãy sử dụng mã người bán của riêng bạn ở cả hai nơi.

POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/
{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/targetMerchantId",
  "callBackUri": "https://example.com"
}

Các lệnh gọi thành công sẽ trả về một name cho gói thuê bao của bạn, bao gồm cả một mã nhận dạng gói thuê bao:

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

Bạn có thể sử dụng name này để GETDELETE các gói thuê bao riêng lẻ.

Bạn có thể đăng ký nhận thông báo về các thay đổi về trạng thái sản phẩm cho tất cả tài khoản được liên kết bằng cách thêm "allManagedAccounts": true thay vì targetAccount vào yêu cầu của bạn:

POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/

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

Để cập nhật một gói thuê bao hiện có, hãy sử dụng PATCH với update_mask để chỉ định các trường bạn muốn cập nhật và các giá trị mới trong phần nội dung JSON:

PATCH /notifications/v1beta/accounts/merchantId/notificationsubscriptions/subscriptionId?update_mask=callBackUri

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

Giải mã thông báo

Sau khi tạo một gói thuê bao, bạn sẽ nhận được thông báo đến callBackUri đã chỉ định theo định dạng sau:

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

Dữ liệu thông báo được mã hoá. Bạn có thể giải mã dữ liệu sang định dạng văn bản dễ đọc để sử dụng trong quá trình triển khai. Dưới đây là trình điều khiển khởi động mùa xuân mẫu mà bạn có thể sử dụng để xử lý dữ liệu đã mã hoá:

@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
  }
}

Dưới đây là ví dụ về một base64_encoded_string đã được giải mã:

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

Nếu không có trường oldValue trong thông báo, thì một sản phẩm mới đã được thêm vào tài khoản của bạn. Nếu không có trường newValue, thì sản phẩm đó đã bị xoá khỏi tài khoản của bạn.

Trường reportingContext chỉ hỗ trợ (SHOPPING_ADS, LOCAL_INVENTORY_ADS, YOUTUBE_SHOPPING, YOUTUBE_CHECKOUT) từ giá trị enum ReportingContextEnum.

Kiểm tra kết quả triển khai

Dưới đây là thông báo mẫu mà bạn có thể sử dụng để kiểm thử URI lệnh gọi lại và giải mã:

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

Để phản hồi lệnh gọi này, URI gọi lại của bạn phải trả về mã phản hồi thành công. Thông báo đã giải mã sẽ có giá trị sau:

{
  "account": "accounts/1234",
  "managingAccount": "accounts/5678",
  "resourceType": "PRODUCT",
  "attribute": "STATUS",
  "changes": [{
    "oldValue": "eligible",
    "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"
}