You need to enable JavaScript to run this app. 如何在Stripe Webhook请求头中获取stripe-signature?云函数下取值为undefined
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 13:36:00