{DUVIDA} ASSINATURA WEBHOOK MERCADO PAGO - PHP
Olá pessoal, estou tentando fazer a verificação da assinatura do mercado pago, mas está siplesmente impossível, não sei se é a API deles que está errada ou é eu mesmo kkk.
já testei rodar até no chat gpt4 e no bard e simplesmente não consigo, fico me perguntando se o problema está no código ou na própria geração da cripto por dentro do mercado pago.
O Mais próximo que cheguei está abaixo.
<?php
$raw_post_data = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_SIGNATURE'];
// Substitua 'SUA_CHAVE_PRIVADA' pela sua chave privada real do Mercado Pago
$private_key = 'SUA_CHAVE_PRIVADA';
// Verifica a assinatura
if (verify_signature($raw_post_data, $signature, $private_key)) {
// A assinatura é válida, salva os dados brutos em um arquivo válido
saveToLogFile('valid', $raw_post_data);
echo "Assinatura válida!";
} else {
// A assinatura não é válida, salva os dados brutos em um arquivo inválido
saveToLogFile('invalid', $raw_post_data);
echo "Assinatura inválida!";
}
function verify_signature($data, $received_signature, $private_key)
{
$calculated_signature = hash_hmac('sha256', $data, $private_key); // false para obter a saída como string hexadecimal
// Extrai apenas a assinatura real da string recebida
$parts = explode(',', $received_signature);
$real_signature = '';
foreach ($parts as $part) {
if (strpos($part, 'v1=') === 0) {
$real_signature = substr($part, 3); // Remove 'v1='
break;
}
}
// Obtém os dados da signature para log
$serverData = $received_signature;
// Define o caminho do arquivo de texto
$filePath = 'last_webhook.txt';
// Abre o arquivo em modo de escrita
$fileHandle = fopen($filePath, 'w');
// Use arrays para mensagens de debug
$sign_txt = [
"Debugging:",
"Comprimento da Assinatura Recebida: " . strlen($real_signature),
"Comprimento da Assinatura Calculada: " . strlen($calculated_signature),
"Assinatura Recebida :[" . $real_signature . "]",
"Assinatura calculada:[" . $calculated_signature . "]",
"==================================",
];
// Escreve os dados no arquivo
fwrite($fileHandle, "Dados do último webhook:" . PHP_EOL . $serverData . PHP_EOL . implode(PHP_EOL, $sign_txt));
// Fecha o arquivo
fclose($fileHandle);
// Comparação segura para evitar ataques de tempo
// Comparação segura para evitar ataques de tempo
return hash_equals($calculated_signature, $real_signature);
}
function saveToLogFile($type, $data)
{
$filename = $type . '_log.txt';
file_put_contents($filename, $data . PHP_EOL, FILE_APPEND);
}
?>
Meu retorno do last_webhook.txt está saindo assim:
Dados do último webhook:
ts=1706190968981,v1=eff8fd604b68281e1618b0754ab9cfd649140050f9f1a55e214faa2aa435d67f
Debugging:
Comprimento da Assinatura Recebida: 64
Comprimento da Assinatura Calculada: 64
Assinatura Recebida : eff8fd604b68281e1618b0754ab9cfd649140050f9f1a55e214faa2aa435d67f
Assinatura calculada : 08f915dc0ed1cdb0e00b7f7c97880dae51727e4381bc97ba96c2ba3af971376f
Na fonte está a documentação do site