From 64015b7c8883493b1530fb1d566418ce9a259f7b Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 15 Jan 2024 15:23:37 -0300 Subject: [PATCH 1/8] 3 --- .../your-integrations/notifications.en.md | 2 +- .../your-integrations/notifications.es.md | 2 +- .../your-integrations/notifications.pt.md | 2 +- .../your-integrations/webhooks.en.md | 28 +++++++++++++++++-- .../your-integrations/webhooks.es.md | 27 ++++++++++++++++-- .../your-integrations/webhooks.pt.md | 28 +++++++++++++++++-- 6 files changed, 77 insertions(+), 12 deletions(-) diff --git a/guides/additional-content/your-integrations/notifications.en.md b/guides/additional-content/your-integrations/notifications.en.md index 424b3cb46f..ac29c5086e 100644 --- a/guides/additional-content/your-integrations/notifications.en.md +++ b/guides/additional-content/your-integrations/notifications.en.md @@ -18,5 +18,5 @@ There are **two types** of notifications available for configuration which ,once | Type | Description | | --- | --- | -| **Webhooks** | It uses HTTP REST and instantly notifies updates. [Click here](/developers/pt/guides/additional-content/your-integrations/webhooks) to learn how to configure and simulate the sending of Webhooks notifications. | +| **Webhooks** | It uses HTTP REST, instantly notifies updates and enhances security in your integration through the **secret signature**, a validation method to ensure that received notifications were sent by Mercado Pago.
[Haz clic aquí](/developers/es/guides/additional-content/your-integrations/webhooks) para aprender cómo configurar y simular el envío de notificaciones Webhooks. | | **IPN** | La notificación puede tardar unos minutos en enviarse. Para aprender a configurar las notificaciones IPN [haz clic aquí](/developers/es/guides/additional-content/your-integrations/ipn). | \ No newline at end of file diff --git a/guides/additional-content/your-integrations/notifications.pt.md b/guides/additional-content/your-integrations/notifications.pt.md index 32945df598..d4dbc60be8 100644 --- a/guides/additional-content/your-integrations/notifications.pt.md +++ b/guides/additional-content/your-integrations/notifications.pt.md @@ -17,5 +17,5 @@ Existe **dois tipos** de notificações disponíveis para configuração, que um | Tipo | Descrição | | --- | --- | -| **Webhooks** | Utiliza HTTP REST e notifica instantâneamente as atualizações. [Clique aqui](/developers/pt/guides/additional-content/your-integrations/webhooks) para saber como configurar e simular o envio de notificações Webhooks. | +| **Webhooks** | Utiliza HTTP REST, notifica instantaneamente as atualizações e traz mais segurança em sua integração por meio da **assinatura secreta**, um método de validação para garantir que notificações recebidas foram enviadas pelo Mercado Pago.
[Clique aqui](/developers/pt/guides/additional-content/your-integrations/webhooks) para saber como configurar e simular o envio de notificações Webhooks. | | **IPN** | A notificação pode demorar alguns instantes para ser enviada. Para saber como configurar notificações IPN [clique aqui](/developers/pt/guides/additional-content/your-integrations/ipn). | \ No newline at end of file diff --git a/guides/additional-content/your-integrations/webhooks.en.md b/guides/additional-content/your-integrations/webhooks.en.md index f41e5747f4..e596e6e568 100644 --- a/guides/additional-content/your-integrations/webhooks.en.md +++ b/guides/additional-content/your-integrations/webhooks.en.md @@ -4,15 +4,13 @@ Webhook notifications can be configured for one or more applications created in your [Developer Dashboard](/developers/panel/app). -Uma vez configurado, o Webhook será enviado sempre que ocorrer um ou mais eventos cadastrados, evitando que haja um trabalho de pesquisa a cada minuto em busca de uma resposta e, por consequência, que ocorra uma sobrecarga do sistema e a perda de dados sempre que houver alguma situação. Após receber uma notificação na sua plataforma, o Mercado Pago aguardará uma resposta para validar se você a recebeu corretamente. - Once configured, the Webhook will be sent whenever one or more registered events occur, avoiding a search job every minute in search of an answer and, consequently, a system overload and data loss whenever there is some situation. After receiving a notification on your platform, Mercado Pago will wait for a response to validate that you received it correctly In this documentation, we will explain the necessary settings to receive messages (through the Dashboard or when creating payments), in addition to showing the necessary actions that you must take for Mercado Pago to validate that the notifications were properly received. ## Configuration via Dashboard -Below, we will explain how to specify the URLs that will be notified, configure the events from which notifications will be received and simulate the receipt of various types of notifications. +Below, we will explain how to: specify the URLs that will be notified, configure the events from which notifications will be received, validate that the notifications you receive are sent by Mercado Pago and simulate the receipt of various types of notifications. ![webhooks](/images/dashboard/webhooks-es.png) @@ -39,6 +37,30 @@ Below, we will explain how to specify the URLs that will be notified, configure | `delivery_cancellation` | `case_created`| Shipment cancellation request | | `topic_claims_integration_wh` | `updated`| Claims made by sales | +5. Finally, click **Save** to generate a secret signature for the application. The signature is a validation method to ensure that received notifications were sent by Mercado Pago. + +> WARNING +> +> Important +> +> Mercado Pago will always send this signature in Webhook notifications. Always verify this authenticity information to prevent fraud.

+>

