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 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 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à địa chỉ HTTPS có thể truy cập công khai và có 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
POST
HTTP 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 lệnh gọi lại cho nhiều gói thuê bao. Bạn nên sử dụng một URI lệnh 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à một yêu cầu mẫu để đăng ký nhận thông báo về các thay đổi về 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à 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 sử dụng mã nhận dạng người bán của riêng bạn ở cả hai nơi.
POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/MERCHANT_ID/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/TARGETMERCHANT_ID",
"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ã gói thuê bao:
{
"name":"accounts/MERCHANT_ID/notificationsubscriptions/subscriptionId",
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/TARGETMERCHANT_ID",
"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/MERCHANT_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 phần nội dung JSON:
PATCH https://merchantapi.googleapis.com/notifications/v1beta/accounts/MERCHANT_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 có thể đọc đượ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/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"
}
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
, 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
, ``).
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":
"ewogICJhY2NvdW50IjogImFjY291bnRzLzEyMzQiLAogICJtYW5hZ2luZ0FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIsCiAgInJlc291cmNlVHlwZSI6ICJQUk9EVUNUIiwKICAiYXR0cmlidXRlIjogIlNUQVRVUyIsCiAgImNoYW5nZXMiOiBbewogICAgIm9sZFZhbHVlIjogImFwcHJvdmVkIiwKICAgICJyZWdpb25Db2RlIjogIlVTIiwKICAgICJyZXBvcnRpbmdDb250ZXh0IjogIlNIT1BQSU5HX0FEUyIKICB9XSwKICAicmVzb3VyY2VJZCI6ICJPTkxJTkV+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": "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"
}