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

Stripe Webhook无法记录事件数据,但Stripe控制台可见该数据

Stripe Webhook无法捕获事件数据排查与修复

问题概况

  • Stripe控制台可正常查看事件数据,但Webhook代码无法输出事件内容
  • 无错误日志输出,连响应状态码都未返回
  • 怀疑是否因测试模式导致该问题

代码问题分析

  1. React Hooks误用:useUser()是Clerk的React Hooks,仅能在React组件中调用,Next.js API路由属于Node.js后端环境,直接调用会触发未捕获异常,导致代码执行中断,后续日志和响应逻辑都无法运行。
  2. 无响应的提前返回:if (!sig || !webhookSecret) return;分支直接return,未向Stripe返回任何响应,Stripe会重复重试请求,但代码未输出该场景的日志,无法定位问题。
  3. 测试模式不影响事件接收:测试模式下Stripe Webhook功能完全正常,问题与测试模式无关。

修复步骤

1. 移除API路由中的React Hooks调用

API路由无法直接获取前端Clerk用户会话,若需关联用户,可通过请求头中的认证令牌解析用户信息,或从Stripe事件的metadata字段关联用户ID。

2. 补全异常分支的日志与响应

if (!sig || !webhookSecret) {
  console.log("Webhook缺失必要信息:stripe-signature或webhook密钥未配置");
  return res.status(400).send("Missing required headers or secrets");
}

3. 添加全局异常捕获

避免未处理的异常导致代码静默中断:

export default async function handler(req, res) {
  try {
    // 原代码逻辑
  } catch (err) {
    console.error("Webhook处理异常:", err);
    return res.status(500).send("Internal server error");
  }
}

4. 验证环境变量配置

确保STRIPE_SECRET_KEY和STRIPE_WEBHOOK_SECRET使用测试模式下的对应密钥,且已正确配置在Next.js环境中。

修复后的完整代码

import Stripe from "stripe";
import { buffer } from "micro";

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

export default async function handler(req, res) {
  try {
    const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
    if (req.method === "POST") {
      console.log("收到Stripe Webhook请求");
      const buf = await buffer(req);
      const sig = req.headers["stripe-signature"];
      const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET;

      let event;

      if (!sig || !webhookSecret) {
        console.log("Webhook缺失必要信息:stripe-signature或webhook密钥未配置");
        return res.status(400).send("Missing required headers or secrets");
      }

      try {
        event = stripe.webhooks.constructEvent(buf, sig, webhookSecret);
      } catch (error) {
        console.log(`Webhook签名验证错误:${error.message}`);
        return res.status(400).send(`Webhook error: ${error.message}`);
      }
      
      console.log("捕获到Stripe事件:", event);
      // 这里可以添加事件处理逻辑,比如根据event.type处理不同事件

      res.status(200).send("Webhook received successfully");
    } else {
      res.setHeader("Allow", "POST");
      res.status(405).send("Method Not Allowed");
    }
  } catch (err) {
    console.error("Webhook处理异常:", err);
    return res.status(500).send("Internal server error");
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:30:29