如何使用JavaScript验证Cashfree支付网关的Webhook签名
Cashfree Webhook 签名验证的 JavaScript 实现
核心验证逻辑
根据官方要求,签名验证流程如下:
- 从Webhook请求的Headers中获取
x-webhook-timestamp(时间戳)和x-webhook-signature(签名) - 将时间戳字符串与**原始请求体(未解析的JSON字符串)**拼接,形成待签名字符串
- 使用Cashfree后台配置的Webhook密钥,通过HMAC-SHA256算法生成哈希值
- 对比生成的哈希值与请求头中的签名,一致则验证通过
Node.js 代码示例
以下是基于Express框架的实现(核心逻辑适配其他Node.js框架):
const express = require('express'); const crypto = require('crypto'); const app = express(); // 替换为你在Cashfree后台配置的Webhook密钥 const WEBHOOK_SECRET = '你的Cashfree Webhook密钥'; // 必须用raw模式解析请求体,不能用express.json(),避免破坏原始格式 app.use(express.raw({ type: 'application/json' })); app.post('/cashfree-webhook', (req, res) => { // 从请求头提取验证所需参数 const timestamp = req.headers['x-webhook-timestamp']; const receivedSignature = req.headers['x-webhook-signature']; if (!timestamp || !receivedSignature) { return res.status(400).send('缺少必要的验证头信息'); } try { // 拼接时间戳与原始请求体 const payload = timestamp + req.body.toString(); // 生成HMAC SHA256签名 const generatedSignature = crypto .createHmac('sha256', WEBHOOK_SECRET) .update(payload) .digest('base64'); // 校验签名 if (generatedSignature === receivedSignature) { console.log('Webhook签名验证通过'); // 解析请求体处理业务逻辑(按需) const webhookData = JSON.parse(req.body); // TODO: 编写你的业务处理代码 res.status(200).send('验证通过'); } else { console.log('Webhook签名验证失败'); res.status(403).send('签名验证失败'); } } catch (err) { console.error('签名验证出错:', err); res.status(500).send('服务器内部错误'); } }); app.listen(3000, () => { console.log('服务器运行在3000端口'); });
关键注意事项
- 必须使用原始请求体:提前用
express.json()解析会改变原始字符串的格式(如空格、换行),导致签名生成不一致 - 密钥需保密:不要硬编码密钥,建议用环境变量管理,比如
process.env.CASHFREE_WEBHOOK_SECRET - 建议增加时间戳校验:验证时间戳与当前时间的差值(如5分钟内),防止重放攻击
内容的提问来源于stack exchange,提问作者chaitanya
相关产品推荐
相关产品推荐

