尝试测试Webhook时出现此错误。
Test Webhook error 400
Webhook Error: No signatures found matching the expected signature for payload. Are you passing the raw request body you received from Stripe? https://github.com/stripe/stripe-node#webhook-signing
我一直在搜索,解决方案似乎是删除可能干扰原始请求的所有解析器。但是,我在代码中看不到任何可能干扰原始请求的内容。我所有的中间件,尤其是解析器都位于webhook下方。
条纹版本:7.14.0正文解析器:1.19.0
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mongoose = require('mongoose');
require('./models');
var bcrypt = require('bcryptjs');
var expressSession = require('express-session');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var dotenv = require('dotenv');
dotenv.config();
var User = mongoose.model('User');
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
mongoose.connect('confidential-link', { useNewUrlParser: true, useUnifiedTopology: true });
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// 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('/pay-success', bodyParser.raw({type: 'application/json'}), (request, response) => {
const sig = request.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(request.body, sig, process.env.ENDPOINT_SECRET); // NOT WORKING
} catch (err) {
console.log(request.body);
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...
console.log(session);
User.findOne({
email: session.customer_email
}, function(err, user) {
if (user) {
user.subscriptionActive = true;
user.subscriptionId = session.subscription;
user.customerId = session.customer;
user.save();
}
});
}
// Return a response to acknowledge receipt of the event
response.json({received: true});
});
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(expressSession({
secret: process.env.EXPRESS_SESSION_SECRET
}));
app.use(passport.initialize());
app.use(passport.session());