node.js - 为什么条带 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());
解决方案
推荐阅读
- apache-spark-mllib - PredictionIO:pio 列车因堆栈溢出错误而失败
- javascript - MEAN - 在 Express.JS 路由上对两个不同的 Mongo 集合进行处理
- docker - 如何从 ansible yaml 获取容器 ID 和 IP?
- reactjs - 在反应中用 404 图像替换损坏的图像
- node.js - node.js 中的异步编程排序问题
- php - 输入 if/else 语句时数组或变量丢失值
- ios - 在mapBox ios上显示UserLocation注释
- java - 将 C# 代码转换为 Java
- android - 在单个实体类中使用 GSON 序列化
- xamarin - 如果我尝试以编程方式旋转 iPad 模拟器,它不会旋转