首页 > 解决方案 > 为什么条带 webhook 会出现 400 错误?

问题描述

尝试测试 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());

标签: node.jsexpressstripe-paymentswebhooks

解决方案


推荐阅读