# Validando Webhook payload usando HMAC-SHA1 (Depreciado)

> A validação HMAC é o **Primeiro método** para validar webhooks da Woovi.

# Validação HMAC (Depreciado)

## Qual a diferença entre X-OpenPix-Signature (HMAC) e x-webhook-signature?

Existem dois métodos de validação de webhook disponíveis:

| Método | Header | O que valida | Chave utilizada |
|--------|--------|--------------|-----------------|
| **HMAC** | `X-OpenPix-Signature` | Valida que o webhook veio da **sua configuração específica de webhook** | Secret key do seu webhook |
| **x-webhook-signature** | `x-webhook-signature` | Valida que o webhook veio da **Woovi** (valida o remetente) | Chave pública da Woovi |

## Como consultar o Secret Key do HMAC?

Vá até o Menu Administrador e procure por `API/Plugins` e clique no Webhook que você gostaria de consultar o Secret Key do HMAC.

![WebhookDetail](/img/webhook/webhook-hmac.png)

## Como validar o HMAC Signature?

Toda request do Webhook possui o header `X-OpenPix-Signature` que é a assinatura gerada com a **secret key do seu Webhook** e o payload do Webhook.
Ao receber o header você pode validar se o HMAC é válido e dar continuidade no fluxo do Webhook.

Exemplo: `'X-OpenPix-Signature': 'jgR2XF0PKDiAwHP1s+TryvxMySQ='`

## Exemplo de validação

**PHP**

```php
  <?php 
    $headers['X-OpenPix-Signature'] = 'jgR2XF0PKDiAwHP1s+TryvxMySQ='; // vira da chamada do webhook
    $body = '{"data_criacao":"2021-08-10T20:32:14.429Z","evento":"teste_webhook","event":"OPENPIX:CHARGE_COMPLETED"}'; // vira da chamada do webhook

    $secretKeyOnOpenpixPlatform = 'hmac-secret-key'; // secret key da chave de acesso do OpenPix

    $algorithm = 'sha1'; // algoritmo de hash

    $hmac = base64_encode(hash_hmac($algorithm, $body, $secretKeyOnOpenpixPlatform, true));

    if($hmac === $headers['X-OpenPix-Signature']) {
        echo 'Valid HMAC';
    } else {
        echo 'Invalid HMAC';
    }
  ?>

```

**JavaScript**

```jsx

  const createHmac = require('crypto').createHmac;

  const hmacCalculateSignature = (
    key,
    body,
    encoding,
  ) => createHmac('sha1', key).update(body).digest(encoding);

  const hmacVerifySignature = () => {

    const openpixSignatureHeader = 'jgR2XF0PKDiAwHP1s+TryvxMySQ='; // vem da chamada do webhook

    const body = '{"data_criacao":"2021-08-10T20:32:14.429Z","evento":"teste_webhook","event":"OPENPIX:CHARGE_COMPLETED"}'; // vem da chamada do webhook

    const key = 'hmac-secret-key'; // secret key da chave de acesso do OpenPix

    const signature = hmacCalculateSignature(key, body, 'base64');

    if(signature === openpixSignatureHeader) {
      console.log('valid HMAC');
    }
  };

  hmacVerifySignature();
  
```

**cURL**

  ```bash

  echo -n '{"data_criacao":"2021-08-10T20:32:14.429Z","evento":"teste_webhook","event":"OPENPIX:CHARGE_COMPLETED"}' | openssl dgst -sha1 -hmac "hmac-secret-key" -binary | base64

  ```

:::info

O campo `event` enviado junto ao payload do webhook tem seu valor conforme o tipo de evento que você escolheu no momento em que criou o webhook.
Para saber mais sobre os tipos de eventos, acesse a [documentação de eventos](../webhook-events-type.md).

:::

Nesse link temos um exemplo de validação do HMAC usando JavaScript
[WebhookPost](https://github.com/Open-Pix/node-backend-integration/blob/master/src/webhook/webhookPost.ts)
