Vous pouvez utiliser l'API Merchant Notifications pour recevoir des notifications push lorsque des données produit sont modifiées. Par exemple, si vous vous abonnez aux notifications de changement d'état des produits, vous pouvez être averti en temps réel lorsqu'un produit est refusé. Vous pouvez vous abonner aux notifications pour n'importe lequel de vos sous-comptes ou d'autres comptes associés.
Ce guide fournit des exemples de gestion des notifications de changement d'état des produits. Vous pouvez utiliser ces exemples pour gérer les notifications d'autres événements en modifiant la valeur du champ registeredEvent dans vos requêtes. Pour obtenir la liste complète des types d'événements, consultez la documentation de référence de l'API Merchant Notifications.
S'abonner
Pour recevoir des notifications, vous avez besoin d'un callBackUri. Votre URI de rappel doit répondre aux exigences suivantes :
- Il doit s'agir d'une adresse HTTPS accessible au public avec un certificat SSL valide, signé par une autorité de certification.
- Il doit accepter les requêtes HTTP
POSTavec l'en-têteContent-Typeet la valeurapplication/json. - Il doit renvoyer l'un des codes de réponse suivants pour accuser réception de la notification.
102200201202204
Vous pouvez utiliser le même URI de rappel pour plusieurs abonnements. Nous vous recommandons d'utiliser un URI de rappel unique par compte avancé, par type d'événement afin de minimiser la charge des requêtes push sur un seul URI.
Voici un exemple de requête permettant de s'abonner aux notifications concernant les changements d'état des produits pour un compte marchand spécifique.
POST https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/TARGETACCOUNT_ID",
"callBackUri": "https://example.com"
}
Remplacez les éléments suivants :
- ACCOUNT_ID : identifiant unique du compte qui doit recevoir les notifications.
- TARGETACCOUNT_ID : identifiant unique du compte pour lequel vous souhaitez recevoir des notifications.
Si votre compte Merchant Center est un compte autonome sans compte associé et que vous souhaitez recevoir des notifications pour votre propre compte, remplacez ces deux variables par votre ID de compte.
Les appels réussis renvoient un
name
pour votre abonnement, y compris un ID d'abonnement :
{
"name":"accounts/ACCOUNT_ID/notificationsubscriptions/subscriptionId",
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/TARGETACCOUNT_ID",
"callBackUri": "https://example.com"
}
Vous pouvez utiliser ce name pour GET et DELETE des abonnements individuels.
Vous pouvez vous abonner aux notifications de changement d'état des produits pour tous vos
comptes associés en incluant "allManagedAccounts": true au lieu d'un
targetAccount dans votre requête :
POST https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"allManagedAccounts": true,
"callBackUri": "https://example.com"
}
Pour mettre à jour un abonnement existant, utilisez PATCH avec un update_mask pour spécifier les champs que vous souhaitez mettre à jour, ainsi que les nouvelles valeurs dans le corps JSON :
PATCH https://merchantapi.googleapis.com/notifications/v1/accounts/ACCOUNT_ID/notificationsubscriptions/SUBSCRIPTION_ID?update_mask=callBackUri
{
"callBackUri": "https://my-own-personal-domain.com"
}
Décoder les notifications
Une fois que vous avez créé un abonnement, vous recevez des notifications au format suivant pour le callBackUri spécifié :
{"message":{"data":"{base64_encoded_string}"}}
Les données de notification sont encodées. Vous pouvez décoder les données dans un format de texte lisible à utiliser dans votre implémentation. Voici un exemple de contrôleur Spring Boot que vous pouvez utiliser pour traiter les données encodées :
@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
}
}
Voici un exemple de base64_encoded_string qui a été décodé :
{
"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 le champ oldValue n'est pas présent dans la notification, cela signifie qu'un produit a été ajouté à votre compte. Si le champ newValue n'est pas présent, cela signifie que le produit a été supprimé de votre compte.
Le champ expirationTime n'existe pas si le produit a été supprimé.
Le champ reportingContext n'accepte que (SHOPPING_ADS, LOCAL_INVENTORY_ADS, YOUTUBE_SHOPPING, YOUTUBE_CHECKOUT, YOUTUBE_AFFILIATE, FREE_LISTINGS_UCP_CHECKOUT) à partir de la valeur d'énumération ReportingContextEnum.
Pour l'événement de changement d'état du produit, les champs oldValue et newValue auront l'une
des valeurs suivantes : (approved, pending, disapproved, ``).
Le champ eventTime contient l'heure de création de l'événement lui-même. Si vous souhaitez ordonner les messages, vous devez vous appuyer sur la valeur de ce champ et non sur l'ordre de réception des messages.
Pour en savoir plus, consultez le format ProductStatusChangeMessage pour.
Tester la mise en œuvre
Voici un exemple de notification que vous pouvez utiliser pour tester votre URI de rappel et le décodage :
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 réponse à cet appel, votre URI de rappel doit renvoyer un code de réponse positif. Le message décodé doit avoir la valeur suivante :
{
"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"
}