Cómo recibir notificaciones push sobre los cambios en tus datos de productos

Puedes usar la API de Merchant Notifications para recibir notificaciones push sobre los cambios en los datos de productos. Por ejemplo, si te suscribes a las notificaciones de cambio de estado del producto, puedes recibir notificaciones en tiempo real cuando se rechaza un producto. Puedes suscribirte a las notificaciones de cualquiera de tus cuentas secundarias o de otras cuentas vinculadas.

En esta guía, se proporcionan ejemplos de cómo administrar las notificaciones de cambios en el estado de los productos. Puedes usar estos ejemplos para administrar las notificaciones de otros eventos. Para ello, cambia el valor del campo registeredEvent en tus solicitudes. Para obtener una lista completa de los tipos de eventos, consulta la referencia de la API de Merchant Notifications.

Suscribirse

Para recibir notificaciones, necesitas un callBackUri. Tu URI de devolución de llamada debe cumplir con los siguientes requisitos:

  • Debe ser una dirección HTTPS de acceso público con un certificado SSL válido, firmado por una autoridad certificada.
  • Debe aceptar solicitudes HTTP POST con el encabezado Content-Type y el valor application/json.
  • Debe devolver uno de los siguientes códigos de respuesta para confirmar que se recibió la notificación.
    • 102
    • 200
    • 201
    • 202
    • 204

Puedes usar el mismo URI de devolución de llamada para varias suscripciones. Te recomendamos que uses un URI de devolución de llamada único por cuenta avanzada y por tipo de evento para minimizar la carga de solicitudes push en un solo URI.

A continuación, se incluye un ejemplo de una solicitud para suscribirse a las notificaciones sobre los cambios en el estado de los productos de una cuenta de comercio específica.

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

Reemplaza lo siguiente:

  • ACCOUNT_ID: Es el identificador único de la cuenta que debe recibir las notificaciones.
  • TARGETACCOUNT_ID: Es el identificador único de la cuenta sobre la que deseas recibir notificaciones.

Si tu cuenta de Merchant Center es independiente y no tiene cuentas vinculadas, y deseas recibir notificaciones para tu propia cuenta, reemplaza ambas variables por tu ID de cuenta.

Las llamadas exitosas devuelven un objeto name para tu suscripción, incluido un ID de suscripción:

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

Puedes usar este name para GET y DELETE suscripciones individuales.

Puedes suscribirte a las notificaciones sobre los cambios de estado de los productos de todas tus cuentas vinculadas si incluyes "allManagedAccounts": trueen lugar de targetAccount en tu solicitud:

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

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

Para actualizar una suscripción existente, usa PATCH con un update_mask para especificar los campos que deseas actualizar y los valores nuevos en el cuerpo JSON:

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

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

Cómo decodificar notificaciones

Después de crear una suscripción, recibirás notificaciones en el callBackUri especificado con el siguiente formato:

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

Los datos de la notificación están codificados. Puedes decodificar los datos en un formato de texto legible para usarlos en tu implementación. A continuación, se muestra un ejemplo de un controlador de Spring Boot que podrías usar para procesar los datos codificados:

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

Este es un ejemplo de un base64_encoded_string que se decodificó:

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

Si no hay un campo oldValue en la notificación, se agregó un producto nuevo a tu cuenta. Si no hay un campo newValue, significa que el producto se borró de tu cuenta.

El campo expirationTime no existirá en caso de que se haya borrado el producto.

El campo reportingContext solo admite (SHOPPING_ADS, LOCAL_INVENTORY_ADS, YOUTUBE_SHOPPING, YOUTUBE_CHECKOUT, YOUTUBE_AFFILIATE) del valor de enumeración ReportingContextEnum.

En el caso del evento de cambio de estado del producto, los campos oldValue y newValue tendrán uno de estos valores : (approved, pending, disapproved, ``).

El campo eventTime contiene la hora de creación del evento en sí. Si deseas ordenar los mensajes, debes basarte en el valor de ese campo y no en el orden en que recibes los mensajes.

Sigue el formato de ProductStatusChangeMessage para obtener más detalles.

Cómo probar tu implementación

A continuación, se incluye una notificación de muestra que puedes usar para probar tu URI de devolución de llamada y la decodificación:

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

En respuesta a esta llamada, el URI de devolución de llamada debe mostrar un código de respuesta exitosa. El mensaje decodificado debe tener el siguiente valor:

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