> ## Documentation Index
> Fetch the complete documentation index at: https://docs.piriod.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Verificar firma

> Confirms que las solicitudes de webhook son auténticas calculando una firma HMAC-SHA256 con tu secreto de endpoint y comparándola con el encabezado x-piriod-signature.

Piriod firma cada solicitud de webhook que envía, lo que permite confirmar que la solicitud es auténtica y no ha sido falsificada por un tercero. La verificación es opcional, pero se recomienda encarecidamente para los endpoints de producción.

## Obtén tu secreto de webhook

Cada webhook registrado tiene su propio secreto único.

<Steps>
  <Step title="Abre tu webhook">
    Ve a **Configuración de la organización → Webhooks** y haz clic en el webhook que deseas verificar.
  </Step>

  <Step title="Copia el secreto">
    Busca la sección **Secreto** y haz clic en **Copiar secreto**. Guarda este valor de forma segura en tu servidor; nunca lo expongas en el código del cliente.
  </Step>
</Steps>

<Note>
  Cada webhook tiene una clave secreta diferente. Si utilizas varios webhooks, recupera y almacena una clave secreta para cada uno por separado.
</Note>

## Verificar la firma

Piriod incluye la firma en el encabezado HTTP `x-piriod-signature` de cada solicitud. Para verificarla, calcula un HMAC-SHA256 sobre los valores del payload de forma concatenada utilizando tu secreto de webhook y, a continuación, compara el resultado con el valor del encabezado.

```python theme={null}
import hashlib
import hmac

from flask import Flask, request, abort

app = Flask(__name__)

WH_SECRET = 'whsecret_g9En7rfNBZBYFr968pLqPDQ6O302Q1DAI3TXi3aky1eAcUqgJg3EjBP'

@app.route('/webhooks', methods=['POST'])
def webhooks():
    payload = request.json
    piriod_signature = request.headers.get('x-piriod-signature')
    if not _signature_is_valid(payload, piriod_signature):
        abort(400)
    if not payload:
        abort(400)
    if payload.get('event') == 'payment.created':
        # handle the payment.created event
        pass
    return '', 200

def _signature_is_valid(payload, piriod_signature):
    signature = hmac.new(
        WH_SECRET.encode(),
        msg=(''.join(map(str, payload.values()))).encode('UTF-8'),
        digestmod=hashlib.sha256
    ).hexdigest()
    return signature == piriod_signature

if __name__ == '__main__':
    app.run(debug=True)
```

<Warning>
  Si la verificación de la firma falla, devuelve un código de estado `400` y no proceses el evento. Esto protege tu aplicación de solicitudes falsificadas.
</Warning>
