使用Stripe .NET客户端开发SaaS订阅支付,何处指定产品?
首先得给你理清Stripe新版订阅模型的核心逻辑:现在Stripe把「产品(Product)」和「价格(Price)」拆分开了,旧版的Plan其实是Product+Price的组合体,现在官方更推荐用Product来定义你的SaaS服务(比如「基础版订阅」「专业版订阅」),再给每个Product创建对应的Price(比如「每月$19」「每年$199」)。
回到你的问题:既不需要在创建Customer时指定产品,也不需要在Charge里指定——因为这俩场景都不是订阅支付的正确打开方式:
1. 如果你做的是订阅支付(自动续费)
这是SaaS最常见的场景,正确流程应该是:
- 先在Stripe后台或通过API创建你的Product(定义服务本身)
- 为该Product创建对应的Price(定义收费周期、金额)
- 创建Customer(记录用户的支付信息等)
- 最后创建
Subscription对象,关联Customer和Price ID——这才是把用户和你的订阅产品绑定的正确方式。
你在StripeCustomerCreateOptions里看到的PlanId是旧版API的参数,现在新版已经不推荐这么用了,应该用Subscription来管理订阅关系。
给你个.NET客户端的代码示例:
// 初始化Subscription创建选项 var subscriptionOptions = new SubscriptionCreateOptions { // 关联已创建的Customer ID Customer = "cus_XXXXXXXXXXXX", // 绑定对应的Price ID(Price已经关联了你的Product) Items = new List<SubscriptionItemOptions> { new SubscriptionItemOptions { Price = "price_XXXXXXXXXXXX", // 如果需要指定数量(比如多席位订阅),可以加Quantity字段 Quantity = 1 } }, // 可选:设置支付方式自动扣款 PaymentBehavior = "default_incomplete" }; // 创建Subscription var subscriptionService = new SubscriptionService(); var subscription = subscriptionService.Create(subscriptionOptions);
2. 如果你做的是单次付款(非订阅)
如果只是偶尔的单次收费,想关联产品信息,你可以通过Charge的Metadata字段自定义记录Product ID,或者用新版的PaymentIntent + LineItems来关联(更推荐):
// 用PaymentIntent关联产品的示例 var paymentIntentOptions = new PaymentIntentCreateOptions { Amount = 1900, // 单位是分,对应$19 Currency = "usd", Customer = "cus_XXXXXXXXXXXX", LineItems = new List<LineItemOptions> { new LineItemOptions { Price = "price_XXXXXXXXXXXX", // 关联Price,间接关联Product Quantity = 1 } } }; var paymentIntentService = new PaymentIntentService(); var paymentIntent = paymentIntentService.Create(paymentIntentOptions);
为什么你找不到ProductId字段?
因为在新版API里,Product是通过Price来间接关联的——每个Price都属于一个Product,所以指定Price ID后,Stripe后台会自动关联对应的Product信息,你在Stripe Dashboard里就能看到这笔交易/订阅对应的产品了,不需要直接指定ProductId。
最后提醒下:尽量迁移到Product+Price+Subscription的新版模型,旧的Plan和Charge用于订阅的方式已经逐渐被官方弃用,新版模型能更好地支持订阅升级、降级、优惠券、计量收费等复杂场景。
内容的提问来源于stack exchange,提问作者Sam

