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
相关产品推荐
相关产品推荐

