Push-Benachrichtigungen zu Änderungen an Ihren Produktdaten erhalten

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

In diesem Leitfaden finden Sie Beispiele für die Verwaltung von Benachrichtigungen zu Änderungen des Produktstatus. 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 Merchant Notifications API-Referenz.

Abonnieren

Um Benachrichtigungen zu erhalten, benötigen Sie ein callBackUri. Ihr Callback-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 application/json-Wert akzeptieren.
  • Sie müssen einen der folgenden Antwortcodes zurückgeben, um zu bestätigen, dass die Benachrichtigung empfangen wurde.
    • 102
    • 200
    • 201
    • 202
    • 204

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

Hier ist ein Beispiel für eine Anfrage zum Abonnieren von Benachrichtigungen zu Änderungen des Produktstatus für ein bestimmtes Händlerkonto.

POST https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/
{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/TARGETACCOUNT_ID",
  "callBackUri": "https://example.com"
}

Ersetzen Sie Folgendes:

  • ACCOUNT_ID: Die eindeutige Kennung des Kontos, das die Benachrichtigungen erhalten soll.
  • TARGETACCOUNT_ID: Die eindeutige Kennung des Kontos, zu dem Sie Benachrichtigungen erhalten möchten.

Wenn Ihr Merchant Center-Konto ein eigenständiges Konto ohne verknüpfte Konten ist und Sie Benachrichtigungen für Ihr eigenes Konto erhalten möchten, ersetzen Sie beide Variablen durch Ihre Konto-ID.

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

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

Sie können name verwenden, um einzelne Abos zu GET und DELETE.

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

POST https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/

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

Wenn Sie ein vorhandenes Abo aktualisieren möchten, verwenden Sie PATCH mit einem update_mask, um die Felder anzugeben, die Sie aktualisieren möchten, und die neuen Werte im JSON-Text:

PATCH https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/SUBSCRIPTION_ID?update_mask=callBackUri

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

Benachrichtigungen entschlüsseln

Nachdem Sie ein Abo erstellt haben, erhalten Sie 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, den Sie zum Verarbeiten der codierten Daten verwenden 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/TARGETACCOUNT_ID",
  "managingAccount": "accounts/ACCOUNT_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/TARGETACCOUNT_ID/products/ONLINE~en~US~1234",
  "expirationTime": "2024-10-22T02:43:47.461464Z",
  "eventTime": "2024-03-21T02:43:47.461464Z"
}

Wenn in der Benachrichtigung kein Feld oldValue 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 expirationTime ist nicht vorhanden, wenn das Produkt gelöscht wurde.

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

Bei Ereignissen zur Änderung des Produktstatus haben die Felder oldValue und newValue einen der folgenden Werte : (approved, pending, disapproved, ``).

Das Feld eventTime enthält die Erstellungszeit des Ereignisses selbst. Wenn Sie Nachrichten sortieren möchten, sollten Sie sich auf den Wert in diesem Feld verlassen und nicht auf die Reihenfolge, in der die Nachrichten empfangen werden.

Weitere Informationen finden Sie im Format ProductStatusChangeMessage.

Die Implementierung testen

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

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

Als Reaktion auf diesen Aufruf sollte Ihr Callback-URI einen Erfolgscode zurückgeben. Die decodierte Nachricht sollte den folgenden Wert haben:

{
  "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",
  "eventTime": "2024-03-21T02:43:47.461464Z"
}