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ể nhận đượ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 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 những 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. Để xem danh sách đầy đủ các loại sự kiện, hãy xem tài liệu tham khảo về Merchant Notifications API.
Đăng ký
Để nhận thông báo, bạn cần có callBackUri
. URI gọi lại của bạn 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à được 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 bạn đã 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 lượt đăng ký. 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, 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ề các thay đổi đối với trạng thái sản phẩm của 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: Giá trị nhận dạng duy nhất của tài khoản sẽ nhận được thông báo.
- TARGETACCOUNT_ID: Giá trị 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 riêng 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ề name
cho gói thuê bao của bạn, bao gồm cả mã nhận dạng 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ể 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ề các thay đổi đối với 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:
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 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 thành định dạng văn bản dễ đọc để sử dụng trong quá trình triển khai. Sau đây là một bộ điều khiển khởi động mùa xuân mẫu mà bạn có thể 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
}
}
Sau đâ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
, 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
) 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 tin nhắn, bạn nên dựa vào giá trị trong trường đó và không dựa vào thứ tự nhận tin nhắn.
Hãy tuân 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à một thông báo mẫu mà bạn có thể dùng để kiểm thử 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 lệnh gọi lại của bạn phải trả về một 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"
}