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

Stripe webhook对接AWS Lambda+API Gateway签名验证失败如何解决?

Stripe Webhook签名验证失败排查方案

该报错的核心原因是你传入Stripe签名方法的请求内容、签名头或密钥,和Stripe侧生成签名时的参数不匹配,可按以下步骤逐一排查解决:

  • 修正请求头的取值大小写
    AWS API Gateway会自动将所有传入的请求头转换为全小写,你代码中req.headers['Stripe-Signature']无法正确取到值,需要改为小写的key:req.headers['stripe-signature']。
  • 确保传入原始未修改的请求体
    如果你开启了API Gateway的Lambda代理集成,默认会对请求体做Base64编码,或是自动将JSON请求体解析为JS对象,都会导致传入签名方法的内容和Stripe发送的原始内容不一致,需要先解码拿到原始字符串再传入:
    // 放在constructEvent调用前,处理base64编码的请求体
    const rawBody = req.isBase64Encoded ? Buffer.from(req.body, 'base64').toString('utf8') : req.body;
    
    调用constructEvent时第一个参数传入上面得到的rawBody,不要直接传原始的req.body。
  • 校验Webhook密钥的正确性
    确认你配置在Lambda环境变量STRIPE_WEBHOOK_SECRET的值,是Stripe后台对应Webhook条目下whsec_开头的专属签名密钥,不要误用sk_开头的账户API密钥。
  • 关闭API Gateway的请求体自动转换
    进入API Gateway对应接口的「集成请求」设置,关闭所有请求体自动转换、自动解析的配置,确保原始请求体直接透传到Lambda。

修正后的核心代码示例

try {
    // 处理base64编码的body,获取原始请求字符串
    const rawBody = req.isBase64Encoded ? Buffer.from(req.body, 'base64').toString('utf8') : req.body;
    event = stripe.webhooks.constructEvent(
        rawBody,
        req.headers['stripe-signature'], // 改用小写的请求头key
        process.env.STRIPE_WEBHOOK_SECRET
    );
    console.log(event)
} catch (err) {
    // 原有错误处理逻辑不变
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:45:03