Executando verificação de segurança...
1

{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

Carregando publicação patrocinada...
1