# Verificador de firmas

> Pega el cuerpo de una petición o de un webhook. Esta página calcula la firma paso a paso como lo hace Cryptomus, compara cada paso con el tuyo y marca la primera diferencia. Todo se ejecuta en tu navegador: esta página no puede hacer ninguna petición de red, así que tu API key nunca sale de tu ordenador.
>
> HTML: https://blockwallets.io/docs/sign?lang=es · English: https://blockwallets.io/docs/sign.md?lang=en

## Firma de la petición (tú llamas a nuestra API)

1. El texto firmado es el cuerpo exacto de la petición que envías, byte a byte (espacios, saltos de línea y escapes incluidos).
2. base64 de sus bytes UTF-8.
3. sign = md5(paso 2 + API key), enviado en la cabecera `sign`; la cabecera `merchant` lleva el UUID del merchant.

Si la firma es incorrecta, la API devuelve 401, y `debug.body_base64` de la respuesta es el paso 2 calculado con el cuerpo que recibimos, listo para compararlo con el tuyo.

## Firma del webhook (nosotros llamamos a tu URL de webhook)

1. Quita el campo `sign` y vuelve a codificar el resto como lo hace `json_encode` de PHP: compacto, `/` escapada como `\/`, caracteres no ASCII sin escapar.
2. base64 de los bytes UTF-8 del paso 1.
3. md5(paso 2 + API key) debe ser igual a `sign`. Usa la API key del mismo modo (Live / Test) que el merchant.

## Causas habituales

- La API key del otro modo, o una que ha sido rotada.
- El framework volvió a serializar el cuerpo (formato legible, orden de claves, formato de números); verifica con el cuerpo bruto que recibiste.
- No escapar `/` como `\/` al volver a codificar un webhook.

El verificador se ejecuta por completo en tu navegador y la página no puede hacer peticiones de red, así que tu API key nunca sale de tu ordenador. Ejemplos de código de verificación: https://blockwallets.io/docs/cryptomus?lang=es#verify
