我刚刚复制了 Stripe 官方文档中有关基本 webhook 使用的代码,但它一直向我抛出相同的错误。你可以看到我唯一改变的是,我没有使用express.json()中间件,而是使用了rawBody.json(),我这样做是因为在文档中它说“如果你使用的是Express v4 - v4.16,你需要使用 body-parser(而不是express)来检索请求正文”。复制代码可以在文档中找到,但我将其附在此处,以防万一我错过了某些内容。错误是 400 Bad 请求,描述为:“Webhook 错误:Webhook 负载必须以字符串或缓冲区形式提供”
dotenv.config()
const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY)
const app = express()
app.use(morgan("dev"))
app.use(
cors({
origin: process.env.ORIGIN,
credentials: true,
optionsSuccessStatus: 200,
})
)
app.post("/webhook", bodyParser.json(), (request, response) => {
const payload = request.body
const sig = request.headers["stripe-signature"]
let event
try {
event = stripe.webhooks.constructEvent(
payload,
sig,
process.env.STRIPE_ENDPOINT_SECRET
)
if (event.type === "checkout.session.completed") {
console.log("Session completed successfully")
}
} catch (err) {
return response.status(400).send(`Webhook Error: ${err.message}`)
}
response.status(200).end()
})
app.use(cookieParser())
app.use(express.json({ limit: "50mb" }))
//Rest of endpoints
您可以尝试使用
express.raw({ type: 'application/json' })
。
const express = require('express');
app.post("/webhook", express.raw({ type: 'application/json' }), (request, response) => {
const payload = request.body
const sig = request.headers["stripe-signature"]
let event
try {
event = stripe.webhooks.constructEvent(
payload,
sig,
process.env.STRIPE_ENDPOINT_SECRET
)
if (event.type === "checkout.session.completed") {
console.log("Session completed successfully")
}
} catch (err) {
return response.status(400).send(`Webhook Error: ${err.message}`)
}
response.status(200).end()
})
这是一个 github 在 stripe 上使用 webhooks 的示例