如何用Postman测试Stripe Webhook端点?签名验证失败求助
解决Postman测试Stripe Webhook签名验证失败问题
问题核心
用Stripe CLI测试Webhook端点正常,但Postman手动发送请求时出现签名验证错误,原因是Postman未生成符合Stripe要求的签名,或请求体/头部不符合验证规则。
解决方案
1. 修正代码中的拼写错误
你的代码里环境变量名写错了:STRIP_ENDPOINT_KEY 应该是 STRIPE_ENDPOINT_KEY(少了字母E),这个错误可能导致签名密钥未正确读取,先修正:
const stripeEndpointKey = process.env.STRIPE_ENDPOINT_KEY;
2. 用Stripe CLI生成可直接复用的测试请求
Stripe CLI会自动生成合法的签名和原始请求体,步骤如下:
- 启动监听时,记录终端输出的
webhook signing secret(格式为whsec_xxx),确保它和环境变量STRIPE_ENDPOINT_KEY一致。 - 执行触发命令时添加
--print-request参数,打印完整请求详情:stripe trigger checkout.session.completed --print-request - 复制输出中
Headers里的Stripe-Signature值,以及Body的原始JSON内容。
3. 配置Postman请求
- 请求方法与URL:选择POST,填入你的Webhook端点URL(如
http://localhost:3000/dev/v1/webhook)。 - Headers设置:
- 添加
Content-Type头,值为application/json。 - 添加
Stripe-Signature头,值为刚才从CLI复制的签名字符串。
- 添加
- Body设置:
- 选择
raw格式,类型选JSON。 - 粘贴从CLI复制的原始请求体,不要格式化或修改任何字符(签名验证依赖原始请求体的字节内容,格式化会改变字节导致验证失败)。
- 选择
4. 开发环境临时跳过签名验证(可选)
如果只是快速测试业务逻辑,不想每次都用CLI生成请求,可以在开发环境下跳过签名验证(生产环境必须禁用此逻辑):
let stripeEvent; const stripeEndpointKey = process.env.STRIPE_ENDPOINT_KEY; if (stripeEndpointKey && process.env.NODE_ENV !== 'development') { // 生产环境正常验证签名 const signature = event.headers['Stripe-Signature']; try { stripeEvent = stripe.webhooks.constructEvent( event.rawBody, signature, stripeEndpointKey ); } catch (err) { console.log(`⚠️ Webhook signature verification failed.`, err.message); return { statusCode: 400, body: 'Invalid signature' }; } } else { // 开发环境直接解析请求体 stripeEvent = JSON.parse(event.rawBody.toString()); console.log('Skipping signature verification in development'); }
原因说明
Stripe的签名验证基于三个要素:原始请求体字节、签名密钥、请求头中的Stripe-Signature(包含timestamp和签名)。Postman手动发送请求时,要么未正确生成签名,要么修改了请求体格式(比如美化JSON),导致字节内容和签名不匹配,从而验证失败。而Stripe CLI会严格按照Stripe规则生成请求,因此可以正常通过验证。
内容的提问来源于stack exchange,提问作者mohini Nahate
相关产品推荐
相关产品推荐

