处理试用期与方案升级
为新订阅者实现试用期,并管理不同订阅方案之间的无缝升级或降级。
处理试用期与方案升级 是 CoddyKit 上的免费 Stripe Payments & SaaS Billing Systems 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Stripe Payments & SaaS Billing Systems 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Stripe Payments & SaaS Billing Systems 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Flexible Subscriptions Intro
Welcome! In this lesson, we'll dive into making your subscription service more flexible and user-friendly. We'll cover two key features:
- Trial Periods: Attract new users with a taste of your service.
- Plan Upgrades/Downgrades: Allow users to adjust their plan as their needs evolve.
These features are crucial for improving customer satisfaction and retention.
Understanding Trial Periods
A trial period gives users free access to your service for a limited time before they are charged. It's a great way to:
- Let users experience your full features.
- Build trust and demonstrate value.
- Reduce friction for new sign-ups.
Stripe handles the billing logic automatically once the trial ends.
Setting Up a Trial Period
You can define a trial period when creating or updating a Price in Stripe. This sets the default trial duration for any subscription created with that price.
In the Stripe Dashboard, when you create a new Price, look for the 'Trial period' option and specify the number of days (e.g., 7 or 30 days).
Via the API, you use the trial_period_days parameter.
Creating a Subscription with Trial
To create a new subscription that includes a trial, you simply pass the trial_period_days parameter when creating the subscription. Stripe will automatically manage the trial start and end dates.
Try running this Java example:
import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;
import com.stripe.param.SubscriptionCreateParams;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Stripe.apiKey = "sk_test_YOUR_SECRET_KEY"; // Replace with your actual test secret key
try {
List<SubscriptionCreateParams.Item> items = new ArrayList<>();
items.add(
SubscriptionCreateParams.Item.builder()
.setPrice("price_1OQ2eFLkd2M9gC7q0L1xP5cW") // Replace with YOUR Price ID
.build()
);
SubscriptionCreateParams params = SubscriptionCreateParams.builder()
.setCustomer("cus_Pq34567890abcdef") // Replace with YOUR Customer ID
.addAllItem(items)
.setTrialPeriodDays(7) // Sets a 7-day trial
.build();
Subscription subscription = Subscription.create(params);
System.out.println("Subscription created with trial:");
System.out.println("ID: " + subscription.getId());
System.out.println("Status: " + subscription.getStatus());
System.out.println("Trial End (Unix timestamp): " + subscription.getTrialEnd());
} catch (StripeException e) {
System.err.println("Error creating subscription: " + e.getMessage());
}
}
}Monitoring Trial Status
You can check a subscription's status to see if it's currently in a trial. A subscription in trial will have a status of trialing and the trial_end field will contain a Unix timestamp indicating when the trial concludes.
This allows your application to display appropriate messaging to the user.
import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;
public class Main {
public static void main(String[] args) {
Stripe.apiKey = "sk_test_YOUR_SECRET_KEY";
try {
String subscriptionId = "sub_12345ABCDEF"; // Replace with an existing Subscription ID
Subscription subscription = Subscription.retrieve(subscriptionId);
System.out.println("Subscription ID: " + subscription.getId());
System.out.println("Current Status: " + subscription.getStatus());
if ("trialing".equals(subscription.getStatus())) {
System.out.println("This subscription is currently in a trial period.");
System.out.println("Trial ends on: " + subscription.getTrialEnd());
} else if ("active".equals(subscription.getStatus())) {
System.out.println("This subscription is active and being billed.");
} else {
System.out.println("Subscription status: " + subscription.getStatus());
}
} catch (StripeException e) {
System.err.println("Error retrieving subscription: " + e.getMessage());
}
}
}Preparing for Trial End
It's good practice to notify users before their trial ends. This gives them time to decide whether to continue or cancel, reducing unexpected charges and potential disputes.
Stripe sends a webhook event called customer.subscription.trial_will_end a few days before the trial concludes. You can configure this notification period in your Stripe settings.
Your application should listen for this webhook to send custom email reminders.
Understanding Plan Changes
As your users' needs change, they might want to switch to a different subscription plan. Stripe makes it easy to handle upgrades (moving to a higher-tier plan) and downgrades (moving to a lower-tier plan).
When you update a subscription, Stripe automatically handles the complex billing calculations, including prorations, to ensure fair charges.
Upgrading a Subscription
To upgrade a subscription, you update the existing subscription's items array, replacing the old Price ID with the new, higher-tier Price ID. Stripe will then adjust the billing accordingly.
The proration_behavior parameter lets you control how charges are calculated for the change. always_invoice is a common choice.
import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;
import com.stripe.param.SubscriptionUpdateParams;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Stripe.apiKey = "sk_test_YOUR_SECRET_KEY";
try {
String subscriptionId = "sub_12345ABCDEF"; // Replace with the Subscription ID to update
String currentSubscriptionItemId = "si_GHIJKLMN"; // Get from the existing subscription's items
String newPriceId = "price_67890UVWXY"; // Replace with the ID of the new, higher-tier Price
Subscription resource = Subscription.retrieve(subscriptionId);
List<SubscriptionUpdateParams.Item> items = new ArrayList<>();
items.add(
SubscriptionUpdateParams.Item.builder()
.setId(currentSubscriptionItemId)
.setPrice(newPriceId)
.build()
);
SubscriptionUpdateParams params = SubscriptionUpdateParams.builder()
.addAllItem(items)
.setProrationBehavior(SubscriptionUpdateParams.ProrationBehavior.ALWAYS_INVOICE) // Prorate and invoice immediately
.build();
Subscription updatedSubscription = resource.update(params);
System.out.println("Subscription upgraded successfully:");
System.out.println("ID: " + updatedSubscription.getId());
System.out.println("Status: " + updatedSubscription.getStatus());
System.out.println("New Price ID: " + updatedSubscription.getItems().getData().get(0).getPrice().getId());
} catch (StripeException e) {
System.err.println("Error updating subscription: " + e.getMessage());
}
}
}Handling Plan Downgrades
Downgrading a subscription follows the same API pattern as upgrading. You update the subscription's items array with the ID of the new, lower-tier Price.
Stripe will automatically calculate any credits or refunds due to the customer based on the proration_behavior you specify. For more details on proration, refer to the 'Implementing Prorations' lesson.
import com.stripe.Stripe;
import com.stripe.exception.StripeException;
import com.stripe.model.Subscription;
import com.stripe.param.SubscriptionUpdateParams;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Stripe.apiKey = "sk_test_YOUR_SECRET_KEY";
try {
String subscriptionId = "sub_12345ABCDEF"; // Replace with the Subscription ID to update
String currentSubscriptionItemId = "si_GHIJKLMN"; // Get from the existing subscription's items
String newPriceId = "price_ZZZZAASSDD"; // Replace with the ID of the new, lower-tier Price
Subscription resource = Subscription.retrieve(subscriptionId);
List<SubscriptionUpdateParams.Item> items = new ArrayList<>();
items.add(
SubscriptionUpdateParams.Item.builder()
.setId(currentSubscriptionItemId)
.setPrice(newPriceId)
.build()
);
SubscriptionUpdateParams params = SubscriptionUpdateParams.builder()
.addAllItem(items)
.setProrationBehavior(SubscriptionUpdateParams.ProrationBehavior.CREATE_PRORATIONS) // Create prorations but don't invoice immediately
.build();
Subscription updatedSubscription = resource.update(params);
System.out.println("Subscription downgraded successfully:");
System.out.println("ID: " + updatedSubscription.getId());
System.out.println("Status: " + updatedSubscription.getStatus());
System.out.println("New Price ID: " + updatedSubscription.getItems().getData().get(0).getPrice().getId());
} catch (StripeException e) {
System.err.println("Error updating subscription: " + e.getMessage());
}
}
}Quick Check: Trial End
To notify a user that their subscription trial is about to end, which Stripe webhook event would you typically configure your application to listen for?
Recap & Next Steps
Great job! You've learned how to implement crucial features for flexible subscriptions:
- How to define and create subscriptions with trial periods.
- How to monitor a subscription's trial status.
- The importance of the
customer.subscription.trial_will_endwebhook. - How to programmatically upgrade and downgrade subscription plans using the Stripe API.
These tools empower you to offer a dynamic and user-friendly subscription experience. Next, we'll explore prorations and metered billing in more detail!
常见问题解答
「处理试用期与方案升级」课时是免费的吗?
是的 — 「处理试用期与方案升级」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Stripe Payments & SaaS Billing Systems 课程的其余内容,请升级到 CoddyKit PRO。 Stripe Payments & SaaS Billing Systems 课程共包含 4 节课。
「处理试用期与方案升级」这节课中我会学到什么?
为新订阅者实现试用期,并管理不同订阅方案之间的无缝升级或降级。 你通过在浏览器中直接运行的动手代码来练习 Stripe Payments & SaaS Billing Systems,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Stripe Payments & SaaS Billing Systems 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Stripe Payments & SaaS Billing Systems 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「处理试用期与方案升级」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Stripe Payments & SaaS Billing Systems 课中编写并运行代码吗?
能。每节 Stripe Payments & SaaS Billing Systems 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 处理试用期与方案升级
- 实现按比例计费与计量计费
- 订阅生命周期管理与事件
- 优惠券、折扣与促销代码