Otrzymuj powiadomienia push o zmianach w danych na koncie

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łówkiem Content-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"