java-stripe 26.0.0无法反序列化api-version 2023-10-16事件求助
问题分析
Stripe Java SDK的每个版本都绑定了特定的默认API版本,不同版本SDK对事件的结构定义存在差异:
- 24.16.0版本的SDK默认API版本低于2024-06-20,因此无法解析该API版本的事件
- 26.0.0版本的SDK默认API版本高于2023-10-16,旧API版本的事件结构在新版本SDK中已不被兼容,导致反序列化失败,且
dataObjectDeserializer.object为空
解决方案
1. 针对不同API版本的事件使用对应版本的反序列化客户端
Stripe允许创建指定API版本的StripeClient,用来解析对应版本的事件,示例代码如下:
解析2023-10-16版本的事件
// 创建绑定2023-10-16 API版本的客户端 StripeClient oldApiVersionClient = new StripeClient( Stripe.apiKey, StripeConfiguration.builder().setApiVersion("2023-10-16").build() ); // 使用该客户端构造事件 Event oldApiEvent = oldApiVersionClient.webhookEndpoints().constructEvent( payload, // 原始Webhook payload sigHeader, // 请求头中的签名 webhookSecret // 你的Webhook密钥 ); // 后续处理oldApiEvent即可
解析2024-06-20版本的事件
可以直接使用26.0.0版本的默认客户端(若其默认API版本≥2024-06-20),或同样指定对应API版本:
StripeClient newApiVersionClient = new StripeClient( Stripe.apiKey, StripeConfiguration.builder().setApiVersion("2024-06-20").build() ); Event newApiEvent = newApiVersionClient.webhookEndpoints().constructEvent( payload, sigHeader, webhookSecret );
2. 统一Webhook的API版本
登录Stripe Dashboard,找到你的Webhook端点,将其API版本设置为当前SDK支持的版本(比如26.0.0对应的默认API版本)。这样后续所有新事件都会使用该版本发送,无需处理多版本兼容问题。注意:已发送的旧版本事件仍需用对应版本的客户端解析。
3. 处理dataObjectDeserializer.object为空的情况
当SDK无法识别事件的API版本时,dataObjectDeserializer.object会为空,此时可以获取原始JSON手动解析:
Event event = ...; // 已构造的事件对象 if (event.getDataObjectDeserializer().getObject().isEmpty()) { // 获取原始JSON数据 JsonObject rawData = event.getDataObjectDeserializer().getRawJsonObject(); // 根据需求手动解析字段 String objectType = rawData.get("object").getAsString(); // 其他自定义解析逻辑 }
内容的提问来源于stack exchange,提问作者jugal kishor Sahu
相关产品推荐
相关产品推荐

