如何使用无服务器函数获取原始请求体?

9

我正在从Express迁移到Zeit Now的无服务器函数。

Stripe网络钩子文档要求原始请求体,当使用Express时,我可以通过bodyParser获得它,但无服务器函数如何工作?我如何接收字符串格式的主体以验证stripe签名?

支持团队将我重定向到此文档链接,我感到困惑,据我所知,我必须将text/plain传递到请求头中,但是我无法控制它,因为Stripe发送webhook。

export default async (req, res) => {
    let sig = req.headers["stripe-signature"];
    let rawBody = req.body;
    let event = stripe.webhooks.constructEvent(rawBody, sig, process.env.STRIPE_SIGNING_SECRET);
    ...
}

在我的函数中,我接收到一个对象作为req.body,我该如何解决这个问题?
1个回答

6
以下代码片段适用于我(从此来源进行了修改):
const endpointSecret = process.env.STRIPE_SIGNING_SECRET;

export default async (req, res) => {
  const sig = req.headers['stripe-signature'];
  let event;
  let bodyChunks = [];

  req
    .on('data', chunk => bodyChunks.push(chunk))
    .on('end', async () => {
      const rawBody = Buffer.concat(bodyChunks).toString('utf8');

      try {
        event = stripe.webhooks.constructEvent(rawBody, sig, endpointSecret);
      } catch (err) {
        return res.status(400).send(`Webhook Error: ${err.message}`);
      }

      // Handle event here
      ...

      // Return a response to acknowledge receipt of the event
      res.json({ received: true });
    });
};

export const config = {
  api: {
    bodyParser: false,
  },
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接