Configurar notificações de pagamento
As notificações Webhooks, também conhecidas como retornos de chamada web, são um método eficaz que permite aos servidores do Mercado Pago enviar informações em tempo real quando ocorre um evento específico relacionado à sua integração.
Com os Webhooks, o seu sistema não precisa realizar consultas contínuas para buscar atualizações. Esse mecanismo transmite dados de maneira passiva e automática, utilizando solicitações HTTP POST. Assim, otimiza a comunicação e reduz a carga nos servidores.
Consulte o fluxo geral de uma notificação no diagrama abaixo.

A seguir, apresentamos um passo a passo para configurar as notificações de criação e atualização de pagamentos. Depois de configuradas, as notificações Webhook serão enviadas sempre que um pagamento for criado ou seu estado for modificado (Pendente, Rejeitado ou Aprovado).
No processo de integração com o Mercado Pago, as notificações podem ser configuradas de duas maneiras:
| Tipo de Configuração | Descrição | Vantagens | Quando Usar |
| Configuração através de Suas integrações | Este método permite configurar notificações diretamente do seu Painel de Desenvolvedor. Você pode configurar notificações para cada uma de suas aplicações, identificar contas distintas, se necessário, e validar a origem da notificação através de uma assinatura secreta. | - Identificação simples de contas distintas, garantindo uma gestão adequada em ambientes diversos. - Alta segurança ao validar a origem das notificações através de uma assinatura secreta, que garante a integridade da informação recebida. - Mais versátil e eficaz para manter um controle centralizado e gerenciar a comunicação com as aplicações de maneira eficiente. | Recomendado para a maioria das integrações. |
| Configuração durante a criação de preferências | As notificações são configuradas para cada transação individualmente durante a criação da preferência. | - Ajustes específicos para cada transação. - Flexibilidade em casos de necessidade de parâmetros dinâmicos obrigatórios. - Ideal para integrações como plataformas de pagamento para múltiplos vendedores. | Conveniente em casos em que seja necessário enviar um query parameter dinâmico de forma obrigatória, além de ser adequado para integrações que funcionam como uma plataforma de pagamento para múltiplos vendedores. |
Configuração através de Suas integrações
Você pode configurar notificações para cada uma de suas aplicações diretamente em Suas integrações de maneira eficiente e segura. Nesta seção, explicaremos como:
- Indicar as URLs de notificação e configurar eventos
- Validar a origem de uma notificação
- Simular o recebimento de uma notificação
1. Indicar URLs de notificação e configurar o evento
Para configurar notificações Webhooks, é necessário indicar as URLs para as quais as notificações serão enviadas. Para fazer isso, siga o passo a passo abaixo:
- Acesse Suas integrações e selecione a aplicação integrada com o Checkout Pro para a qual você deseja ativar as notificações.

- No menu à esquerda, selecione Webhooks > Configurar notificações e configure a URL que será utilizada para recebê-las.

- Selecione a aba Modo produtivo e forneça uma
URL HTTPSpara receber notificações com sua integração produtiva.

- Selecione o evento Pagamentos para receber notificações, que serão enviadas no formato
JSONatravés de umHTTPS POSTpara a URL especificada anteriormente.

