You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:54:21