+> The generated signature has no expiration date, and while not mandatory, we recommend periodically renewing the **secret signature**. To do this, simply click the reset button next to the signature. + +### Validate notification origin + +1. After configuring the URLs and Events, **reveal the generated secret signature**. +2. Then, use the secret signature to validate the `x-signature-id` header. The value received in the header must match the key obtained in the previous step. In the example shown below, the value `59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1` should match the generated secret key. + +```header +... +accept-encoding * +content-type application/json +accept */* +x-signature-id 59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1 +... +``` + ### Simulate notification receipt 1. After configuring the URLs and Events, click **Simulate** to experiment and test if the indicated URL is receiving notifications correctly. diff --git a/guides/additional-content/your-integrations/webhooks.es.md b/guides/additional-content/your-integrations/webhooks.es.md index f3544ea229..750d7d3253 100644 --- a/guides/additional-content/your-integrations/webhooks.es.md +++ b/guides/additional-content/your-integrations/webhooks.es.md @@ -10,7 +10,7 @@ En esta documentación, explicaremos las configuraciones necesarias para recibir ## Configuración a través del Panel del desarrollador -A continuación explicaremos cómo indicar las URL que serán notificadas, configurar los eventos de los cuales se recibirá la notificación y simular la recepción de diversos tipos de notificaciones. +A continuación explicaremos cómo: indicar las URL que serán notificadas, configurar los eventos de los cuales se recibirá la notificación, validar que las notificaciones que recibes son enviadas por Mercado Pago y simular la recepción de diversos tipos de notificaciones. ![webhooks](/images/dashboard/webhooks-es.png) @@ -37,7 +37,29 @@ A continuación explicaremos cómo indicar las URL que serán notificadas, confi | `delivery_cancellation` | `case_created`| Solicitud de cancelación de envío | | `topic_claims_integration_wh` | `updated`| Reclamos hechos por las ventas | -5. Por último y haz clic en **Guardar**. +5. Por último, haz clic en **Guardar** para generar una clave secreta para la aplicación. La clave es un método de validación para asegurar que las notificaciones recibidas fueron enviadas por Mercado Pago. + +> WARNING +> +> Importante +> +> Mercado Pago siempre enviará esta clave en las notificaciones Webhooks. Siempre verifica esta información de autenticidad para evitar fraudes.

+>

+> La clave generada no tiene fecha de caducidad y, aunque no es obligatorio, recomendamos renovar periódicamente la **clave secreta**. Para hacerlo, simplemente haz clic en el botón de restablecimiento junto a la clave. + +### Validar origen de la notificación + +1. Después de configurar las URLs y los Eventos, **revela la clave secreta** generada. +2. A continuación, utiliza la clave secreta para validar el encabezado `x-signature-id`. El valor recibido en el encabezado debe coincidir con la clave obtenida en el paso previo. En el ejemplo que se muestra a continuación el valor `59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1` debería coincidir con la clave secreta generada. + +```header +... +accept-encoding * +content-type application/json +accept */* +x-signature-id 59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1 +... +``` ### Simular la recepción de la notificación @@ -377,7 +399,6 @@ En la notificación recibirás un `JSON` con la siguiente información que conti "merchant_order": 4945357007, "payment_id": 23064274473 - ``` > NOTE diff --git a/guides/additional-content/your-integrations/webhooks.pt.md b/guides/additional-content/your-integrations/webhooks.pt.md index ff7647f960..3c236fd09d 100644 --- a/guides/additional-content/your-integrations/webhooks.pt.md +++ b/guides/additional-content/your-integrations/webhooks.pt.md @@ -10,7 +10,7 @@ Nesta documentação, explicaremos as configurações necessárias para o recebi ## Configuração através do Painel do desenvolvedor -Abaixo explicaremos como indicar as URLs que serão notificadas, configurar os eventos dos quais se receberá a notificação e simular o recebimento de diversos tipos de notificações. +Abaixo explicaremos como: indicar as URLs que serão notificadas, configurar os eventos dos quais se receberá a notificação, simular o recebimento de diversos tipos de notificações e validar que as notificações que recebe são enviadas pelo Mercado Pago. ![webhooks](/images/dashboard/webhooks-pt.png) @@ -37,7 +37,29 @@ Abaixo explicaremos como indicar as URLs que serão notificadas, configurar os e | `delivery_cancellation` | `case_created`| Solicitação de cancelamento do envio | | `topic_claims_integration_wh` | `updated`| Reclamações feitas pelas vendas | -5. Por fim, clique em **Salvar**. +5. Por fim, clique em **Salvar** para gerar uma **assinatura secreta** para a aplicação. A assinatura é um método de validação para garantir que notificações recebidas foram enviadas pelo Mercado Pago. + +> WARNING +> +> Importante +> +> O Mercado Pago sempre enviará essa assinatura nas notificações Webhooks. Sempre confira essa informação de autenticidade para evitar fraudes.

+>