5.Por fim, clique em Salvar configuração. Isso gerará uma chave secreta exclusiva para a aplicação, utilizada para validar a autenticidade das notificações recebidas, assegurando que elas sejam provenientes do Mercado Pago. Vale ressaltar que essa chave não possui prazo de validade, mas recomenda-se sua renovação periódica como medida de segurança. Para renovar a chave, basta clicar no botão Restabelecer.
2. Simular o recebimento da notificação
Para garantir que as notificações sejam configuradas corretamente, é necessário simular o recebimento delas. Para isso, siga o passo a passo abaixo:
- Após configurar as URLs e os eventos, clique em Salvar configuração.
- Em seguida, clique em Simular para testar se a URL indicada está recebendo as notificações corretamente.
- Na tela de simulação, selecione a URL que será testada, que pode ser a URL de teste ou a de produção.
- Depois, escolha o tipo de evento e insira a identificação que será enviada no corpo da notificação (
Data ID). - Por fim, clique em Enviar teste para verificar a solicitação, a resposta fornecida pelo servidor e a descrição do evento. Você receberá uma resposta semelhante ao exemplo abaixo, que representa o
bodyda notificação recebida em seu servidor.
json{ "action": "payment.updated", "api_version": "v1", "data": { "id": "123456" }, "date_created": "2021-11-01T02:02:02Z", "id": "123456", "live_mode": false, "type": "payment", "user_id": 724484980 }
3. Validar a origem da notificação
A validação da origem de uma notificação é fundamental para assegurar a segurança e a autenticidade das informações recebidas. Este processo ajuda a prevenir fraudes e garante que apenas notificações legítimas sejam processadas.
O Mercado Pago enviará ao seu servidor uma notificação semelhante ao exemplo abaixo para um alerta do tópico payment. Neste exemplo, está incluída a notificação completa, que contém os query params, o body e o header da notificação.
- Query params: São parâmetros de consulta que acompanham a URL. No exemplo, temos
data.id=123456etype=payment. - Body: O corpo da notificação contém informações detalhadas sobre o evento, como
action,api_version,data,date_created,id,live_mode,typeeuser_id. - Header: O cabeçalho contém metadados importantes, incluindo a assinatura secreta da notificação
x-signature.
plainPOST /test?data.id=123456&type=payment HTTP/1.1 Host: prueba.requestcatcher.com Accept: */* Accept-Encoding: * Connection: keep-alive Content-Length: 177 Content-Type: application/json Newrelic: eyJ2IjpbMCwxXSwiZCI6eyJ0eSI6IkFwcCIsImFjIjoiOTg5NTg2IiwiYXAiOiI5NjA2MzYwOTQiLCJ0eCI6IjU3ZjI4YzNjOWE2ODNlZDYiLCJ0ciI6IjY0NjA0OTM3OWI1ZjA3MzMyZDdhZmQxMjEyM2I5YWE4IiwicHIiOjAuNzk3ODc0LCJzYSI6ZmFsc2UsInRpIjoxNzQyNTA1NjM4Njg0LCJ0ayI6IjE3MDk3MDcifX0= Traceparent: 00-646049379b5f07332d7afd12123b9aa8-e7f77a41f687aecd-00 Tracestate: 1709707@nr=0-0-989586-960636094-e7f77a41f687aecd-57f28c3c9a683ed6-0-0.797874-1742505638684 User-Agent: restclient-node/4.15.3 X-Request-Id: bb56a2f1-6aae-46ac-982e-9dcd3581d08e X-Rest-Pool-Name: /services/webhooks.js X-Retry: 0 X-Signature: ts=1742505638683,v1=ced36ab6d33566bb1e16c125819b8d840d6b8ef136b0b9127c76064466f5229b X-Socket-Timeout: 22000 {"action":"payment.updated","api_version":"v1","data":{"id":"123456"},"date_created":"2021-11-01T02:02:02Z","id":"123456","live_mode":false,"type":"payment","user_id":724484980}
A partir da notificação Webhook recebida, você poderá validar a autenticidade da sua origem. O Mercado Pago sempre incluirá a chave secreta nas notificações Webhooks que serão recebidas, o que permitirá validar sua autenticidade. Essa chave será enviada no header x-signature, que será semelhante ao exemplo abaixo.
plain`ts=1742505638683,v1=ced36ab6d33566bb1e16c125819b8d840d6b8ef136b0b9127c76064466f5229b`
Para confirmar a validação, é necessário extrair a chave contida no header e compará-la com a chave fornecida para a sua aplicação em Suas integrações.
Siga uma das abordagens abaixo para validar a autenticidade da notificação.
O SDK oficial implementa verificação de assinatura baseada em HMAC (HMAC-based Webhook Signature Verification) para autenticar a origem de cada notificação recebida.
Para obter sua chave secreta (secret), selecione a aplicação em Suas integrações, clique em Webhooks > Configurar notificação e revele a chave gerada.
<?php
use MercadoPago\Webhook\WebhookSignatureValidator;
use MercadoPago\Exceptions\InvalidWebhookSignatureException;
try {
WebhookSignatureValidator::validate(
$_SERVER['HTTP_X_SIGNATURE'],
$_SERVER['HTTP_X_REQUEST_ID'],
$_GET['data_id'],
$secret
);
http_response_code(200);
} catch (InvalidWebhookSignatureException $e) {
http_response_code(401);
}
import { WebhookSignatureValidator, InvalidWebhookSignatureError } from 'mercadopago';
try {
WebhookSignatureValidator.validate({
xSignature: req.headers['x-signature'],
xRequestId: req.headers['x-request-id'],
dataId: req.query['data.id'],
secret,
});
res.sendStatus(200);
} catch (err) {
if (err instanceof InvalidWebhookSignatureError) res.status(401).end();
else throw err;
}
from mercadopago.webhook import WebhookSignatureValidator, InvalidWebhookSignatureError
try:
WebhookSignatureValidator.validate(
request.headers.get(“x-signature”),
request.headers.get(“x-request-id”),
request.args.get(“data.id”),
secret,
)
return “”, 200
except InvalidWebhookSignatureError:
return “”, 401
import “github.com/mercadopago/sdk-go/pkg/webhook”
err := webhook.ValidateSignature(
r.Header.Get(“x-signature”),
r.Header.Get(“x-request-id”),
r.URL.Query().Get(“data.id”),
secret,
)
if err != nil {
w.WriteHeader(http.StatusUnauthorized)
return
}
w.WriteHeader(http.StatusOK)
using MercadoPago.Error;
using MercadoPago.Webhook;
try {
WebhookSignatureValidator.Validate(
xSignature: Request.Headers[“x-signature”],
xRequestId: Request.Headers[“x-request-id”],
dataId: Request.Query[“data.id”],
secret: secret);
return Ok();
} catch (InvalidWebhookSignatureException) {
return Unauthorized();
}
import com.mercadopago.webhook.WebhookSignatureValidator;
import com.mercadopago.exceptions.MPInvalidWebhookSignatureException;
try {
WebhookSignatureValidator.validate(
request.getHeader(“x-signature”),
request.getHeader(“x-request-id”),
request.getParameter(“data.id”),
secret);
response.setStatus(200);
} catch (MPInvalidWebhookSignatureException e) {
response.setStatus(401);
}
require 'mercadopago/webhook/validator'
begin
Mercadopago::Webhook::Validator.validate(
request.headers['x-signature'],
request.headers['x-request-id'],
request.params['data.id'],
secret
)
head :ok
rescue Mercadopago::Webhook::InvalidWebhookSignatureError
head :unauthorized
end
Configuração ao criar preferências
Durante o processo de criação de preferências, é possível configurar a URL de notificação de forma mais específica para cada pagamento utilizando o campo notification_url.
notification_url deve ser uma URL com protocolo HTTPS. Isso garante que as notificações sejam transmitidas de forma segura e que os dados trocados estejam criptografados, protegendo a integridade e a confidencialidade das informações. Além disso, HTTPS autentica que a comunicação está sendo realizada com o servidor legítimo, evitando possíveis interceptações maliciosas.A seguir, explicamos como configurar notificações ao criar um pagamento utilizando nossos SDKs.
- No campo
notification_url, indique a URL de onde as notificações serão recebidas, como mostrado abaixo.
<?php
$client = new PreferenceClient();
$preference = $client->create([
"notification_url" => "https://www.your_url_to_notification.com/",
"items"=> array(
array(
"title" => "Mi producto",
"quantity" => 1,
"unit_price" => 2000
)
)
]);
echo $preference
?>
const preference = new Preference(client);
preference.create({
body: {
notification_url: 'https://www.your_url_to_notification.com/',
items: [
{
title: 'Mi producto',
quantity: 1,
unit_price: 2000
}
],
}
})
.then(console.log)
.catch(console.log);
PreferenceItemRequest itemRequest =
PreferenceItemRequest.builder()
.id("1234")
.title("Games")
.description("PS5")
.pictureUrl("http://picture.com/PS5")
.categoryId("games")
.quantity(2)
.currencyId("BRL")
.unitPrice(new BigDecimal("4000"))
.build();
List<PreferenceItemRequest> items = new ArrayList<>();
items.add(itemRequest);
PreferenceRequest preferenceRequest = PreferenceRequest.builder()
.items(items).build();
PreferenceClient client = new PreferenceClient();
Preference preference = client.create(request);
# Cria um objeto de preferência
preference_data = {
notification_url: 'https://www.your_url_to_notification.com/',
items: [
{
title: 'Mi producto',
unit_price: 75.56,
quantity: 1
}
]
}
preference_response = sdk.preference.create(preference_data)
preference = preference_response[:response]
# Este valor substituirá a string "<%= @preference_id %>" no seu HTML
@preference_id = preference['id']
// Crea el objeto de request de la preference
var request = new PreferenceRequest
{
Items = new List<PreferenceItemRequest>
{
new PreferenceItemRequest
{
Title = "Mi producto",
Quantity = 1,
CurrencyId = "ARS",
UnitPrice = 75.56m,
},
},
};
// Cria a preferência usando o client
var client = new PreferenceClient();
Preference preference = await client.CreateAsync(request);
# Cria um item na preferência
preference_data = {
"notification_url" : "https://www.your_url_to_notification.com/",
"items": [
{
"title": "Mi producto",
"quantity": 1,
"unit_price": 75.76,
}
]
}
preference_response = sdk.preference().create(preference_data)
preference = preference_response["response"]
client := preference.NewClient(cfg)
request := preference.Request{
Items: []preference.ItemRequest{
{
Title: "My product",
Quantity: 1,
UnitPrice: 75.76,
},
},
}
resource, err := client.Create(context.Background(), request)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(resource)
notification_url, como 'localhost/' ou '127.0.0.1' com ou sem porta especificada. Recomendamos usar um servidor com um domínio nomeado (DNS) ou um IP de desenvolvimento acessível externamente para que o Mercado Pago possa enviar as notificações corretamente.- Implemente o receptor de notificações usando o código a seguir como exemplo:
php<?php MercadoPago\SDK::setAccessToken("ENV_ACCESS_TOKEN"); switch($_POST["type"]) { case "payment": $payment = MercadoPago\Payment::find_by_id($_POST["data"]["id"]); break; case "plan": $plan = MercadoPago\Plan::find_by_id($_POST["data"]["id"]); break; case "subscription": $plan = MercadoPago\Subscription::find_by_id($_POST["data"]["id"]); break; case "invoice": $plan = MercadoPago\Invoice::find_by_id($_POST["data"]["id"]); break; case "point_integration_wh": // $_POST contiene la informaciòn relacionada a la notificaciòn. break; } ?>
Depois de realizar a configuração necessária, a notificação Webhook será enviada no formato JSON. Veja abaixo um exemplo de notificação do tópico payment e as descrições das informações enviadas na tabela abaixo.
json{ "id": 12345, "live_mode": true, "type": "payment", "date_created": "2015-03-25T10:04:58.396-04:00", "user_id": 44444, "api_version": "v1", "action": "payment.created", "data": { "id": "999999999" } }
| Atributo | Descrição | Exemplo no JSON |
| id | ID da notificação | 12345 |
| live_mode | Indica se a URL inserida é válida. | true |
| type | Tipo de notificação recebida de acordo com o tópico previamente selecionado (payments, mp-connect, subscription, claim, automatic-payments, etc) | payment |
| date_created | Data de criação do recurso notificado | 2015-03-25T10:04:58.396-04:00 |
| user_id | Identificador do vendedor | 44444 |
| api_version | Valor que indica a versão da API que envia a notificação | v1 |
| action | Evento notificado, que indica se é uma atualização de um recurso ou a criação de um novo | payment.created |
| data.id | ID do pagamento, da ordem comercial ou da reclamação. | 999999999 |
Após configurar as notificações, acesse a seção Ações necessárias após receber uma notificação para confirmar que elas foram devidamente recebidas.
Ações necessárias após receber a notificação
Quando você recebe uma notificação na sua plataforma, o Mercado Pago espera uma resposta para validar que essa recepção foi correta. Para isso, você deve devolver um HTTP STATUS 200 (OK) ou 201 (CREATED).
O tempo de espera para essa confirmação será de 22 segundos. Se não for enviada essa resposta, o sistema entenderá que a notificação não foi recebida e realizará uma nova tentativa de envio a cada 15 minutos, até que receba a resposta. Após a terceira tentativa, o prazo será prorrogado, mas os envios continuarão acontecendo.
sequenceDiagram
participant MercadoPago as Mercado Pago
participant Integrador as Integrador
MercadoPago->>Integrador: tentativa: 1. Atraso: 0 minutos
MercadoPago->>Integrador: tentativa: 2. Atraso: 15 minutos
MercadoPago->>Integrador: tentativa: 3. Atraso: 30 minutos
MercadoPago->>Integrador: tentativa: 4. Atraso: 6 horas
MercadoPago->>Integrador: tentativa: 5. Atraso: 48 horas
MercadoPago->>Integrador: tentativa: 6. Atraso: 96 horas
MercadoPago->>Integrador: tentativa: 7. Atraso: 96 horas
MercadoPago->>Integrador: tentativa: 8. Atraso: 96 horas
Após responder a notificação, confirmando seu recebimento, você pode obter todas as informações sobre o evento do tópico payments notificado fazendo um GET ao endpoint v1/payments/{id}.
Com essas informações, você poderá realizar as atualizações necessárias na sua plataforma, como por exemplo, atualizar um pagamento aprovado.
Além disso, para consultar o status do evento após a notificação, você pode utilizar os diferentes métodos dos nossos SDKs para realizar a consulta com o ID que foi enviado na notificação.
MercadoPago.SDK.setAccessToken("ENV_ACCESS_TOKEN");
switch (type) {
case "payment":
Payment payment = Payment.findById(data.id);
break;
case "plan":
Plan plan = Plan.findById(data.id);
break;
case "subscription":
Subscription subscription = Subscription.findById(data.id);
break;
case "invoice":
Invoice invoice = Invoice.findById(data.id);
break;
case "point_integration_wh":
// POST contiene la informaciòn relacionada a la notificaciòn.
break;
}
mercadopago.configurations.setAccessToken('ENV_ACCESS_TOKEN');
switch (type) {
case 'payment':
const payment = await mercadopago.payment.findById(data.id);
break;
case 'plan':
const plan = await mercadopago.plans.get(data.id);
break;
case 'subscription':
const subscription = await mercadopago.subscriptions.get(data.id);
break;
case 'invoice':
const invoice = await mercadopago.invoices.get(data.id);
break;
case 'point_integration_wh':
// Contiene la informaciòn relacionada a la notificaciòn.
break;
}
sdk = Mercadopago::SDK.new('PROD_ACCESS_TOKEN')
case payload['type']
when 'payment'
payment = sdk.payment.search(filters: { id: payload['data']['id'] })
when 'plan'
plan = sdk.preapproval_plan.search(filters: { id: data['data']['id'] })
end
MercadoPagoConfig.AccessToken = "ENV_ACCESS_TOKEN";
switch (type)
{
case "payment":
Payment payment = await Payment.FindByIdAsync(payload["data"]["id"].ToString());
break;
case "plan":
Plan plan = await Plan.FindByIdAsync(payload["data"]["id"].ToString());
break;
case "subscription":
Subscription subscription = await Subscription.FindByIdAsync(payload["data"]["id"].ToString());
break;
case "invoice":
Invoice invoice = await Invoice.FindByIdAsync(payload["data"]["id"].ToString());
break;
case "point_integration_wh":
// Contiene la informaciòn relacionada a la notificaciòn.
break;
}
sdk = mercadopago.SDK("ENV_ACCESS_TOKEN")
notification_type = data["type"]
if notification_type == "payment":
payment = sdk.payment().get(payload["data"]["id"])
elif notification_type == "plan":
plan = sdk.preapproval().get(payload["data"]["id"])
elif notification_type == "subscription":
subscription = sdk.preapproval().get(payload["data"]["id"])
elif notification_type == "invoice":
invoice = sdk.invoice().get(payload["data"]["id"])
elif notification_type == "point_integration_wh":
# Contiene la informaciòn relacionada a la notificaciòn.
else:
return
cfg, err := config.New("ENV_ACCESS_TOKEN")
if err != nil {
fmt.Println(err)
}
switch req.Body.Type {
case "payment":
client := payment.NewClient(cfg)
resource, err = client.Get(context.Background(), req.Body.data.id)
if err != nil {
fmt.Println(err)
return
}
case "plan":
client := preapprovalplan.NewClient(cfg)
resource, err := client.Get(context.Background(), req.Body.data.id)
if err != nil {
fmt.Println(err)
return
}
}