Javascript GCP:条带webhook错误:未找到与负载的预期签名匹配的签名

Javascript GCP:条带webhook错误:未找到与负载的预期签名匹配的签名,javascript,node.js,express,google-cloud-platform,stripe-payments,Javascript,Node.js,Express,Google Cloud Platform,Stripe Payments,条纹版本:“8.107.0” 每当我在GCP上运行我的webhook时,我总是收到一个条带webhook验证错误。正如下面的代码片段所提到的,我已经尝试在签名中使用raw body,以及其他StackOverflow答案所提到的传递req.rawBody的方法 奇怪的是,这个错误似乎是在我部署到GCP时抛出的,而不是在本地运行时抛出的。我尝试手动创建签名(),结果是一样的:本地签名匹配,而在GCP上则不匹配 我们的服务器托管在GCP GKE上,我们通过Nginx反向代理向服务器提供请求。其他堆栈

条纹版本:“8.107.0”

每当我在GCP上运行我的webhook时,我总是收到一个条带webhook验证错误。正如下面的代码片段所提到的,我已经尝试在签名中使用raw body,以及其他StackOverflow答案所提到的传递req.rawBody的方法

奇怪的是,这个错误似乎是在我部署到GCP时抛出的,而不是在本地运行时抛出的。我尝试手动创建签名(),结果是一样的:本地签名匹配,而在GCP上则不匹配

我们的服务器托管在GCP GKE上,我们通过Nginx反向代理向服务器提供请求。其他堆栈溢出解决方案提到了谷歌云函数和Lambda。据我所知,我们不在GCP上解析请求

我确实使用bodyParser.json(),但这是在该端点之后设置的。以下是我尝试创建/使用rawBody的方法:

app.use(express.json({verify:(req,res,buf)=>{req.rawBody=buf}}));
bodyParser.json({
验证:(请求:任意、res、buf)=>{
req.rawBody=buf.toString();
},
}),
event=stripe.webhooks.constructEvent(req.rawBody,sig,webhookSecret);
我的代码基于下面的条带示例:

//条带需要原始主体来构造事件
app.post('/webhook',bodyParser.raw({type:'application/json'}),(req,res)=>{
const sig=req.headers['stripe-signature'];
让事件发生;
试一试{
event=stripe.webhooks.constructEvent(req.body,sig,webhookSecret);
}捕捉(错误){
//出现错误时,记录并返回错误消息
console.log(`❌ 错误消息:${err.message}`);
返回res.status(400.send(`Webhook Error:${err.message}`);
}
//成功构造事件
console.log('✅ 成功:',event.id);
//返回响应以确认事件的接收
res.json({received:true});
});

非常感谢您的帮助。

问题出在我们的一个安装文件上,其中基本上有一个空格或\n字符被添加到了我们的webhookSecret中

我刚刚解决了一个类似的问题,简而言之,我是这样解决的:

 // main.js
 server.use('*', cors());
-server.use(express.json()); // default on my boilerplate
+server.use(bodyParser.raw({ type: 'application/json' })); // use body-parser instead
 server.use(morgan('tiny'));

然后,在处理Webhook之前,请确保不要重写
bodyParser.raw({type:'application/json'})
,也不要重写应用程序中的任何其他地方。

有趣!很高兴听到你明白了。重要的是不要修改原始身体,这样才有意义。知道事情是怎么发生的吗?