Você pode usar a API Merchant Notifications para receber notificações push sobre mudanças nos dados da conta. Por exemplo, se você se inscrever nas notificações de mudança de status do produto, vai receber um aviso em tempo real quando um produto for reprovado. Você pode se inscrever para receber notificações em qualquer uma das suas subcontas ou em outras contas vinculadas.
Este guia oferece exemplos de como gerenciar notificações de mudanças de status
do produto. Você pode usar esses exemplos para gerenciar notificações de outros eventos
mudando o valor do campo registeredEvent
nas suas solicitações. Para uma lista completa dos tipos de eventos, consulte a referência da API Merchant Notifications.
Inscrever-se
Para receber notificações, você precisa de um callBackUri
. O URI de callback precisa
atender aos seguintes requisitos:
- Precisa ser um endereço HTTPS de acesso público com um certificado SSL válido, assinado por uma autoridade de certificação.
- É necessário aceitar solicitações HTTP
POST
com o cabeçalhoContent-Type
e o valorapplication/json
. - Precisa retornar um dos códigos de resposta a seguir para confirmar que a notificação foi recebida.
102
200
201
202
204
É possível usar o mesmo URI de callback para várias assinaturas. Recomendamos o uso de um URI de callback exclusivo por conta avançada e por tipo de evento para minimizar o carregamento de solicitações de push em um único URI.
Este é um exemplo de solicitação para se inscrever em notificações sobre alterações no status de produtos de uma conta do comerciante específica. Use o ID do comerciante da conta que vai
receber as notificações como merchantId
no URL da solicitação e o
ID do comerciante da conta que vai receber as notificações como
targetMerchantId
no corpo da solicitação. Se a sua conta for independente, sem contas vinculadas, e você quiser receber notificações dela, use seu próprio ID do comerciante nos dois lugares.
POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/targetMerchantId",
"callBackUri": "https://example.com"
}
As chamadas bem-sucedidas retornam um
name
para sua
assinatura, incluindo um ID de assinatura:
{
"name":"accounts/merchantId/notificationsubscriptions/subscriptionId",
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"targetAccount": "accounts/targetMerchantId",
"callBackUri": "https://example.com"
}
Você pode usar esse name
para GET
e assinaturas individuais de DELETE
.
É possível se inscrever para receber notificações sobre mudanças no status dos produtos de todas as suas
contas vinculadas. Para isso, inclua "allManagedAccounts": true
em vez de
targetAccount
na solicitação:
POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/
{
"registeredEvent": "PRODUCT_STATUS_CHANGE",
"allManagedAccounts": true,
"callBackUri": "https://example.com"
}
Para atualizar uma assinatura, use PATCH
com update_mask
para especificar
os campos que você quer atualizar e os novos valores no corpo do JSON:
PATCH /notifications/v1beta/accounts/merchantId/notificationsubscriptions/subscriptionId?update_mask=callBackUri
{
"callBackUri": "https://my-own-personal-domain.com"
}
Decodificar notificações
Depois de criar uma assinatura, você vai receber notificações para o callBackUri
especificado no seguinte formato:
{"message":{"data":"{base64_encoded_string}"}}
Os dados da notificação são codificados. É possível decodificar os dados para um formato de texto legível para usar na implementação. Confira um exemplo de controlador de inicialização de primavera que você pode usar para processar os dados 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
}
}
Confira um exemplo de base64_encoded_string
que foi decodificado:
{
"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"
}
Se não houver um campo oldValue
na notificação, significa que um novo produto foi adicionado à sua conta. Se não houver um campo newValue
, o produto foi excluído
da sua conta.
O campo reportingContext
aceita apenas (SHOPPING_ADS
, LOCAL_INVENTORY_ADS
, YOUTUBE_SHOPPING
, YOUTUBE_CHECKOUT
) do valor de tipo enumerado ReportingContextEnum.
Como testar a implementação
Este é um exemplo de notificação que pode ser usado para testar o URI de callback e a decodificação:
curl --header "Content-Type: application/json" --header "Accept: text/plain" --request POST --data '{"message":{"data":
"ewogICJhY2NvdW50IjogImFjY291bnRzLzEyMzQiLAogICJtYW5hZ2luZ0FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIsCiAgInJlc291cmNlVHlwZSI6ICJQUk9EVUNUIiwKICAiYXR0cmlidXRlIjogIlNUQVRVUyIsCiAgImNoYW5nZXMiOiBbewogICAgIm9sZFZhbHVlIjogImVsaWdpYmxlIiwKICAgICJyZWdpb25Db2RlIjogIlVTIiwKICAgICJyZXBvcnRpbmdDb250ZXh0IjogIlNIT1BQSU5HX0FEUyIKICB9XSwKICAicmVzb3VyY2VJZCI6ICJPTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAicmVzb3VyY2UiOiAiYWNjb3VudHMvMTIzNC9wcm9kdWN0cy9PTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAiZXhwaXJhdGlvblRpbWUiOiAiMjAyNC0xMC0yMlQwMjo0Mzo0Ny40NjE0NjRaIgp9"}}' https://{callBackUri}
Em resposta a essa chamada, o URI do callback precisa retornar um código de resposta bem-sucedida. A mensagem decodificada precisa ter o seguinte valor:
{
"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"
}