Puedes usar la API de Merchant Notifications para obtener notificaciones push sobre los cambios en los datos de los productos. Por ejemplo, si te suscribes a las notificaciones de cambio de estado de los productos, puedes recibir una notificación en tiempo real cuando se rechaza un producto. Puedes suscribirte a las notificaciones de cualquiera de tus subcuentas o de otras cuentas vinculadas.
En esta guía, se proporcionan ejemplos de cómo administrar las notificaciones de cambios de 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
POSTHTTP con el encabezadoContent-Typey el valorapplication/json. - Debe mostrar uno de los siguientes códigos de respuesta para confirmar que se recibió la notificación.
102200201202204
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 a un solo URI.
A continuación, se incluye una solicitud de muestra para suscribirse a las notificaciones sobre los cambios de estado de los productos de una cuenta de comerciante 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 con tu ID de cuenta.
Las llamadas correctas muestran un
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.
Para suscribirte a las notificaciones de cambios de estado de los productos de todas tus
cuentas vinculadas, incluye "allManagedAccounts": trueen lugar de un
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 una update_mask para especificar los campos que deseas actualizar y los valores nuevos en el cuerpo HTTP:
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 a un formato de texto legible para usarlos en tu implementación. A continuación, se incluye un ejemplo de un controlador de Spring Boot que puedes 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 una 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, se borró el producto 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, FREE_LISTINGS_UCP_CHECKOUT) del valor de enumeración ReportingContextEnum.
Para el 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 los recibes.
Sigue el formato 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, tu URI de devolución de llamada debe mostrar un código de respuesta correcto. 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"
}