Jeśli chcesz otrzymywać powiadomienia push o zmianach w danych konta, możesz użyć interfejsu Merchant Notification API. Jeśli na przykład zasubskrybujesz powiadomienia o zmianie stanu produktu, możesz otrzymywać powiadomienia w czasie rzeczywistym, gdy produkt zostanie odrzucony. Możesz zasubskrybować powiadomienia dotyczące dowolnych subkont lub innych połączonych kont.
W tym przewodniku znajdziesz przykłady zarządzania powiadomieniami o zmianach stanu produktów. Możesz wykorzystać te przykłady, by zarządzać powiadomieniami o innych wydarzeniach, zmieniając wartość pola registeredEvent
w żądaniach. Pełną listę typów zdarzeń znajdziesz w dokumentacji interfejsu Merchant Notification API.
Zasubskrybuj
Aby otrzymywać powiadomienia, potrzebujesz callBackUri
. Identyfikator URI wywołania zwrotnego musi spełniać następujące wymagania:
- Musi to być publicznie dostępny adres HTTPS z ważnym certyfikatem SSL podpisanym przez urząd certyfikacji.
- Musi akceptować żądania HTTP
POST
z nagłówkiemContent-Type
i wartościąapplication/json
. - Aby potwierdzić otrzymanie powiadomienia, musi zwracać jeden z poniższych kodów odpowiedzi.
102
200
201
202
204
Możesz użyć tego samego identyfikatora URI wywołania zwrotnego dla wielu subskrypcji. Aby zminimalizować obciążenie żądań push do jednego identyfikatora URI, zalecamy używanie unikalnego identyfikatora URI wywołania zwrotnego dla każdego konta zaawansowanego w zależności od typu zdarzenia.
Oto przykładowa prośba o subskrypcję powiadomień o zmianach stanu produktów na określonym koncie sprzedawcy. Użyj identyfikatora sprzedawcy z konta, które powinno otrzymywać powiadomienia, jako elementu merchantId
w adresie URL żądania, a identyfikatora sprzedawcy powiązanego z kontem, na które chcesz otrzymywać powiadomienia, jako identyfikatora targetMerchantId
w treści żądania. Jeśli masz samodzielne konto bez połączonych kont, ale chcesz otrzymywać powiadomienia dotyczące własnego konta, w obu miejscach użyj swojego identyfikatora sprzedawcy.
POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/targetMerchantId",
"callBackUri": "https://example.com"
}
Udane wywołania zwracają name
powiązany z subskrypcją, w tym identyfikator subskrypcji:
{
"name":"accounts/merchantId/notificationsubscriptions/subscriptionId",
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/targetMerchantId",
"callBackUri": "https://example.com"
}
Możesz użyć tego instrumentu płatności (name
) do GET
oraz DELETE
indywidualnych subskrypcji.
Możesz subskrybować powiadomienia o zmianach stanu usług w przypadku wszystkich połączonych kont. W tym celu podaj w prośbie adres "allManagedAccounts": true
zamiast targetAccount
:
POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"allManagedAccounts": true,
"callBackUri": "https://example.com"
}
Aby zaktualizować dotychczasową subskrypcję, użyj polecenia PATCH
w połączeniu z dyrektywą update_mask
, aby określić pola, które chcesz zaktualizować, oraz nowe wartości w treści JSON:
PATCH /notifications/v1beta/accounts/merchantId/notificationsubscriptions/subscriptionId?update_mask=callBackUri
{
"callBackUri": "https://my-own-personal-domain.com"
}
Dekoduj powiadomienia
Po utworzeniu subskrypcji będziesz otrzymywać powiadomienia na adres callBackUri
w tym formacie:
{"message":{"data":"{base64_encoded_string}"}}
Dane dotyczące powiadomień są zakodowane. Możesz zdekodować dane do czytelnego formatu tekstowego, którego użyjesz w swojej implementacji. Oto przykładowy kontroler uruchamiania sprężyn, którego możesz użyć do przetwarzania zakodowanych danych:
@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
}
}
Oto przykład obiektu base64_encoded_string
, który został zdekodowany:
"account": "accounts/targetMerchantId"
"managing_account": "accounts/merchantId"
"resource_type": PRODUCT
"attribute": STATUS
"changes": {
"old_value": "eligible"
"new_value": "disapproved"
"region_code": "GE"
"reporting_context": SHOPPING_ADS
},
"changes" {
"old_value": "eligible"
"new_value": "disapproved"
"region_code": "JP"
"reporting_context": SHOPPING_ADS
},
changes {
"old_value": "eligible"
"new_value": "disapproved"
"region_code": "US"
"reporting_context": SHOPPING_ADS
}
resource_id: "ONLINE~en~US~1234"
resource: "accounts/targetMerchantId/products/ONLINE~en~US~1234"
Testowanie implementacji
Oto przykładowe powiadomienie, którego możesz użyć do przetestowania identyfikatora URI wywołania zwrotnego i dekodowania tych elementów:
curl --header "Content-Type: application/json" --header "Accept: text/plain" --request POST --data '{"message":{"data":
"ImFjY291bnQiOiAiYWNjb3VudHMvMTIzNCIKIm1hbmFnaW5nX2FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIKInJlc291cmNlX3R5cGUiOiBQUk9EVUNUCiJhdHRyaWJ1dGUiOiBTVEFUVVMKImNoYW5nZXMiOiB7CiAgIm9sZF92YWx1ZSI6ICJlbGlnaWJsZSIKICAicmVnaW9uX2NvZGUiOiAiVVMiCiAgInJlcG9ydGluZ19jb250ZXh0IjogU0hPUFBJTkdfQURTCn0KInJlc291cmNlX2lkIjogIk9OTElORX5lbn5VU34wMDAwMDAwMDAwMDAiCiJyZXNvdXJjZSI6ICJhY2NvdW50cy8xMjM0L3Byb2R1Y3RzL09OTElORX5lbn5VU34wMDAwMDAwMDAwMDAi"}}' https://{callBackUri}
W odpowiedzi na to wywołanie identyfikator URI wywołania zwrotnego powinien zwracać kod odpowiedzi zakończonej powodzeniem. Zdekodowana wiadomość powinna mieć taką wartość:
"account": "accounts/1234"
"managing_account": "accounts/5678"
"resource_type": PRODUCT
"attribute": STATUS
"changes": {
"old_value": "eligible"
"region_code": "US"
"reporting_context": SHOPPING_ADS
}
"resource_id": "ONLINE~en~US~000000000000"
"resource": "accounts/1234/products/ONLINE~en~US~000000000000"