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

Stripe Webhook报错:Payload需为字符串或Buffer实例的问题求助

问题解决方法

核心原因

你的全局日志中间件在webhook路由的express.raw中间件之前执行,且应用中大概率存在全局的express.json()中间件,已经把Stripe发送的原始JSON payload解析成了JavaScript对象。Stripe的webhook签名验证必须使用原始未解析的请求体(Buffer或字符串),因此触发了签名验证失败的报错。

具体修复步骤

  1. 调整路由注册顺序
    将webhook的路由注册代码,放在全局的express.json()和日志中间件之前,确保express.raw优先处理webhook请求:

    // 先注册webhook路由
    routerV2.post('/webhook', express.raw({ type: 'application/json' }), handleWebhook);
    gsrApp.use(routerV2);
    
    // 再注册全局中间件
    gsrApp.use(express.json());
    gsrApp.use((req, res, next) => {
      console.log(`Incoming request size: ${JSON.stringify(req.body).length} bytes`);
      next();
    });
    
  2. 修正全局日志中间件
    webhook请求的req.body是Buffer类型,直接序列化会出问题,添加路径判断跳过webhook请求的日志处理:

    gsrApp.use((req, res, next) => {
      // 根据实际webhook路径调整判断条件
      if (req.path !== '/webhook') {
        console.log(`Incoming request size: ${JSON.stringify(req.body).length} bytes`);
      }
      next();
    });
    
  3. 替换无效的alert代码
    Node.js环境不支持浏览器的alert(),替换为后端日志输出:

    if (session.payment_status === 'paid') {
      console.log("hii"); // 替换alert为console.log
      console.log('PaymentIntent was successful!');
      const updatedValues = JSON.parse(session.metadata.updatedValues);
      console.log("updatedValues is", updatedValues);
    }
    

验证方式

使用Stripe CLI发送测试webhook事件,或在Stripe后台配置测试触发,确认签名验证通过且日志正常输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:51:15