Stripe webhook 无法访问 Express 请求原始正文

问题描述 投票:0回答:1

我刚刚复制了 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
node.js express stripe-payments webhooks
1个回答
0
投票

您可以尝试使用

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 的示例

© www.soinside.com 2019 - 2024. All rights reserved.