Receber notificações push de alterações nos dados da sua conta

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 para receber notificações de mudança de status de produtos, poderá receber avisos em tempo real quando um produto for reprovado. Você pode se inscrever para receber notificações de qualquer uma das suas subcontas ou outras contas vinculadas.

Neste guia, mostramos exemplos de como gerenciar notificações de mudanças no status de produtos. Use esses exemplos para gerenciar notificações de outros eventos, alterando o valor do campo registeredEvent nas suas solicitações. Para uma lista completa dos tipos de evento, consulte a referência da API Merchant Notifications.

Inscrever-se

Para receber notificações, você precisa de um callBackUri. Seu 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.
  • É preciso aceitar solicitações HTTP POST com o cabeçalho Content-Type e o valor application/json.
  • É necessário retornar um dos códigos de resposta a seguir para confirmar que a notificação foi recebida.
    • 102
    • 200
    • 201
    • 202
    • 204

Você pode 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 a carga de solicitações de push para um único URI.

Este é um exemplo de solicitação para receber notificações sobre mudanças no status do produto em 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 e não tiver contas vinculadas e você quiser receber notificações referentes a ela, use seu 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"
}

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 este name para GET e DELETE assinaturas individuais.

Você pode se inscrever para receber notificações de mudanças no status de todas as suas contas vinculadas. Para isso, inclua "allManagedAccounts": true em vez de targetAccount na sua 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 existente, use PATCH com um 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ê recebe 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. Veja um exemplo de controlador de inicialização de mola que pode ser usado 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 um base64_encoded_string que foi decodificado:

"account": "accounts/targetMerchantId"
"managing_account": "accounts/merchantId"
"resource_type": PRODUCT
"attribute": STATUS
"changes": {
  "old_value": "eligible"
  "new_value": "disapproved"
  "region_code": "GE"
  "reporting_context": SHOPPING_ADS
},
"changes" {
  "old_value": "eligible"
  "new_value": "disapproved"
  "region_code": "JP"
  "reporting_context": SHOPPING_ADS
},
changes {
  "old_value": "eligible"
  "new_value": "disapproved"
  "region_code": "US"
  "reporting_context": SHOPPING_ADS
}
resource_id: "ONLINE~en~US~1234"
resource: "accounts/targetMerchantId/products/ONLINE~en~US~1234"

Como testar a implementação

Veja um exemplo de notificação que você pode usar 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":
"ImFjY291bnQiOiAiYWNjb3VudHMvMTIzNCIKIm1hbmFnaW5nX2FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIKInJlc291cmNlX3R5cGUiOiBQUk9EVUNUCiJhdHRyaWJ1dGUiOiBTVEFUVVMKImNoYW5nZXMiOiB7CiAgIm9sZF92YWx1ZSI6ICJlbGlnaWJsZSIKICAicmVnaW9uX2NvZGUiOiAiVVMiCiAgInJlcG9ydGluZ19jb250ZXh0IjogU0hPUFBJTkdfQURTCn0KInJlc291cmNlX2lkIjogIk9OTElORX5lbn5VU34wMDAwMDAwMDAwMDAiCiJyZXNvdXJjZSI6ICJhY2NvdW50cy8xMjM0L3Byb2R1Y3RzL09OTElORX5lbn5VU34wMDAwMDAwMDAwMDAi"}}' https://{callBackUri}

Em resposta a essa chamada, seu URI de callback precisa retornar um código de resposta bem-sucedida. A mensagem decodificada precisa ter o seguinte valor:

"account": "accounts/1234"
"managing_account": "accounts/5678"
"resource_type": PRODUCT
"attribute": STATUS
"changes": {
  "old_value": "eligible"
  "region_code": "US"
  "reporting_context": SHOPPING_ADS
}
"resource_id": "ONLINE~en~US~000000000000"
"resource": "accounts/1234/products/ONLINE~en~US~000000000000"