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 để GET
và DELETE
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"
}