如何使用Stripe Checkout API(C#)设置订阅结束日期
实现Stripe 12个月到期自动取消的订阅
要实现仅12个月的订阅,Stripe Checkout API本身无法直接在创建Session时设置订阅结束日期,但可以通过以下两种可靠方式实现:
方法1:使用订阅计划(Subscription Schedule)推荐
订阅计划可以预先定义订阅的周期和结束行为,用户完成付款后会自动按计划执行,到期即取消。
修改你的代码,先创建订阅计划,再关联到Checkout Session:
var baseUrl = $"{_configuration["BaseURL"]}"; // 1. 创建订阅计划,定义12个月周期后取消 var scheduleOptions = new SubscriptionScheduleCreateOptions { StartDate = "now", EndBehavior = "cancel", // 到期后自动取消订阅 Phases = new List<SubscriptionSchedulePhaseOptions> { new SubscriptionSchedulePhaseOptions { Items = new List<SubscriptionSchedulePhaseItemOptions> { new SubscriptionSchedulePhaseItemOptions { PriceData = new SubscriptionSchedulePhaseItemPriceDataOptions { UnitAmount = (long)19.99 * 100, Currency = "gbp", ProductData = new SubscriptionSchedulePhaseItemPriceDataProductDataOptions { Name = "subscription" }, Recurring = new SubscriptionSchedulePhaseItemPriceDataRecurringOptions { Interval = "month", IntervalCount = 1 } }, Quantity = 1 } }, Iterations = 12 // 运行12个月度周期,即12个月 } } }; var scheduleService = new SubscriptionScheduleService(); var schedule = scheduleService.Create(scheduleOptions); // 2. 创建Checkout Session并关联订阅计划 var options = new SessionCreateOptions { Mode = "subscription", SuccessUrl = $"{baseUrl}/payment/success/?session_id=" + "{CHECKOUT_SESSION_ID}", CancelUrl = $"{baseUrl}/payment/cancelled", CustomerEmail = customerEmail, SubscriptionData = new SessionSubscriptionDataOptions { Schedule = schedule.Id // 关联刚才创建的订阅计划 } }; // 后续创建Session的代码...
方法2:通过Webhook设置订阅结束日期
如果不想用订阅计划,可以在用户完成付款后,通过Stripe Webhook监听checkout.session.completed事件,获取创建的订阅ID,再调用API设置结束日期:
- 先确保你的后端已经配置了Stripe Webhook,监听
checkout.session.completed事件 - 在事件处理逻辑中添加以下代码:
// 从Webhook事件中获取订阅ID var subscriptionId = event.Data.Object.SubscriptionId; // 设置12个月后的Unix时间戳作为结束日期 var endDate = DateTime.UtcNow.AddMonths(12).ToUnixTimeSeconds(); var subscriptionService = new SubscriptionService(); var updateOptions = new SubscriptionUpdateOptions { EndDate = endDate }; subscriptionService.Update(subscriptionId, updateOptions);
注意:EndDate必须设置为未来的时间,且要晚于当前订阅周期的结束时间,否则Stripe会报错。
内容的提问来源于stack exchange,提问作者Tez Wingfield
相关产品推荐
相关产品推荐

