Stripe-Go中checkout.session.completed事件无法获取LineItems问题
解决Stripe CheckoutSession LineItems为nil及Get方法未定义问题
核心原因分析
- Webhook事件默认不返回LineItems:Stripe的
checkout.session.completed事件 payload 不会主动包含line_items字段,必须通过API主动查询并展开该字段才能获取。 - stripe-go版本不兼容:你使用的是旧版非模块化的
github.com/stripe/stripe-go(v70),而最新版已改为模块化版本(v75+),两者API结构差异导致session.Get方法不存在。
步骤1:升级到正确的stripe-go版本
- 卸载旧版本:
go get -u github.com/stripe/stripe-go@none
- 安装最新模块化版本:
go get -u github.com/stripe/stripe-go/v75
- 代码中导入对应包:
import ( "github.com/stripe/stripe-go/v75" "github.com/stripe/stripe-go/v75/checkout" "github.com/stripe/stripe-go/v75/webhook" )
步骤2:正确获取带LineItems的CheckoutSession
在Webhook的checkout.session.completed分支中,通过API重新查询会话并展开line_items字段:
payload, err := c.GetRawData() if err != nil { // 错误处理 return } event, err := webhook.ConstructEvent(payload, c.Request.Header.Get("Stripe-Signature"), webhookSecret) if err != nil { // 错误处理 return } switch event.Type { case "checkout.session.completed": var session stripe.CheckoutSession err := json.Unmarshal(event.Data.Raw, &session) if err != nil { // 错误处理 return } // 构建查询参数,指定展开line_items params := &checkout.SessionParams{} params.AddExpand("line_items") // 使用checkout包的Get方法查询会话 sessionWithLineItems, err := checkout.Get(session.ID, params) if err != nil { // 错误处理 return } // 处理LineItems数据并保存到MongoDB if sessionWithLineItems.LineItems != nil { for _, item := range sessionWithLineItems.LineItems.Data { priceID := item.Price.ID quantity := item.Quantity // 此处添加保存到MongoDB的逻辑 } } }
额外注意事项
- 移除
IgnoreAPIVersionMismatch选项,确保Stripe Dashboard中的API版本与stripe-go客户端版本兼容(可在代码中显式设置:stripe.APIVersion = "2024-06-20",替换为你Dashboard中的版本)。 - 不要依赖Webhook事件中的原始数据获取嵌套字段,Stripe的Webhook payload仅包含核心会话信息,嵌套字段需通过API查询展开。
内容的提问来源于stack exchange,提问作者Bryson
相关产品推荐
相关产品推荐