+> A assinatura gerada não tem prazo de validade e, embora não seja obrigatório, recomendamos renovar periodicamente a **assinatura secreta**. Para isso, basta clicar no botão de redefinição ao lado da assinatura. + +### Validar origem da notificação + +1. Após configurar as URLs e os Eventos, **revele a assinatura secreta** gerada. +2. Em seguida, utilize a assinatura secreta para validar o *header* `x-signature-id`. O valor recebido no *header* deve coincidir com a chave obtida na etapa anterior. No exemplo mostrado abaixo, o valor `59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1` deve coincidir com a chave secreta gerada. + +```header +... +accept-encoding * +content-type application/json +accept */* +x-signature-id 59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1 +... +``` ### Simular o recebimento da notificação @@ -290,6 +312,7 @@ curl -X POST \ >
> No caso dos eventos de `delivery` e `topic_claims_integration_wh`, também teremos alguns atributos diferentes na resposta. Veja na tabela abaixo quais são essas particularidades. + ```json { "id": 12345, @@ -304,7 +327,6 @@ curl -X POST \ } } ``` - Isso indica que foi criado o pagamento **999999999** para o usuário **44444** em modo de produção com a versão V1 da API e que esse evento ocorreu na data **2016-03-25T10:04:58.396-04:00**. | Atributo | Descrição | From 886474d35acc3717f685c13da4985cd882ae013a Mon Sep 17 00:00:00 2001 From: hgaldino Date: Mon, 15 Jan 2024 22:42:25 -0300 Subject: [PATCH 2/8] 5 --- .../your-integrations/webhooks.pt.md | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/guides/additional-content/your-integrations/webhooks.pt.md b/guides/additional-content/your-integrations/webhooks.pt.md index 3c236fd09d..7f26afcb29 100644 --- a/guides/additional-content/your-integrations/webhooks.pt.md +++ b/guides/additional-content/your-integrations/webhooks.pt.md @@ -49,16 +49,24 @@ Abaixo explicaremos como: indicar as URLs que serão notificadas, configurar os ### Validar origem da notificação -1. Após configurar as URLs e os Eventos, **revele a assinatura secreta** gerada. -2. Em seguida, utilize a assinatura secreta para validar o *header* `x-signature-id`. O valor recebido no *header* deve coincidir com a chave obtida na etapa anterior. No exemplo mostrado abaixo, o valor `59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1` deve coincidir com a chave secreta gerada. - -```header -... -accept-encoding * -content-type application/json -accept */* -x-signature-id 59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1 -... +No momento em que a URL cadastrada receber uma notificação, você poderá validar se o conteúdo enviado no _header_ `x-signature` foi enviado pelo Mercado Pago, a fim de obter mais segurança no recebimento das suas notificações. Veja abaixo como configurar essa validação. + +1. Utilizando o template abaixo, substitua os parâmetros pelos dados recebidos no corpo da notificação e como _query param_ na URL. + +```template +post;[urlpath];data.id=[data.id_url];type=[topic_url];user-agent:mercadopago webhook v1.0;[timestamp];action:[json_action];api_version:[json_apiversion];date_created:[json_datecreated_RFC3339];id:[id_json];live_mode:[livemode_json];type:[type_json];user_id:[userid_json]; +``` + +2. No [Painel do desenvolvedor](/developers/panel/app), selecione a aplicação desejada, navegue até a seção Webhooks e **revele a assinatura secreta** gerada. +3. A assinatura será utilizada para gerar o `hmac sha256` e, consequentemente, o `hash sha256` do template com os dados preenchidos (em hexadecimal). +4. Por fim, o parâmetro `ts` apresentado com o _hash_ gerado e seguido por `v1`, serão o conteúdo a ser utilizado para comparação com **assinatura secreta**, validando o *header* `x-signature` e garantindo que a notificação foi recebida pelo Mercado Pago. Exemplo: `ts=1704908010,v1=618c85345248dd820d5fd456117c2ab2ef8eda45a0282ff693eac24131a5e839` + +```node +const crypto = require('crypto'); +const cyphedSignature = crypto + .createHmac('sha256', secret) + .update(signatureTemplateParsed) + .digest('hex'); ``` ### Simular o recebimento da notificação From a196366eb082bba9ac80f165a347ccd72812649e Mon Sep 17 00:00:00 2001 From: hgaldino Date: Tue, 16 Jan 2024 22:09:29 -0300 Subject: [PATCH 3/8] 6 --- .../your-integrations/webhooks.pt.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/guides/additional-content/your-integrations/webhooks.pt.md b/guides/additional-content/your-integrations/webhooks.pt.md index 7f26afcb29..19bf9ca5d5 100644 --- a/guides/additional-content/your-integrations/webhooks.pt.md +++ b/guides/additional-content/your-integrations/webhooks.pt.md @@ -51,15 +51,24 @@ Abaixo explicaremos como: indicar as URLs que serão notificadas, configurar os No momento em que a URL cadastrada receber uma notificação, você poderá validar se o conteúdo enviado no _header_ `x-signature` foi enviado pelo Mercado Pago, a fim de obter mais segurança no recebimento das suas notificações. Veja abaixo como configurar essa validação. -1. Utilizando o template abaixo, substitua os parâmetros pelos dados recebidos no corpo da notificação e como _query param_ na URL. +1. Extraia o _timestamp_ (`ts`) e a assinatura do _header_ `x-signature`. Para isso, divida o conteúdo do _header_ pelo caractere `,`, o que resultará em uma lista de elementos. Exemplo: `ts=1704908010,v1=618c85345248dd820d5fd456117c2ab2ef8eda45a0282ff693eac24131a5e839` +2. Em seguida, divida cada elemento da lista pelo caractere `=`, o que resultaráem um par de prefixos e os valores. O valor para o prefixo `ts` é o _timestamp_ da notificação e `v1` é a assinatura encriptada. +3. Utilizando o _template_ abaixo, substitua os parâmetros pelos dados recebidos no corpo da notificação (sufixo *_json*) e como _query param_ na URL (sufixo *_url*). + +> Caso algum dos valores apresentados no _template_ abaixo não esteja presente em sua notificação, você deverá remover estes valores do template. ```template post;[urlpath];data.id=[data.id_url];type=[topic_url];user-agent:mercadopago webhook v1.0;[timestamp];action:[json_action];api_version:[json_apiversion];date_created:[json_datecreated_RFC3339];id:[id_json];live_mode:[livemode_json];type:[type_json];user_id:[userid_json]; ``` -2. No [Painel do desenvolvedor](/developers/panel/app), selecione a aplicação desejada, navegue até a seção Webhooks e **revele a assinatura secreta** gerada. -3. A assinatura será utilizada para gerar o `hmac sha256` e, consequentemente, o `hash sha256` do template com os dados preenchidos (em hexadecimal). -4. Por fim, o parâmetro `ts` apresentado com o _hash_ gerado e seguido por `v1`, serão o conteúdo a ser utilizado para comparação com **assinatura secreta**, validando o *header* `x-signature` e garantindo que a notificação foi recebida pelo Mercado Pago. Exemplo: `ts=1704908010,v1=618c85345248dd820d5fd456117c2ab2ef8eda45a0282ff693eac24131a5e839` +4. No _template_, os valores englobados por `[]` devem ser trocados pelos valores da sua notificação como: + +- [topic_url] será substituido pelo valor `payment` (sem os colchetes). +- [urlpath] será somente o domíno + o _path_ da URL (sem "http://" ou "https://"). +- [timestamp] será o valo `ts` extraído do _header_ `x-signature`. + +5. No [Painel do desenvolvedor](/developers/panel/app), selecione a aplicação desejada, navegue até a seção Webhooks e **revele a assinatura secreta** gerada. +6. Gere a contra chave para validação. Para isso, calcule um [HMAC](https://pt.wikipedia.org/wiki/HMAC) com a função de `hash SHA256` em base hexadecimal, utilize a **assinatura secreta** como chave e o _template_ populado com os valores como mensagem. Exemplo: ```node const crypto = require('crypto'); @@ -69,6 +78,8 @@ const cyphedSignature = crypto .digest('hex'); ``` +7. Por fim, compare a chave gerada com a chave extraída do cabeçalho, elas devem ter uma correspondência exata. Além disso, é possível usar o _timestamp_ extraído do `header` para comparação com um _timestamp_ gerado na hora do recebimento da notificação, a fim de estipular uma tolerância de atraso no recebimento da mensagem. + ### Simular o recebimento da notificação 1. Após configurar as URLs e os Eventos, clique em **Simular** para experimentar e testar se a URL indicada está recebendo as notificações corretamente. From 7f02df617e21e28da6ae6943e572e989fe06324f Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 17 Jan 2024 11:35:20 -0300 Subject: [PATCH 4/8] final --- .../your-integrations/webhooks.pt.md | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/guides/additional-content/your-integrations/webhooks.pt.md b/guides/additional-content/your-integrations/webhooks.pt.md index 19bf9ca5d5..f4b8b9903c 100644 --- a/guides/additional-content/your-integrations/webhooks.pt.md +++ b/guides/additional-content/your-integrations/webhooks.pt.md @@ -49,26 +49,27 @@ Abaixo explicaremos como: indicar as URLs que serão notificadas, configurar os ### Validar origem da notificação -No momento em que a URL cadastrada receber uma notificação, você poderá validar se o conteúdo enviado no _header_ `x-signature` foi enviado pelo Mercado Pago, a fim de obter mais segurança no recebimento das suas notificações. Veja abaixo como configurar essa validação. +No momento em que a URL cadastrada receber uma notificação, você poderá validar se o conteúdo enviado no _header_ `x-signature` (exemplo: `ts=1704908010,v1=618c85345248dd820d5fd456117c2ab2ef8eda45a0282ff693eac24131a5e839`) foi enviado pelo Mercado Pago, a fim de obter mais segurança no recebimento das suas notificações. Veja abaixo como configurar essa validação. -1. Extraia o _timestamp_ (`ts`) e a assinatura do _header_ `x-signature`. Para isso, divida o conteúdo do _header_ pelo caractere `,`, o que resultará em uma lista de elementos. Exemplo: `ts=1704908010,v1=618c85345248dd820d5fd456117c2ab2ef8eda45a0282ff693eac24131a5e839` -2. Em seguida, divida cada elemento da lista pelo caractere `=`, o que resultaráem um par de prefixos e os valores. O valor para o prefixo `ts` é o _timestamp_ da notificação e `v1` é a assinatura encriptada. -3. Utilizando o _template_ abaixo, substitua os parâmetros pelos dados recebidos no corpo da notificação (sufixo *_json*) e como _query param_ na URL (sufixo *_url*). - -> Caso algum dos valores apresentados no _template_ abaixo não esteja presente em sua notificação, você deverá remover estes valores do template. +1. Extraia o _timestamp_ (`ts`) e a assinatura do _header_ `x-signature`. Para isso, divida o conteúdo do _header_ pelo caractere `,`, o que resultará em uma lista de elementos. +2. Em seguida, divida cada elemento da lista pelo caractere `=`, o que resultará em um par de prefixos e os valores. O valor para o prefixo `ts` é o _timestamp_ da notificação e `v1` é a assinatura encriptada. +3. Utilizando o _template_ abaixo, substitua os parâmetros pelos dados recebidos na sua notificação. ```template post;[urlpath];data.id=[data.id_url];type=[topic_url];user-agent:mercadopago webhook v1.0;[timestamp];action:[json_action];api_version:[json_apiversion];date_created:[json_datecreated_RFC3339];id:[id_json];live_mode:[livemode_json];type:[type_json];user_id:[userid_json]; ``` -4. No _template_, os valores englobados por `[]` devem ser trocados pelos valores da sua notificação como: +No _template_, os valores englobados por `[]` devem ser trocados pelos valores da notificação, como: -- [topic_url] será substituido pelo valor `payment` (sem os colchetes). +- Parâmetros com sufixo *_url* são provenientes de _query params_. Exemplo: [topic_url] será substituido pelo valor `payment` (sem os colchetes). +- Parâmetros com sufixo *_json* são provenientes do _body_ da requisição. - [urlpath] será somente o domíno + o _path_ da URL (sem "http://" ou "https://"). -- [timestamp] será o valo `ts` extraído do _header_ `x-signature`. +- [timestamp] será o valor `ts` extraído do _header_ `x-signature`. + +> Caso algum dos valores apresentados no _template_ abaixo não esteja presente em sua notificação, você deverá remover estes valores do template. -5. No [Painel do desenvolvedor](/developers/panel/app), selecione a aplicação desejada, navegue até a seção Webhooks e **revele a assinatura secreta** gerada. -6. Gere a contra chave para validação. Para isso, calcule um [HMAC](https://pt.wikipedia.org/wiki/HMAC) com a função de `hash SHA256` em base hexadecimal, utilize a **assinatura secreta** como chave e o _template_ populado com os valores como mensagem. Exemplo: +4. No [Painel do desenvolvedor](/developers/panel/app), selecione a aplicação integrada, navegue até a seção Webhooks e **revele a assinatura secreta** gerada. +5. Gere a contra chave para validação. Para isso, calcule um [HMAC](https://pt.wikipedia.org/wiki/HMAC) com a função de `hash SHA256` em base hexadecimal, utilize a **assinatura secreta** como chave e o _template_ populado com os valores como mensagem. Exemplo: ```node const crypto = require('crypto'); @@ -78,7 +79,7 @@ const cyphedSignature = crypto .digest('hex'); ``` -7. Por fim, compare a chave gerada com a chave extraída do cabeçalho, elas devem ter uma correspondência exata. Além disso, é possível usar o _timestamp_ extraído do `header` para comparação com um _timestamp_ gerado na hora do recebimento da notificação, a fim de estipular uma tolerância de atraso no recebimento da mensagem. +6. Por fim, compare a chave gerada com a chave extraída do cabeçalho, elas devem ter uma correspondência exata. Além disso, é possível usar o _timestamp_ extraído do `header` para comparação com um _timestamp_ gerado na hora do recebimento da notificação, a fim de estipular uma tolerância de atraso no recebimento da mensagem. ### Simular o recebimento da notificação From 84fc7979edb1a9f5aa62cdf331cbefa94f0f09a0 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 17 Jan 2024 12:26:29 -0300 Subject: [PATCH 5/8] ES --- .../your-integrations/webhooks.es.md | 40 ++++++++++++++----- .../your-integrations/webhooks.pt.md | 4 +- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/guides/additional-content/your-integrations/webhooks.es.md b/guides/additional-content/your-integrations/webhooks.es.md index 750d7d3253..076d7b8bd1 100644 --- a/guides/additional-content/your-integrations/webhooks.es.md +++ b/guides/additional-content/your-integrations/webhooks.es.md @@ -49,18 +49,38 @@ A continuación explicaremos cómo: indicar las URL que serán notificadas, conf ### Validar origen de la notificación -1. Después de configurar las URLs y los Eventos, **revela la clave secreta** generada. -2. A continuación, utiliza la clave secreta para validar el encabezado `x-signature-id`. El valor recibido en el encabezado debe coincidir con la clave obtenida en el paso previo. En el ejemplo que se muestra a continuación el valor `59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1` debería coincidir con la clave secreta generada. - -```header -... -accept-encoding * -content-type application/json -accept */* -x-signature-id 59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1 -... +En el momento en que la URL registrada reciba una notificación, podrás validar si el contenido enviado en el _header_ `x-signature` (ejemplo: `ts=1704908010,v1=618c85345248dd820d5fd456117c2ab2ef8eda45a0282ff693eac24131a5e839`) fue enviado por Mercado Pago, con el fin de obtener mayor seguridad en la recepción de tus notificaciones. A continuación, te indicamos cómo configurar esta validación. + +1. Extrae el _timestamp_ (`ts`) y la clave del _header_ `x-signature`. Para hacer esto, divide el contenido del _header_ por el carácter `,`, lo que resultará en una lista de elementos. +2. Luego, divide cada elemento de la lista por el carácter `=`, lo que resultará en un par de prefijos y los valores. El valor para el prefijo `ts` es el _timestamp_ de la notificación y `v1` es la clave encriptada. +3. Utilizando el _template_ a continuación, sustituye los parámetros con los datos recibidos en tu notificación. + +```template +post;[urlpath];data.id=[data.id_url];type=[topic_url];user-agent:mercadopago webhook v1.0;[timestamp];action:[json_action];api_version:[json_apiversion];date_created:[json_datecreated_RFC3339];id:[id_json];live_mode:[livemode_json];type:[type_json];user_id:[userid_json]; +``` + +En el _template_, los valores entre `[]` deben ser reemplazados por los valores de la notificación, como: + +- Los parámetros con el sufijo *_url* provienen de _query params_. Ejemplo: [topic_url] se sustituirá por el valor `payment`` (sin corchetes). +- Los parámetros con el sufijo *_json* provienen del _body_ de la solicitud. +- [urlpath] será solo el dominio + el _path_ de la URL (sin "http://" o "https://"). +- [timestamp] será el valor ts extraído del _header_ `x-signature`. + +> Si alguno de los valores presentados en el _header_ a continuación no está presente en tu notificación, deberás eliminarlos de la plantilla. + +4. En el [Panel del desarrollador](/developers/panel/app), selecciona la aplicación integrada, ve a la sección de Webhooks y revela la clave secreta generada. +5. Genera la contraclave para la validación. Para hacer esto, calcula un [HMAC](https://es.wikipedia.org/wiki/HMAC) con la función de `hash SHA256` en base hexadecimal, utilizando la **clave secreta** como clave y el _template_ poblada con los valores como mensaje. Ejemplo: + +```node +const crypto = require('crypto'); +const cyphedSignature = crypto + .createHmac('sha256', secret) + .update(signatureTemplateParsed) + .digest('hex'); ``` +6. Finalmente, compara la clave generada con la clave extraída del _header_, asegurándote de que tengan una correspondencia exacta. Además, puedes usar el _timestamp_ extraído del _header_ para compararlo con un timestamp generado en el momento de la recepción de la notificación, con el fin de establecer una tolerancia de demora en la recepción del mensaje. + ### Simular la recepción de la notificación 1. Después de configurar las URLs y los Eventos, haz clic en **Simular** para experimentar y probar si la URL indicada está recibiendo las notificaciones correctamente. diff --git a/guides/additional-content/your-integrations/webhooks.pt.md b/guides/additional-content/your-integrations/webhooks.pt.md index f4b8b9903c..3fb36f60da 100644 --- a/guides/additional-content/your-integrations/webhooks.pt.md +++ b/guides/additional-content/your-integrations/webhooks.pt.md @@ -66,7 +66,7 @@ No _template_, os valores englobados por `[]` devem ser trocados pelos valores d - [urlpath] será somente o domíno + o _path_ da URL (sem "http://" ou "https://"). - [timestamp] será o valor `ts` extraído do _header_ `x-signature`. -> Caso algum dos valores apresentados no _template_ abaixo não esteja presente em sua notificação, você deverá remover estes valores do template. +> Caso algum dos valores apresentados no _template_ abaixo não esteja presente em sua notificação, você deverá removê-los do template. 4. No [Painel do desenvolvedor](/developers/panel/app), selecione a aplicação integrada, navegue até a seção Webhooks e **revele a assinatura secreta** gerada. 5. Gere a contra chave para validação. Para isso, calcule um [HMAC](https://pt.wikipedia.org/wiki/HMAC) com a função de `hash SHA256` em base hexadecimal, utilize a **assinatura secreta** como chave e o _template_ populado com os valores como mensagem. Exemplo: @@ -79,7 +79,7 @@ const cyphedSignature = crypto .digest('hex'); ``` -6. Por fim, compare a chave gerada com a chave extraída do cabeçalho, elas devem ter uma correspondência exata. Além disso, é possível usar o _timestamp_ extraído do `header` para comparação com um _timestamp_ gerado na hora do recebimento da notificação, a fim de estipular uma tolerância de atraso no recebimento da mensagem. +6. Por fim, compare a chave gerada com a chave extraída do cabeçalho, considerando elas devem ter uma correspondência exata. Além disso, é possível usar o _timestamp_ extraído do _header_ para comparação com um _timestamp_ gerado na hora do recebimento da notificação, a fim de estipular uma tolerância de atraso no recebimento da mensagem. ### Simular o recebimento da notificação From 6da56d2c951827e74f27c737f5497a1a1655e09f Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 17 Jan 2024 12:30:15 -0300 Subject: [PATCH 6/8] sdk-java-fix-bugs --- guides/sdks-v2/official/java/create-payments.en.md | 2 ++ guides/sdks-v2/official/java/create-payments.es.md | 2 ++ guides/sdks-v2/official/java/create-payments.pt.md | 2 ++ 3 files changed, 6 insertions(+) diff --git a/guides/sdks-v2/official/java/create-payments.en.md b/guides/sdks-v2/official/java/create-payments.en.md index 59fe85f49e..678df0b9a3 100644 --- a/guides/sdks-v2/official/java/create-payments.en.md +++ b/guides/sdks-v2/official/java/create-payments.en.md @@ -18,6 +18,8 @@ MPRequestOptions requestOptions = MPRequestOptions.builder() .customHeaders(customHeaders) .build(); +MercadoPagoConfig.setAccessToken("YOUR_ACCESS_TOKEN"); + PaymentClient client = new PaymentClient(); List items = new ArrayList<>(); diff --git a/guides/sdks-v2/official/java/create-payments.es.md b/guides/sdks-v2/official/java/create-payments.es.md index 098f4bd37c..19cfa4e482 100644 --- a/guides/sdks-v2/official/java/create-payments.es.md +++ b/guides/sdks-v2/official/java/create-payments.es.md @@ -18,6 +18,8 @@ MPRequestOptions requestOptions = MPRequestOptions.builder() .customHeaders(customHeaders) .build(); +MercadoPagoConfig.setAccessToken("YOUR_ACCESS_TOKEN"); + PaymentClient client = new PaymentClient(); List items = new ArrayList<>(); diff --git a/guides/sdks-v2/official/java/create-payments.pt.md b/guides/sdks-v2/official/java/create-payments.pt.md index 4f47d5f28e..cf399500e0 100644 --- a/guides/sdks-v2/official/java/create-payments.pt.md +++ b/guides/sdks-v2/official/java/create-payments.pt.md @@ -18,6 +18,8 @@ MPRequestOptions requestOptions = MPRequestOptions.builder() .customHeaders(customHeaders) .build(); +MercadoPagoConfig.setAccessToken("YOUR_ACCESS_TOKEN"); + PaymentClient client = new PaymentClient(); List items = new ArrayList<>(); From 603ef10d7a9507e2474a2ea073860eccb9626b2a Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 17 Jan 2024 18:01:37 -0300 Subject: [PATCH 7/8] final --- .../your-integrations/webhooks.en.md | 53 +++++++++++++++---- .../your-integrations/webhooks.es.md | 21 ++++++-- .../your-integrations/webhooks.pt.md | 21 ++++++-- 3 files changed, 77 insertions(+), 18 deletions(-) diff --git a/guides/additional-content/your-integrations/webhooks.en.md b/guides/additional-content/your-integrations/webhooks.en.md index e596e6e568..e2ac19b871 100644 --- a/guides/additional-content/your-integrations/webhooks.en.md +++ b/guides/additional-content/your-integrations/webhooks.en.md @@ -49,17 +49,50 @@ Below, we will explain how to: specify the URLs that will be notified, configure ### Validate notification origin -1. After configuring the URLs and Events, **reveal the generated secret signature**. -2. Then, use the secret signature to validate the `x-signature-id` header. The value received in the header must match the key obtained in the previous step. In the example shown below, the value `59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1` should match the generated secret key. - -```header -... -accept-encoding * -content-type application/json -accept */* -x-signature-id 59f768b5fcd30f47764052992e42b0f8812d02ffa34ca9f8d9947f2dcb7027f1 -... +At the moment the registered URL receives a notification, you can validate whether the content sent in the `x-signature` header (example: `ts=1704908010,v1=618c85345248dd820d5fd456117c2ab2ef8eda45a0282ff693eac24131a5e839`) was sent by Mercado Pago, in order to enhance the security of receiving your notifications. See below how to configure this validation. + +1. Extract the timestamp (`ts`) and the signature from the `x-signature` header. To do this, split the content of the header by the `,` character, resulting in a list of elements. +2. Then, split each element of the list by the equal sign `=`, resulting in a pair of prefixes and values. The value for the prefix `ts` is the timestamp of the notification, and `v1` is the encrypted signature. +3. Using the template below, replace the parameters with the data received in your notification. + +```template +post;[urlpath];data.id=[data.id_url];type=[topic_url];user-agent:mercadopago webhook v1.0;[timestamp];action:[json_action];api_version:[json_apiversion];date_created:[json_datecreated_RFC3339];id:[id_json];live_mode:[livemode_json];type:[type_json];user_id:[userid_json]; +``` + +In the template, values enclosed in `[]` should be replaced with the notification data, such as: + +- Parameters with the `_url` suffix come from query params. For example, `[topic_url]` will be replaced by the value `payment` (without brackets). +- Parameters with the `_json` suffix come from the `body` of the request. +- `[urlpath]` will be only the domain + the path of the URL (without "http://" or "https://"). +- `[timestamp]` will be the value of ts extracted from the x-signature header. + +> If any of the values presented in the template below are not present in your notification, you should remove them from the template. + +4. In the Developer [Dashboard](/developers/panel/app), select the integrated application, navigate to the Webhooks section, and reveal the generated secret signature. +5. Generate the counter key for validation. To do this, calculate an [HMAC](https://en.wikipedia.org/wiki/HMAC) with the `SHA256 hash` function in hexadecimal, using the **secret signature** as the key and the populated template with the values as the message. For example: + +[[[ +```php +$cyphedSignature = hash_hmac('sha256', $data, $key); ``` +```node +const crypto = require('crypto'); +const cyphedSignature = crypto + .createHmac('sha256', secret) + .update(signatureTemplateParsed) + .digest('hex'); +``` +```java +String cyphedSignature = new HmacUtils("HmacSHA256", secret).hmacHex(signedTemplate); +``` +```python +import hashlib, hmac, binascii + +cyphedSignature = binascii.hexlify(hmac_sha256(secret.encode(), signedTemplate.encode())) +``` +]]] + +6. Finally, compare the generated key with the key extracted from the header, ensuring they have an exact match. Additionally, you can use the timestamp extracted from the header for comparison with a timestamp generated at the time of receiving the notification to establish a tolerance for message reception delays. ### Simulate notification receipt diff --git a/guides/additional-content/your-integrations/webhooks.es.md b/guides/additional-content/your-integrations/webhooks.es.md index 076d7b8bd1..abb24828c5 100644 --- a/guides/additional-content/your-integrations/webhooks.es.md +++ b/guides/additional-content/your-integrations/webhooks.es.md @@ -61,16 +61,20 @@ post;[urlpath];data.id=[data.id_url];type=[topic_url];user-agent:mercadopago web En el _template_, los valores entre `[]` deben ser reemplazados por los valores de la notificación, como: -- Los parámetros con el sufijo *_url* provienen de _query params_. Ejemplo: [topic_url] se sustituirá por el valor `payment`` (sin corchetes). -- Los parámetros con el sufijo *_json* provienen del _body_ de la solicitud. -- [urlpath] será solo el dominio + el _path_ de la URL (sin "http://" o "https://"). -- [timestamp] será el valor ts extraído del _header_ `x-signature`. +- Los parámetros con el sufijo `_url` provienen de _query params_. Ejemplo: `[topic_url]` se sustituirá por el valor `payment`` (sin corchetes). +- Los parámetros con el sufijo `_json` provienen del _body_ de la solicitud. +- `[urlpath]` será solo el dominio + el _path_ de la URL (sin "http://" o "https://"). +- `[timestamp]` será el valor ts extraído del _header_ `x-signature`. > Si alguno de los valores presentados en el _header_ a continuación no está presente en tu notificación, deberás eliminarlos de la plantilla. 4. En el [Panel del desarrollador](/developers/panel/app), selecciona la aplicación integrada, ve a la sección de Webhooks y revela la clave secreta generada. 5. Genera la contraclave para la validación. Para hacer esto, calcula un [HMAC](https://es.wikipedia.org/wiki/HMAC) con la función de `hash SHA256` en base hexadecimal, utilizando la **clave secreta** como clave y el _template_ poblada con los valores como mensaje. Ejemplo: +[[[ +```php +$cyphedSignature = hash_hmac('sha256', $data, $key); +``` ```node const crypto = require('crypto'); const cyphedSignature = crypto @@ -78,6 +82,15 @@ const cyphedSignature = crypto .update(signatureTemplateParsed) .digest('hex'); ``` +```java +String cyphedSignature = new HmacUtils("HmacSHA256", secret).hmacHex(signedTemplate); +``` +```python +import hashlib, hmac, binascii + +cyphedSignature = binascii.hexlify(hmac_sha256(secret.encode(), signedTemplate.encode())) +``` +]]] 6. Finalmente, compara la clave generada con la clave extraída del _header_, asegurándote de que tengan una correspondencia exacta. Además, puedes usar el _timestamp_ extraído del _header_ para compararlo con un timestamp generado en el momento de la recepción de la notificación, con el fin de establecer una tolerancia de demora en la recepción del mensaje. diff --git a/guides/additional-content/your-integrations/webhooks.pt.md b/guides/additional-content/your-integrations/webhooks.pt.md index 3fb36f60da..6253fd0cf3 100644 --- a/guides/additional-content/your-integrations/webhooks.pt.md +++ b/guides/additional-content/your-integrations/webhooks.pt.md @@ -61,16 +61,20 @@ post;[urlpath];data.id=[data.id_url];type=[topic_url];user-agent:mercadopago web No _template_, os valores englobados por `[]` devem ser trocados pelos valores da notificação, como: -- Parâmetros com sufixo *_url* são provenientes de _query params_. Exemplo: [topic_url] será substituido pelo valor `payment` (sem os colchetes). -- Parâmetros com sufixo *_json* são provenientes do _body_ da requisição. -- [urlpath] será somente o domíno + o _path_ da URL (sem "http://" ou "https://"). -- [timestamp] será o valor `ts` extraído do _header_ `x-signature`. +- Parâmetros com sufixo `_url` são provenientes de _query params_. Exemplo: `[topic_url]` será substituido pelo valor `payment` (sem os colchetes). +- Parâmetros com sufixo `_json` são provenientes do _body_ da requisição. +- `[urlpath]` será somente o domíno + o _path_ da URL (sem "http://" ou "https://"). +- `[timestamp]` será o valor `ts` extraído do _header_ `x-signature`. > Caso algum dos valores apresentados no _template_ abaixo não esteja presente em sua notificação, você deverá removê-los do template. 4. No [Painel do desenvolvedor](/developers/panel/app), selecione a aplicação integrada, navegue até a seção Webhooks e **revele a assinatura secreta** gerada. 5. Gere a contra chave para validação. Para isso, calcule um [HMAC](https://pt.wikipedia.org/wiki/HMAC) com a função de `hash SHA256` em base hexadecimal, utilize a **assinatura secreta** como chave e o _template_ populado com os valores como mensagem. Exemplo: +[[[ +```php +$cyphedSignature = hash_hmac('sha256', $data, $key); +``` ```node const crypto = require('crypto'); const cyphedSignature = crypto @@ -78,6 +82,15 @@ const cyphedSignature = crypto .update(signatureTemplateParsed) .digest('hex'); ``` +```java +String cyphedSignature = new HmacUtils("HmacSHA256", secret).hmacHex(signedTemplate); +``` +```python +import hashlib, hmac, binascii + +cyphedSignature = binascii.hexlify(hmac_sha256(secret.encode(), signedTemplate.encode())) +``` +]]] 6. Por fim, compare a chave gerada com a chave extraída do cabeçalho, considerando elas devem ter uma correspondência exata. Além disso, é possível usar o _timestamp_ extraído do _header_ para comparação com um _timestamp_ gerado na hora do recebimento da notificação, a fim de estipular uma tolerância de atraso no recebimento da mensagem. From 52eb852cdbd4c381debd43a756806602900372a4 Mon Sep 17 00:00:00 2001 From: hgaldino Date: Wed, 17 Jan 2024 18:09:32 -0300 Subject: [PATCH 8/8] api-wallet --- reference/api-json/wallet_connect.json | 304 ------------------------- 1 file changed, 304 deletions(-) diff --git a/reference/api-json/wallet_connect.json b/reference/api-json/wallet_connect.json index fc2bef380a..cb0b006f3f 100644 --- a/reference/api-json/wallet_connect.json +++ b/reference/api-json/wallet_connect.json @@ -187,46 +187,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, { "title": "400", "description": { @@ -355,46 +315,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, { "title": "400", "description": { @@ -424,22 +344,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "404", - "description": { - "en": "Not-Found", - "es": "Not-Found", - "pt": "Not-Found" - } - }, - { - "title": "404", - "description": { - "en": "Not-Found", - "es": "Not-Found", - "pt": "Not-Found" - } - }, { "title": "404", "description": { @@ -569,22 +473,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, { "title": "400", "description": { @@ -923,22 +811,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, { "title": "400", "description": { @@ -1547,62 +1419,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, { "title": "400", "description": { @@ -1632,14 +1448,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "500", - "description": { - "en": "Error", - "es": "Error", - "pt": "Error" - } - }, { "title": "500", "description": { @@ -2058,54 +1866,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, { "title": "400", "description": { @@ -2135,14 +1895,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "500", - "description": { - "en": "Error", - "es": "Error", - "pt": "Error" - } - }, { "title": "500", "description": { @@ -2493,22 +2245,6 @@ "pt": "Bad-Request" } }, - { - "title": "404", - "description": { - "en": "Not-Found", - "es": "Not-Found", - "pt": "Not-Found" - } - }, - { - "title": "404", - "description": { - "en": "Not-Found", - "es": "Not-Found", - "pt": "Not-Found" - } - }, { "title": "404", "description": { @@ -2538,14 +2274,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "500", - "description": { - "en": "Error", - "es": "Error", - "pt": "Error" - } - }, { "title": "500", "description": { @@ -2708,30 +2436,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, - { - "title": "400", - "description": { - "en": "Bad-Request", - "es": "Bad-Request", - "pt": "Bad-Request" - } - }, { "title": "400", "description": { @@ -2761,14 +2465,6 @@ "errorKey": { "type": "string", "enum": [ - { - "title": "500", - "description": { - "en": "Error", - "es": "Error", - "pt": "Error" - } - }, { "title": "500", "description": {