Bạn có thể sử dụng Merchant Notifications API để nhận thông báo đẩy về những thay đổi đối với dữ liệu sản phẩm. 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 cho bất kỳ tài khoản phụ nào của bạn hoặc các tài khoản được liên kết khác.
Hướng dẫn này cung cấp các ví dụ về cách quản lý thông báo về những thay đổi đối với 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 yêu cầu. Để xem danh sách đầy đủ
các loại sự kiện, hãy tham khảo 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 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 với chứng chỉ SSL hợp lệ, 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
POSTHTTP có tiêu đềContent-Typevà giá trịapplication/json. - Phải trả về một trong các mã phản hồi sau để xác nhận rằng thông báo đã được nhận.
102200201202204
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 riêng biệt cho mỗi tài khoản nâng cao, cho mỗi loại sự kiện để giảm thiểu tải của các yêu cầu đẩy đến một URI duy nhất.
Dưới đây là yêu cầu mẫu để đăng ký nhận thông báo về những 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ể.
POST https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/TARGETACCOUNT_ID",
"callBackUri": "https://example.com"
}
Thay thế nội dung sau:
- ACCOUNT_ID: Mã nhận dạng duy nhất của tài khoản sẽ nhận thông báo.
- TARGETACCOUNT_ID: Mã nhận dạng duy nhất của tài khoản mà bạn muốn nhận thông báo.
Nếu tài khoản Merchant Center 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 mình, hãy thay thế cả hai biến này bằng mã tài khoản của bạn.
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ã gói thuê bao:
{
"name":"accounts/ACCOUNT_ID/notificationsubscriptions/subscriptionId",
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/TARGETACCOUNT_ID",
"callBackUri": "https://example.com"
}
Bạn có thể sử dụng name này để GET và DELETE từng gói thuê bao.
Bạn có thể đăng ký nhận thông báo về những thay đổi đối với trạng thái sản phẩm cho tất cả các tài khoản được liên kết bằng cách đưa "allManagedAccounts": true thay vì targetAccount vào yêu cầu:
POST https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/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 nội dung JSON:
PATCH https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/SUBSCRIPTION_ID?update_mask=callBackUri
{
"callBackUri": "https://my-own-personal-domain.com"
}
Giải mã thông báo
Sau khi tạo 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 thành định dạng văn bản có thể đọc được để sử dụng trong quá trình triển khai. Dưới đây là bộ đ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 được 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/TARGETACCOUNT_ID",
"managingAccount": "accounts/ACCOUNT_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/TARGETACCOUNT_ID/products/ONLINE~en~US~1234",
"expirationTime": "2024-10-22T02:43:47.461464Z",
"eventTime": "2024-03-21T02: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 expirationTime sẽ không tồn tại trong trường hợp sản phẩm đã bị xoá.
Trường reportingContext chỉ hỗ trợ (SHOPPING_ADS, LOCAL_INVENTORY_ADS, YOUTUBE_SHOPPING, YOUTUBE_CHECKOUT, YOUTUBE_AFFILIATE, FREE_LISTINGS_UCP_CHECKOUT) từ giá trị enum ReportingContextEnum.
Đối với sự kiện thay đổi trạng thái sản phẩm, các trường oldValue và newValue sẽ có một
trong các giá trị sau : (approved, pending, disapproved, ``).
Trường eventTime lưu giữ thời gian tạo của chính sự kiện đó. Nếu muốn sắp xếp thứ tự thông báo, bạn nên dựa vào giá trị trong trường đó và không dựa vào thứ tự nhận thông báo.
Hãy làm theo định dạng ProductStatusChangeMessage để biết thêm thông tin chi tiết.
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 tra URI gọi lại và quá trình giải mã:
curl --header "Content-Type: application/json" --header "Accept: text/plain" --request POST --data '{"message":{"data":
"ewogICJhY2NvdW50IjogImFjY291bnRzLzEyMzQiLAogICJtYW5hZ2luZ0FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIsCiAgInJlc291cmNlVHlwZSI6ICJQUk9EVUNUIiwKICAiYXR0cmlidXRlIjogIlNUQVRVUyIsCiAgImNoYW5nZXMiOiBbewogICAgIm9sZFZhbHVlIjogImFwcHJvdmVkIiwKICAgICJyZWdpb25Db2RlIjogIlVTIiwKICAgICJyZXBvcnRpbmdDb250ZXh0IjogIlNIT1BQSU5HX0FEUyIKICB9XSwKICAicmVzb3VyY2VJZCI6ICJPTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAicmVzb3VyY2UiOiAiYWNjb3VudHMvMTIzNC9wcm9kdWN0cy9PTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAiZXhwaXJhdGlvblRpbWUiOiAiMjAyNC0xMC0yMlQwMjo0Mzo0Ny40NjE0NjRaIiwKICAiZXZlbnRUaW1lIjogIjIwMjQtMDMtMjFUMDI6NDM6NDcuNDYxNDY0WiIKfQ=="}}' https://{callBackUri}
Để phản hồi lệnh gọi này, URI gọi lại phải trả về mã phản hồi thành công. Thông báo đã giải mã phải có giá trị sau:
{
"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"
}