Comunidade

Ask a Question
Back to All

Problemas ao validar os weebhooks usando hashs

Boa tarde, eu estou testando validar um webhook no meu servidor usando node com nestjs seguindo a documentação oficial mas acontece que mesmo eu tentando de várias formas diferentes não funciona pois sempre o hash gerado do corpo da requisição é diferente do hash enviado no headers do webhook. No momento meu código está assim, tem algum erro que eu estou cometendo:

import { Controller, Post, Headers, Req } from '@nestjs/common';
import { createHash } from 'node:crypto';

@Controller()
export class AppController {
  @Post('webhook-test')
  webhook(@Req() request: any, @Headers() headers) {
    const x_authenticity_token = headers['x-authenticity-token'];

    // chama a função que vai comparar os hash
    const webHookIsValid = this.validateWebhookNotification(
      request.body,
      x_authenticity_token,
    );

    console.log(webHookIsValid); // ERRO ->  sempre loga: false
  }

  private validateWebhookNotification(
    body: any,
    x_authenticity_token: string,
  ): boolean {
    const bodyAsString = JSON.stringify(body);

    const signature = createHash('sha256')
      .update(
        Buffer.from(
          process.env.PAGSEGURO_AUTH_TOKEN + '-' + bodyAsString,
          'utf8',
        ),
      )
      .digest('hex');

    return signature === x-authenticity-token;
  }
}

Observações: o PAGSEGURO_AUTH_TOKEN é o token que foi gerado na minha sandbox de teste e ele está sendo importado normalmente. A requisição do webhook feito pelo PagSeguro pro meu servidor local também está funcionando e como ferramenta de tunelamento da requisição eu estou usando ngrok pra isso.

Eu vi que tem outra forma de resolver usando a url de notifications segundo a doc oficial mas não optei por paracer que vocês estão depreciando esse método. Estou correto disto ou eu pode usar como alternativa?

Desde já obrigado.

© 1996- Todos os direitos reservados.

PAGSEGURO INTERNET INSTITUIÇÃO DE PAGAMENTO S/A - CNPJ/MF 08.561.701/0001-01

Av. Brigadeiro Faria Lima, 1.384, São Paulo - SP - CEP 01451-001