如何用JSON JQ表达式手动验证Stripe Webhook签名及排障
Stripe Webhook签名验证JQ表达式(适配Workato/Dellboomi/Celigo)
核心验证逻辑说明
Stripe Webhook签名验证依赖三个核心要素:
- Stripe Webhook签名密钥(格式为
whsec_xxx,从Stripe控制台获取) - 请求头中的
Stripe-Signature值 - 未被修改的完整原始请求体字符串
适配Workato的JQ表达式
Workato中通过raw_body获取原始请求体,headers."stripe-signature"获取签名头,替换YOUR_WEBHOOK_SECRET为实际密钥:
(.headers."stripe-signature" | capture("t=(?<t>[^,]+),v1=(?<v1>[^,]+)")) as $sig_data | ($sig_data.t + "." + .raw_body) as $signing_string | (hmac-sha256($signing_string; "YOUR_WEBHOOK_SECRET") | tobase64) == $sig_data.v1
注意:需确保Workato未自动解析请求体,保留原始字符串格式,否则签名计算会失效。
适配Dellboomi的JQ表达式
Dellboomi中通过$inboundRequest.getHeaders().get("Stripe-Signature")获取签名头,$inboundRequest.getRawPayload()获取原始请求体,替换密钥后使用:
($inboundRequest.getHeaders().get("Stripe-Signature") | capture("t=(?<t>[^,]+),v1=(?<v1>[^,]+)")) as $sig_data | ($sig_data.t + "." + $inboundRequest.getRawPayload()) as $signing_string | (hmac-sha256($signing_string; "YOUR_WEBHOOK_SECRET") | tobase64) == $sig_data.v1
注意:需在Dellboomi入站配置中禁用自动Payload解析,保证原始请求体完整性。
适配Celigo的JQ表达式
Celigo中通过request.headers["stripe-signature"]获取签名头,request.rawBody获取原始请求体:
(request.headers["stripe-signature"] | capture("t=(?<t>[^,]+),v1=(?<v1>[^,]+)")) as $sig_data | ($sig_data.t + "." + request.rawBody) as $signing_string | (hmac-sha256($signing_string; "YOUR_WEBHOOK_SECRET") | tobase64) == $sig_data.v1
注意:Celigo默认可能解析请求体,需在集成配置中设置保留原始请求体,避免格式转换导致签名不匹配。
401错误排查要点
- 确认Webhook密钥与Stripe控制台配置完全一致,无多余空格或字符
- 检查集成平台是否修改了原始请求体(如自动格式化JSON、增减字段)
- 确认
Stripe-Signature请求头未被代理或网关篡改,完整传递到验证环节
内容的提问来源于stack exchange,提问作者sujay777
相关产品推荐
相关产品推荐

