Push-Benachrichtigungen bei Änderungen an Ihren Kontodaten erhalten

Mit der Merchant Notifications API können Sie Push-Benachrichtigungen zu Änderungen an Kontodaten erhalten. Wenn Sie beispielsweise Benachrichtigungen zu Änderungen des Produktstatus abonnieren, werden Sie in Echtzeit benachrichtigt, wenn ein Produkt abgelehnt wird. Sie können Benachrichtigungen für jedes Ihrer Unterkonten und andere verknüpfte Konten abonnieren.

In diesem Leitfaden finden Sie Beispiele dazu, wie Sie Benachrichtigungen zu Änderungen des Produktstatus verwalten. Sie können diese Beispiele verwenden, um Benachrichtigungen für andere Ereignisse zu verwalten. Ändern Sie dazu den Wert des Felds registeredEvent in Ihren Anfragen. Eine vollständige Liste der Ereignistypen finden Sie in der Referenz zur Merchant Notifications API.

Abonnieren

Um Benachrichtigungen zu erhalten, benötigen Sie eine callBackUri. Der Rückruf-URI muss die folgenden Anforderungen erfüllen:

  • Muss eine öffentlich zugängliche HTTPS-Adresse mit einem gültigen SSL-Zertifikat sein, das von einer Zertifizierungsstelle signiert wurde.
  • Muss HTTP-POST-Anfragen mit dem Content-Type-Header und dem Wert application/json akzeptieren.
  • Es muss einer der folgenden Antwortcodes zurückgegeben werden, um zu bestätigen, dass die Benachrichtigung eingegangen ist.
    • 102
    • 200
    • 201
    • 202
    • 204

Sie können dieselbe Callback-URI für mehrere Abos verwenden. Wir empfehlen, pro erweitertem Konto und pro Ereignistyp einen eindeutigen Rückruf-URI zu verwenden, um die Anzahl der Push-Anfragen an einen einzelnen URI zu minimieren.

Hier ist ein Beispiel für eine Anfrage, um Benachrichtigungen zu Produktstatusänderungen für ein bestimmtes Händlerkonto zu abonnieren. Verwenden Sie die Händler-ID des Kontos, das die Benachrichtigungen erhalten soll, als merchantId in der Anfrage-URL und die Händler-ID des Kontos, für das Benachrichtigungen empfangen werden sollen, als targetMerchantId im Anfragetext. Wenn es sich bei Ihrem Konto um ein eigenständiges Konto ohne verknüpfte Konten handelt und Sie Benachrichtigungen für Ihr eigenes Konto erhalten möchten, verwenden Sie an beiden Stellen Ihre eigene Händler-ID.

POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/
{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/targetMerchantId",
  "callBackUri": "https://example.com"
}

Bei erfolgreichen Aufrufen wird eine name für dein Abo zurückgegeben, einschließlich einer Abo-ID:

{
  "name":"accounts/merchantId/notificationsubscriptions/subscriptionId",
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/targetMerchantId",
  "callBackUri": "https://example.com"
}

Sie können diesen Code für name bis GET und DELETE einzelne Abos verwenden.

Sie können Benachrichtigungen zu Produktstatusänderungen für alle Ihre verknüpften Konten abonnieren, indem Sie "allManagedAccounts": true anstelle von targetAccount in Ihre Anfrage aufnehmen:

POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/

{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "allManagedAccounts": true,
  "callBackUri": "https://example.com"
}

Wenn du ein bestehendes Abo aktualisieren möchtest, verwende PATCH mit einem update_mask, um die Felder anzugeben, die du aktualisieren möchtest, und die neuen Werte im JSON-Text:

PATCH /notifications/v1beta/accounts/merchantId/notificationsubscriptions/subscriptionId?update_mask=callBackUri

{
  "​callBackUri": "https://my-own-personal-domain.com"
}

Benachrichtigungen decodieren

Nachdem du ein Abo erstellt hast, erhältst du Benachrichtigungen an die angegebene callBackUri im folgenden Format:

{"message":{"data":"{base64_encoded_string}"}}

Die Benachrichtigungsdaten sind codiert. Sie können die Daten in ein lesbares Textformat decodieren, um sie in Ihrer Implementierung zu verwenden. Hier ist ein Beispiel für einen Spring Boot-Controller, mit dem Sie die codierten Daten verarbeiten können:

@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
  }
}

Hier ein Beispiel für ein decodiertes base64_encoded_string:

{
  "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"
}

Wenn in der Benachrichtigung kein oldValue-Feld vorhanden ist, wurde Ihrem Konto ein neues Produkt hinzugefügt. Wenn das Feld newValue nicht vorhanden ist, wurde das Produkt aus Ihrem Konto gelöscht.

Das Feld reportingContext unterstützt nur die Werte (SHOPPING_ADS, LOCAL_INVENTORY_ADS, YOUTUBE_SHOPPING, YOUTUBE_CHECKOUT) aus dem Enum-Wert ReportingContextEnum.

Die Implementierung testen

Hier ist eine Beispielbenachrichtigung, mit der Sie Ihren Rückruf-URI und die Dekodierung testen können:

curl --header "Content-Type: application/json" --header "Accept: text/plain" --request POST --data '{"message":{"data":
"ewogICJhY2NvdW50IjogImFjY291bnRzLzEyMzQiLAogICJtYW5hZ2luZ0FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIsCiAgInJlc291cmNlVHlwZSI6ICJQUk9EVUNUIiwKICAiYXR0cmlidXRlIjogIlNUQVRVUyIsCiAgImNoYW5nZXMiOiBbewogICAgIm9sZFZhbHVlIjogImVsaWdpYmxlIiwKICAgICJyZWdpb25Db2RlIjogIlVTIiwKICAgICJyZXBvcnRpbmdDb250ZXh0IjogIlNIT1BQSU5HX0FEUyIKICB9XSwKICAicmVzb3VyY2VJZCI6ICJPTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAicmVzb3VyY2UiOiAiYWNjb3VudHMvMTIzNC9wcm9kdWN0cy9PTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAiZXhwaXJhdGlvblRpbWUiOiAiMjAyNC0xMC0yMlQwMjo0Mzo0Ny40NjE0NjRaIgp9"}}' https://{callBackUri}

Als Antwort auf diesen Aufruf sollte Ihr Callback-URI einen Code für eine erfolgreiche Antwort zurückgeben. Die decodierte Nachricht sollte den folgenden Wert haben:

{
  "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"
}