How to Verify Razorpay Webhook Signatures (Why It's Not the Payment Signature)

Learn the correct way to verify Razorpay webhook signatures. Avoid the common mistake of mixing with payment signature. Step-by-step guide.

lunes, 27 de julio de 2026 • 6 min read • Q2BSTUDIO Team

Diferencia entre firma de webhook y firma de pago en Razorpay

Integrar un procesador de pagos como Razorpay en una aplicaciu00f3n moderna parece sencillo: se recibe un webhook, se verifica una firma y se actualiza el estado del pedido. Sin embargo, la realidad es que muchos desarrolladores tropiezan con un detalle sutil que genera fallos silenciosos: Razorpay utiliza dos firmas diferentes que, aunque parecen idu00e9nticas (HMAC-SHA256 en hexadecimal), se calculan con claves y datos distintos. Confundirlas es fu00e1cil y provoca que integraciones que lucen perfectas en el cu00f3digo terminen rechazando eventos legu00edtimos. En este artu00edculo vamos a desglosar cu00f3mo verificar correctamente la firma de un webhook de Razorpay, por quu00e9 no es lo mismo que la firma de pago que retorna el checkout, y cu00f3mo evitar los errores mu00e1s comunes. Ademu00e1s, veremos cu00f3mo en Q2BSTUDIO abordamos este tipo de desafu00edos tu00e9cnicos en proyectos de aplicaciones a medida, combinando buenas pru00e1cticas de ciberseguridad, cloud y automatizaciu00f3n.

Lo primero que hay que entender es que Razorpay expone dos mecanismos de firma independientes. El primero se usa en los webhooks: cuando Razorpay envu00eda una notificaciu00f3n a tu servidor (por ejemplo, un evento u201cpayment.capturedu201d), incluye un encabezado X-Razorpay-Signature. Esa firma se calcula usando HMAC-SHA256 con tu webhook secret (la clave que configuras en el dashboard de Razorpay) y el cuerpo crudo de la peticiu00f3n (raw bytes, no JSON parseado). El segundo mecanismo aparece en el flujo de checkout: cuando el frontend redirige al usuario a tu success handler, recibe tres paru00e1metros: razorpay_order_id, razorpay_payment_id y razorpay_signature. Esta firma se genera con tu API key secret y con el mensaje order_id + '|' + payment_id. Son dos mundos diferentes, pero el hecho de que ambas salidas sean cadenas hexadecimales de 64 caracteres induce a confusiu00f3n.

El error mu00e1s habitual es intentar verificar un webhook usando la clave secreta de la API, o al revu00e9s: usar el webhook secret para validar la firma del checkout. En ambos casos la comparaciu00f3n falla porque las claves no coinciden. Otro error clu00e1sico es parsear el cuerpo del webhook con un middleware JSON antes de verificar la firma. Al hacer eso, el string que se obtiene tras re-serializar el objeto ya no es igual al raw body original; Razorpay firmu00f3 los bytes exactos que enviu00f3, cualquier cambio en espacios o en el orden de las propiedades invalida la firma. La soluciu00f3n es capturar el cuerpo en crudo (como un Buffer en Node.js), verificar la firma sobre ese buffer, y solo despuu00e9s parsear el JSON.

Veamos un ejemplo pru00e1ctico en Node.js con Express. Para el webhook, debemos configurar la ruta con express.raw({ type: '*/*' }) para obtener el cuerpo sin procesar. Luego, con el mu00f3dulo crypto, calculamos el HMAC usando el webhook secret y el raw body, lo convertimos a hex y lo comparamos con el valor del header. Es crucial usar crypto.timingSafeEqual en lugar de una comparaciu00f3n con === para evitar ataques de tiempo. Ademu00e1s, hay que proteger la comparaciu00f3n contra diferencias de longitud. Solo si la firma coincide, parseamos el JSON y procesamos el evento. Este patru00f3n es vu00e1lido para Stripe, Paddle y otros proveedores, pero en Razorpay la trampa es au00fan mayor por la existencia de la segunda firma.

Para la verificaciu00f3n del checkout, el procedimiento es similar pero con datos distintos: concatenamos razorpay_order_id y razorpay_payment_id separados por una tuberu00eda (u201c|u201d), usamos como clave el API key secret (no el webhook secret), calculamos el HMAC-SHA256 y lo comparamos con el campo razorpay_signature. En este caso no hay problema de raw body porque los datos ya vienen como strings simples. Sin embargo, es comu00fan que los equipos de desarrollo reutilicen el mismo fragmento de cu00f3digo para ambas verificaciones y solamente cambien la clave, ignorando que el mensaje tambiu00e9n es diferente. El resultado es una integraciu00f3n que parece funcionar en pruebas pero que falla en producciu00f3n.

Desde la perspectiva de una empresa de desarrollo de software como Q2BSTUDIO, cuando abordamos proyectos que requieren integraciu00f3n con pasarelas de pago, siempre aplicamos un enfoque metu00f3dico. Documentamos claramente los secretos utilizados y separamos la lu00f3gica de verificaciu00f3n de webhooks de la de checkout. Ademu00e1s, recomendamos desplegar los endpoints de webhook en infraestructura cloud (AWS o Azure) para garantizar alta disponibilidad y escalabilidad, especialmente cuando se manejan volu00famenes elevados de transacciones. En ciberseguridad, protegiendo las claves secretas mediante gestores de secretos y rotaciu00f3n periu00f3dica, evitamos fugas que comprometan la validaciu00f3n de firmas.

Otro aspecto que a menudo se pasa por alto es la gestiu00f3n de eventos perdidos. Una firma vu00e1lida solo demuestra que el webhook proviene de Razorpay, pero no garantiza que se haya procesado correctamente. Si el servidor se cae durante un despliegue o se queda sin recursos justo cuando llega un evento cru00edtico (como un pago capturado), ese evento se pierde a menos que Razorpay reintente y tu endpoint estu00e9 disponible. Aquu00ed entran en juego herramientas de colas y reintentos que, combinadas con patrones de procesamiento idempotente, aseguran la entrega. En Q2BSTUDIO hemos diseu00f1ado soluciones de automatizaciu00f3n basadas en agentes IA que monitorizan estos flujos y reencolan eventos fallidos de forma inteligente.

La inteligencia artificial tambiu00e9n puede aplicarse para analizar patrones de firmas invu00e1lidas y detectar posibles ataques o errores de configuraciu00f3n. Por ejemplo, si de repente recibimos muchos webhooks con firma incorrecta, podru00eda indicar que alguien estu00e1 intentando suplantar a Razorpay o que hemos cambiado el secreto sin actualizar el servidor. Un modelo de IA entrenado con datos histu00f3ricos puede generar alertas tempranas y hasta auto-corregir la configuraciu00f3n si se integra con un sistema de orquestaciu00f3n cloud. Del mismo modo, las dashboards de Business Intelligence (Power BI) permiten visualizar el estado de las integraciones, el nu00famero de webhooks exitosos vs fallidos, y el tiempo de respuesta de los endpoints, facilitando la toma de decisiones.

Por u00faltimo, no podemos olvidar que las aplicaciones modernas ya no son monolu00edticas. Muchas veces el backend que recibe los webhooks de Razorpay estu00e1 desplegado en una funciu00f3n serverless en AWS Lambda o Azure Functions. En ese entorno, el manejo del raw body puede ser mu00e1s complejo porque los frameworks suelen parsear automu00e1ticamente el JSON. Es necesario configurar el runtime para que exponga el cuerpo sin procesar (por ejemplo, mediante middlewares personalizados o cambiando el tipo de integraciu00f3n). Aquu00ed es donde contar con un equipo con experiencia en servicios cloud AWS/Azure marca la diferencia, ya que saben cu00f3mo ajustar cada detalle para que la verificaciu00f3n funcione correctamente.

En resumen, verificar las firmas de webhook de Razorpay no es complicado una vez que se entiende que existen dos firmas distintas. La clave estu00e1 en usar el secreto correcto y el mensaje correcto para cada caso, trabajar siempre con el cuerpo crudo en los webhooks, emplear comparaciones constantes en tiempo, y tener un plan para manejar eventos perdidos. En Q2BSTUDIO ayudamos a empresas a construir soluciones robustas que integran pagos, cloud, IA y BI, asegurando que cada transacciu00f3n se procese de forma segura y sin pu00e9rdidas. Si estu00e1s desarrollando una aplicaciu00f3n que necesita este tipo de integraciones, recuerda: no todas las firmas son iguales, y un pequeu00f1o error en la verificaciu00f3n puede costar caro.

A BREAK?

Play for a moment before you go

OUR SERVICES

How we can help you

Do you have a project in mind?

Tell us your vision and we'll turn it into a software solution. Whatever the scope, we make your idea real.