.NET环境下如何提取Stripe Webhook返回Session对象中的Metadata
解决方案
1. 提取Metadata的正确写法
你当前获取到的stripeEvent.Data.Object是泛型接口类型,需要先转换为对应的Checkout.Session具体类型才能访问Metadata属性,代码示例如下:
var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync(); try { // 校验Stripe事件合法性 var stripeEvent = EventUtility.ConstructEvent(json,Request.Headers["Stripe-Signature"], endpointSecret); // 处理checkout.session.completed事件 if (stripeEvent.Type == Events.CheckoutSessionCompleted) { // 转换为具体的Checkout Session类型 var session = stripeEvent.Data.Object as Stripe.Checkout.Session; if (session == null) { // 可根据业务需求添加异常处理逻辑 return BadRequest(); } // 直接访问Metadata,本质是Dictionary<string, string>类型 var yourMetaDataValue = session.Metadata["你定义的Metadata键名"]; // 后续订单履约、数据库更新逻辑 } // 其他事件处理逻辑 return Ok(); } catch (StripeException e) { return BadRequest(); }
更安全的写法可以用模式匹配简化判空逻辑:
if (stripeEvent.Data.Object is Stripe.Checkout.Session session) { var metaValue = session.Metadata["你的键名"]; }
2. IHasObject定义说明
IHasObject是Stripe官方.NET SDK中定义的通用接口,所有事件关联的业务实体(包括Checkout Session、Payment Intent、Customer等)都实现了这个接口。该接口仅封装了所有实体通用的基础方法和属性,不包含具体业务实体的特有属性(比如Session的Metadata),所以必须将其转换为对应的具体业务类后才能访问专属属性。
内容的提问来源于stack exchange,提问作者Norbert Norbertson
相关产品推荐
相关产品推荐

