Node.js集成CoinGate加密支付时回调POST请求req.body为空问题求助
解决Node.js中CoinGate回调req.body为空的问题
以下是几种常见的排查和解决方法:
1. 确保启用了正确的请求体解析中间件
CoinGate的回调请求默认使用application/json格式发送数据,因此在Express应用中必须启用JSON解析中间件,否则req.body会为空:
const express = require('express'); const app = express(); // 关键:启用JSON请求体解析 app.use(express.json()); app.post('/coingate-webhook', (req, res) => { console.log('订单数据:', req.body); res.status(200).send('OK'); });
如果CoinGate发送的是application/x-www-form-urlencoded格式(极少数情况),还需要添加表单解析中间件:
app.use(express.urlencoded({ extended: true }));
2. 检查请求头并验证签名
先打印请求头确认Content-Type是否匹配,同时建议验证CoinGate的签名(确保请求来自官方):
const crypto = require('crypto'); const COINGATE_API_SECRET = '你的CoinGate API密钥'; app.post('/coingate-webhook', express.json(), (req, res) => { // 打印请求头确认Content-Type console.log('请求头:', req.headers['content-type']); // 验证CoinGate签名 const signature = req.headers['coingate-signature']; const payload = JSON.stringify(req.body); const hmac = crypto.createHmac('sha256', COINGATE_API_SECRET) .update(payload) .digest('hex'); if (signature !== hmac) { return res.status(403).send('无效签名'); } // 此时req.body应包含完整订单数据,比如order_id、status等字段 console.log('验证通过的订单数据:', req.body); // 这里可以调用其他API处理订单逻辑 res.status(200).send('OK'); });
3. 排查反向代理导致的请求体丢失
如果你的Node.js应用部署在Nginx等反向代理之后,需要确保代理配置没有丢弃请求体:
location /coingate-webhook { proxy_pass http://你的Node应用地址:端口; proxy_set_header Content-Type $content_type; proxy_pass_request_body on; # 确保传递请求体 proxy_set_header X-Forwarded-For $remote_addr; }
4. 手动读取原始请求体(备选方案)
如果上述方法都无效,可以直接读取原始请求体并解析:
app.post('/coingate-webhook', (req, res) => { let rawBody = ''; req.on('data', (chunk) => { rawBody += chunk.toString(); }); req.on('end', () => { try { // 尝试JSON解析 const orderData = JSON.parse(rawBody); console.log('订单数据:', orderData); } catch (err) { // 解析失败则按表单格式处理 const formData = Object.fromEntries(new URLSearchParams(rawBody)); console.log('订单数据:', formData); } res.status(200).send('OK'); }); });
内容的提问来源于stack exchange,提问作者Somadina
相关产品推荐
相关产品推荐

