Stripe webhook error: No signatures found matching the expected signature for payload
Stripe webhook error: No signatures found matching the expected signature for payload
我正在使用 Stripe 提供的代码来测试 webhook。 Stripe 机密和端点机密已经过三重检查。
条纹版本:6.19
正文解析器:1.19
当我在 Stripe 仪表板上测试 webhook 时,我得到了结果:(测试 webhook 错误:400)找不到与有效负载的预期签名相匹配的签名。您是否传递了从 Stripe 收到的原始请求正文?
如有任何帮助,我们将不胜感激。
var bodyParser - require('body-parser);
// Using Express
const app = require('express')();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
const stripe = require('stripe')('sk_test_VPw...');
// Find your endpoint's secret in your Dashboard's webhook settings
const endpointSecret = 'whsec_...';
// Use body-parser to retrieve the raw body as a buffer
const bodyParser = require('body-parser');
// Match the raw body to content type application/json
app.post('/webhook', bodyParser.raw({type: 'application/json'}), (request, response) => {
const sig = request.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret); //NOT WORKING!
} catch (err) {
return response.status(400).send(`Webhook Error: ${err.message}`);
}
// Handle the checkout.session.completed event
if (event.type === 'checkout.session.completed') {
const session = event.data.object;
// Fulfill the purchase...
handleCheckoutSession(session);
}
// Return a response to acknowledge receipt of the event
response.json({received: true});
});
通常这是因为您在检查签名之前解析或修改了原始请求字符串(因此签名是根据修改后的字符串计算的,而不是 Stripe 发送的确切字符串)。在这种情况下,看起来 JSON express 中间件正在这样做:
app.use(express.json());
.
Stripe an example 在 webhook 端点上使用原始 bodyParser 中间件,以便您的代码获取所需的原始字符串:
// Use JSON parser for all non-webhook routes
app.use((req, res, next) => {
if (req.originalUrl === '/webhook') {
next();
} else {
express.json()(req, res, next);
}
});
// Stripe requires the raw body to construct the event
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
const sig = req.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
} catch (err) {
// On error, log and return the error message
console.log(`❌ Error message: ${err.message}`);
return res.status(400).send(`Webhook Error: ${err.message}`);
}
// Successfully constructed event
console.log('✅ Success:', event.id);
// Return a response to acknowledge receipt of the event
res.json({received: true});
});
如何在 Express 中同时获取已解析的正文和原始正文:
app.use(bodyParser.json({
verify: (req, res, buf) => {
req.rawBody = buf
}
}))
对于那些使用 NextJS 的人。这是我在 Reddit 上遇到的一个解决方案@
u/SiMFiCysed
https://www.reddit.com/user/SiMFiCysed/
一个衬里加上没有弃用的 bodyParser。确保在通用解析器 aka express.json().
之前定义端点的解析器
app.use('/stripe/webhook', express.raw({type: "*/*"}))
app.use(express.json())
除一切外,检查whsec_
我正在使用 Stripe 提供的代码来测试 webhook。 Stripe 机密和端点机密已经过三重检查。
条纹版本:6.19 正文解析器:1.19
当我在 Stripe 仪表板上测试 webhook 时,我得到了结果:(测试 webhook 错误:400)找不到与有效负载的预期签名相匹配的签名。您是否传递了从 Stripe 收到的原始请求正文?
如有任何帮助,我们将不胜感激。
var bodyParser - require('body-parser);
// Using Express
const app = require('express')();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// Set your secret key: remember to change this to your live secret key in production
// See your keys here: https://dashboard.stripe.com/account/apikeys
const stripe = require('stripe')('sk_test_VPw...');
// Find your endpoint's secret in your Dashboard's webhook settings
const endpointSecret = 'whsec_...';
// Use body-parser to retrieve the raw body as a buffer
const bodyParser = require('body-parser');
// Match the raw body to content type application/json
app.post('/webhook', bodyParser.raw({type: 'application/json'}), (request, response) => {
const sig = request.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(request.body, sig, endpointSecret); //NOT WORKING!
} catch (err) {
return response.status(400).send(`Webhook Error: ${err.message}`);
}
// Handle the checkout.session.completed event
if (event.type === 'checkout.session.completed') {
const session = event.data.object;
// Fulfill the purchase...
handleCheckoutSession(session);
}
// Return a response to acknowledge receipt of the event
response.json({received: true});
});
通常这是因为您在检查签名之前解析或修改了原始请求字符串(因此签名是根据修改后的字符串计算的,而不是 Stripe 发送的确切字符串)。在这种情况下,看起来 JSON express 中间件正在这样做:
app.use(express.json());
.
Stripe an example 在 webhook 端点上使用原始 bodyParser 中间件,以便您的代码获取所需的原始字符串:
// Use JSON parser for all non-webhook routes
app.use((req, res, next) => {
if (req.originalUrl === '/webhook') {
next();
} else {
express.json()(req, res, next);
}
});
// Stripe requires the raw body to construct the event
app.post('/webhook', express.raw({type: 'application/json'}), (req, res) => {
const sig = req.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
} catch (err) {
// On error, log and return the error message
console.log(`❌ Error message: ${err.message}`);
return res.status(400).send(`Webhook Error: ${err.message}`);
}
// Successfully constructed event
console.log('✅ Success:', event.id);
// Return a response to acknowledge receipt of the event
res.json({received: true});
});
如何在 Express 中同时获取已解析的正文和原始正文:
app.use(bodyParser.json({
verify: (req, res, buf) => {
req.rawBody = buf
}
}))
对于那些使用 NextJS 的人。这是我在 Reddit 上遇到的一个解决方案@ u/SiMFiCysed https://www.reddit.com/user/SiMFiCysed/
一个衬里加上没有弃用的 bodyParser。确保在通用解析器 aka express.json().
之前定义端点的解析器app.use('/stripe/webhook', express.raw({type: "*/*"}))
app.use(express.json())
除一切外,检查whsec_