You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中如何在事件处理全程保留并访问请求体?

解决Stripe Webhook请求体无法重复访问的问题

问题根源是NextRequest的请求体是可读流,只能被读取一次,你已经用request.text()读取了请求体,后续再访问request.body自然会失败。解决办法是提前将读取到的payload转换为可用格式并保存,在事件处理环节直接复用这个保存好的数据。

修改后的代码示例:

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST(request: NextRequest) {
  const endpointSecret = process.env.NEXT_WEBHOOK_ENDPOINT_SECRET;
  let data;
  let eventType;
  let parsedBody; // 保存解析后的请求体

  if (endpointSecret) {
    let event;
    const payload = await request.text();
    const sig = request.headers.get("stripe-signature");

    // 提前解析请求体为JSON对象
    try {
      parsedBody = JSON.parse(payload);
    } catch (err) {
      console.error("Failed to parse request payload:", err);
      return NextResponse.json({ error: "Invalid payload" }, { status: 400 });
    }

    try {
      event = stripe.webhooks.constructEvent(payload, sig!, endpointSecret);
      eventType = event.type;
      data = event.data.object;

      switch (event.type) {
        case 'customer.subscription.created':
          updateAPI(event.data.object, parsedBody);
          break;
        case 'customer.subscription.deleted':
          updateAPI(event.data.object, parsedBody);
          break;
      }
    } catch (err) {
      console.error("Webhook verification failed:", err);
      return NextResponse.json({ error: `Webhook Error: ${err.message}` }, { status: 400 });
    }
  }

  return NextResponse.json({ received: true });
}

关键修改点:

  • 新增parsedBody变量,将读取到的payload解析为JSON对象并保存
  • 事件处理时直接传入parsedBody替代request.body
  • 添加了payload解析失败的错误处理,避免后续逻辑出错

内容的提问来源于stack exchange,提问作者Vedha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:36:05