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

使用Firebase Functions Node.js监听Stripe Webhooks的技术实现求助

排查Firebase Functions中Stripe Webhook实现的问题

我来帮你梳理下这段代码里的几个关键问题,以及对应的修正方案:

1. Stripe初始化的语法错误

你代码里的new stripeM("test_token")是明显笔误,首先要正确导入Stripe库,并且必须指定API版本(Stripe从2020-08-27版本开始要求显式声明):

import Stripe from 'stripe';
// 建议用环境变量存密钥,不要硬写在代码里
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, {
  apiVersion: '2024-06-20', // 用Stripe当前最新的API版本
});

2. Body Parser配置不够精准

Stripe Webhook要求接收未解析的原始JSON body,你用bodyParser.raw({ type: '*/*' })会匹配所有请求类型,可能和Firebase Functions默认的解析逻辑冲突。应该明确指定Stripe发送的Content-Type:

// 替换原来的bodyParser配置
app.use(bodyParser.raw({ type: 'application/json' }));

注意:Firebase Functions的onRequest触发器搭配express时,不要启用其他body解析中间件(比如express.json()),否则会破坏原始body,直接导致签名验证失败。

3. 签名验证的边界处理缺失

  • 首先要检查stripe-signature请求头是否存在,不存在直接返回400;
  • 其次你的constructEvent调用不完整,需要补充完整的错误捕获逻辑:
app.post('*', (req, res) => {
  const sig = req.headers['stripe-signature'];
  // 先校验签名头是否存在
  if (!sig) {
    return res.status(400).send('Missing Stripe signature header');
  }

  let event;
  try {
    event = stripe.webhooks.constructEvent(
      req.body,
      sig,
      stripeWHEndpointSecret
    );
  } catch (err) {
    // 签名验证失败时返回400,Stripe会停止重试请求
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }

  // 处理具体的事件类型,比如支付成功事件
  switch (event.type) {
    case 'payment_intent.succeeded':
      const paymentIntent = event.data.object;
      console.log('PaymentIntent succeeded:', paymentIntent);
      // 在这里添加你的业务逻辑
      break;
    // 可以继续添加其他需要处理的事件类型
    default:
      console.log(`Unhandled event type ${event.type}`);
  }

  // 必须返回200给Stripe,否则它会重复发送请求
  res.json({ received: true });
});

4. 缺少Firebase Function导出逻辑

你写了express app,但没有把它导出为Firebase HTTPS函数,部署后无法被Stripe调用:

import * as functions from 'firebase-functions';

// 导出webhook函数,部署后的访问地址格式:https://<region>-<project-id>.cloudfunctions.net/stripeWebhook
export const stripeWebhook = functions.https.onRequest(app);

5. 环境变量的最佳实践

不要在代码里硬写Stripe的Secret Key和Webhook密钥,应该用Firebase Functions的环境变量配置:

# 在终端运行以下命令设置环境变量
firebase functions:config:set stripe.secret_key="你的Stripe密钥" stripe.webhook_secret="你的Webhook密钥"

然后在代码里读取:

const stripe = new Stripe(functions.config().stripe.secret_key, { apiVersion: '2024-06-20' });
const stripeWHEndpointSecret = functions.config().stripe.webhook_secret;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:27:26