如何在C#控制台应用中验证Stripe Webhook签名?
如何在C#控制台应用中验证Stripe Webhook签名?
嘿,我来帮你搞定这个控制台里验证Stripe Webhook签名的问题!其实逻辑和Web应用里大同小异,核心就是要抓准Stripe发送的几个关键信息,再用Stripe的SDK来做验证。我给你一步步拆解:
第一步:装好Stripe的C# SDK
控制台里直接用NuGet安装就行,打开Package Manager Console输入:
Install-Package Stripe.net
或者用.NET CLI的话:
dotnet add package Stripe.net
第二步:备齐三个核心数据(一个都不能错!)
你得先把这三个值从Stripe那边拿到手:
- 原始JSON payload:就是你从Webhook API复制的那个JSON,但注意!必须是Stripe发送的原样字符串,不能格式化、不能加换行缩进,签名是基于原始字节计算的,改一点就会验证失败(这个坑我之前踩过!)
- Stripe-Signature请求头值:你可以在Stripe Dashboard的事件详情里找到这个头,或者用Stripe CLI模拟事件时捕获到
- Webhook密钥:在Stripe Dashboard的Webhook设置页获取,格式是
whsec_xxxxxxxxxx,别和你的API密钥搞混了
第三步:写验证代码
直接用Stripe SDK提供的EventUtility.ConstructEvent方法,它会自动帮你完成签名验证,代码示例如下:
using Stripe; using System; class Program { static void Main(string[] args) { // 替换成你实际的原始payload(别格式化!保持Stripe发的原样) string rawPayload = @"{""id"":""evt_123456789..."",""object"":""event"",""api_version"":""2024-06-20"",...}"; // 替换成你拿到的Stripe-Signature头内容 string stripeSignature = @"t=1719000000,v1=abcdef123456789...,v0=ghijkl098765432..."; // 替换成你的Webhook密钥 string webhookSecret = "whsec_your_real_secret_key_here"; try { // 验证签名并构造Stripe事件对象 var stripeEvent = EventUtility.ConstructEvent( payload: rawPayload, sigHeader: stripeSignature, secret: webhookSecret, tolerance: TimeSpan.FromMinutes(5) // 可选:允许5分钟的时间偏移,避免系统时间差导致验证失败 ); Console.WriteLine($"✅ 签名验证成功!事件类型:{stripeEvent.Type}"); // 这里可以根据事件类型做后续处理,比如处理payment_intent.succeeded之类的逻辑 } catch (StripeException ex) { Console.WriteLine($"❌ 签名验证失败:{ex.Message}"); // 验证失败就别处理这个事件了,防止恶意请求 } } }
常见踩坑点提醒
- 千万别修改payload:哪怕是加个空格或换行,都会导致签名不匹配,一定要用Stripe发送的原始字符串
- 密钥要对应:每个Webhook端点都有自己的独立密钥,别拿错了
- 时间差问题:如果你的系统时间和Stripe的时间差超过默认的3分钟,就会验证失败,这时候就加上代码里的
tolerance参数调整允许的偏移时间
备注:内容来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

