如何在Stripe Webhook请求头中获取stripe-signature?云函数下取值为undefined
核心问题根源
你当前的架构完全混淆了两类Stripe请求的边界,手动添加前端请求头的方式永远拿不到合法的stripe-signature字段——这个字段缺失不是请求头配置不全导致的,是请求发起方从根上就错配了。
为什么你永远拿不到合法的stripe-signature
stripe-signature是Stripe官方服务器在主动给你的后端发送Webhook事件通知时,自动附带的HMAC签名请求头,作用是证明这个请求确实由Stripe发出、全程没有被篡改。- 你现在前端的逻辑是:通过
react-stripe-checkout拿到Stripe返回的支付Token后,由你的React应用主动向后端云函数POST支付数据。这个请求是你的前端客户端发起的,不是Stripe服务器发起的,请求头里自然不可能自带Stripe生成的签名。 - 这个签名无法在前端手动构造:它是Stripe用你的Webhook密钥对原始请求体计算的校验值,前端没有密钥也没有权限生成合法签名。就算你在POST请求里手动硬加一个
stripe-signature头,值也是完全无效的,过不了Stripe的校验逻辑。
正确的实现修正方案
你可以根据自己的业务需求二选一,不要把两套流程揉在同一个接口里:
方案1:简单场景下直接同步处理支付(不需要Webhook)
如果你的业务只需要处理简单的即时扣款,完全不需要用Webhook的事件解析逻辑:
- 直接删除后端代码里所有关于读取
stripe-signature、调用stripe.webhooks.constructEvent的逻辑。 - 直接从前端POST过来的请求体里读取
token字段,调用Stripe的支付创建接口(比如stripe.charges.create)完成扣款,同步拿到Stripe返回的支付结果给前端即可。 - 这种场景下后端不需要做Webhook签名校验,因为是你自己的后端直接主动调用Stripe接口,不存在被伪造请求的风险。
方案2:需要异步接收支付状态(正式场景推荐Webhook)
如果你的业务需要处理异步的支付状态变更(比如延迟支付结果、退款通知、订阅状态变更),必须把Webhook逻辑和前端支付接口完全拆分:
- 单独新建一个独立的云函数作为Webhook接收端点,这个端点绝对不要接收前端发起的任何请求,只用来接收Stripe服务器主动推送的事件。
- 在这个独立的Webhook函数里,你才能正常从
request.headers['stripe-signature']拿到合法的签名值,再结合request.rawBody、对应的Webhook密钥调用stripe.webhooks.constructEvent做校验。 - 注意Firebase云函数的默认请求处理会自动解析请求体,你需要确保能拿到完整未修改的原始请求Buffer(即
request.rawBody),否则就算签名存在,校验也会因为请求体内容不匹配失败。 - 最后在Stripe的Webhook配置页面,填入这个独立云函数的公网可访问地址,关联对应的
whsec_xxx密钥,Stripe才会在触发对应事件时给这个地址发送带签名的请求。
你当前代码的其他常见坑点
- 你在前端的
api.post("stripeHook", ...)请求里,只加了Content-Type: application/json,这个配置本身没有问题,但因为这个请求根本不是Stripe发的,加再多自定义请求头也不会出现合法的stripe-signature。 - 不要在前端手动构造支付签名传递给后端,这种方式会完全绕过Stripe的安全校验,存在极高的资金风险。
内容的提问来源于stack exchange,提问作者I'm not human
相关产品推荐
相关产品推荐

