如何在Stripe.Net中实现动态金额自定义周期的recurring支付
Stripe.Net 动态定期扣款(无预建Price ID)实现方案
Stripe 订阅体系确实强制要求关联 Product(产品)和 Price(价格)对象,但你完全不需要提前在 Stripe Dashboard 手动预创建 Price,所有资源都可以通过 API 动态生成,完全满足不同周期、不同金额、不同币种的灵活扣款需求。
核心实现思路
- 提前创建1个通用 Product 即可,不需要为每个付费场景单独建产品:比如创建一个名为「定期服务付费」的 Product,把返回的 Product ID 存在自己的业务数据库里,后续所有订阅都复用这个 Product。
- 每次处理客户订阅请求时,根据当前客户的实际付费规则(金额、币种、扣款周期),动态创建对应配置的 Price 对象,关联你提前存好的通用 Product ID,拿到即时生成的 Price ID 直接使用。
- 用动态生成的 Price ID 创建/更新订阅即可,全程不需要操作 Dashboard 做预配置。
你当前代码的问题
你现在写的是给已存在的订阅追加付费项的逻辑,不是新建动态订阅的流程,而且硬编码了固定的 Price ID,没法实现动态金额、周期的需求。
完整实现代码示例
// 初始化API密钥 StripeConfiguration.ApiKey = _Configs.StripeApiKey; // -------------------------- // 1. 首次运行时执行一次即可,后续复用已生成的Product ID // 如果你已经有存好的通用Product ID,这部分可以跳过 var productService = new ProductService(); var productOptions = new ProductCreateOptions { Name = "通用定期付费服务", Description = "动态定价的定期扣款服务统一产品" }; var commonProduct = productService.Create(productOptions); // 把commonProduct.Id存到你的数据库,后续直接读取使用,不要每次新建Product // -------------------------- // 2. 按当前客户的付费规则动态创建Price var priceService = new PriceService(); var priceOptions = new PriceCreateOptions { Product = "你存在数据库里的通用Product ID", // 替换为上面拿到的commonProduct.Id UnitAmount = 2999, // 注意:Stripe金额为币种最小单位,比如这里2999对应29.99美元 Currency = "usd", // 替换为对应币种,比如cny、eur Recurring = new PriceRecurringOptions { Interval = "month", // 周期单位:day/week/month/year IntervalCount = 3, // 间隔数:这里填3就是每3个月扣款一次,按月付填1即可 UsageType = "licensed" // 固定额度扣款选licensed,按用量计费选metered } }; var dynamicPrice = priceService.Create(priceOptions); // 3. 用动态生成的Price创建订阅 var subscriptionService = new SubscriptionService(); var subscriptionOptions = new SubscriptionCreateOptions { Customer = "客户对应的Stripe Customer ID", // 提前为你的用户创建好Stripe客户对象,传对应ID Items = new List<SubscriptionItemOptions> { new SubscriptionItemOptions { Price = dynamicPrice.Id, // 这里传刚才动态生成的Price ID Quantity = 1, } }, DefaultPaymentMethod = "客户绑定的支付方法ID", // 客户提前绑定的扣款支付方式ID PaymentBehavior = "default_incomplete", // 首次扣款需要确认的场景用这个配置 }; var subscription = subscriptionService.Create(subscriptionOptions);
关键注意事项
- 金额单位必须传对应币种的最小计价单位,不支持传小数:比如人民币100元要传10000(1元=100分),美元19.99元传1999(1美元=100美分)。
- 动态生成的Price可以重复使用,如果后续有相同金额、相同周期、相同币种的订阅场景,不需要重复创建Price,直接复用之前生成的Price ID即可。
- 如果需要给已有订阅调整扣款金额/周期,不需要取消重建订阅,只需要新生成对应配置的Price,调用订阅更新接口替换原有SubscriptionItem关联的Price ID即可。
内容的提问来源于stack exchange,提问作者chosenOne Thabs
相关产品推荐
相关产品推荐

