如何将Stripe一次性支付脚本改为支持自定义价格的订阅模式?
改造为Stripe订阅模式的PHP脚本实现
一、核心代码改造
将mode改为subscription,并给每个订阅商品的price_data添加recurring配置指定计费周期。注意:订阅模式下的Checkout Session优先处理订阅类商品,一次性费用(如小费)需通过特定方式附加,不能直接沿用一次性支付的配置逻辑。
改造后的完整代码:
$stripe = new \Stripe\StripeClient(STRIPE_SECRET_KEY); $lineItems = [ [ 'price_data' => [ 'currency' => 'usd', 'product_data' => [ 'name' => 'ice', ], 'unit_amount' => 9.99 * 100, // 转换为分 'tax_behavior' => 'exclusive', // 订阅核心配置:指定计费周期 'recurring' => [ 'interval' => 'month', // 可选值:day, week, month, year 'interval_count' => 1, // 每N个周期计费一次,此处为每月1次 ] ], 'quantity' => 1 ], [ 'price_data' => [ 'currency' => 'usd', 'product_data' => [ 'name' => 'ice2', ], 'unit_amount' => 11.99 * 100, // 转换为分 'tax_behavior' => 'exclusive', 'recurring' => [ 'interval' => 'month', 'interval_count' => 1, ] ], 'quantity' => 2 ], // 若需添加一次性小费,可改用以下两种方式之一 // 方式1:通过订阅的一次性设置费实现 // 'subscription_data' => ['setup_fee' => 500] // 需在checkout session配置中添加 // 方式2:添加一次性附加项(需Stripe API版本支持) // [ // 'price_data' => [ // 'currency' => 'usd', // 'product_data' => ['name' => 'Tip (one-time)'], // 'unit_amount' => 5 * 100, // ], // 'quantity' => 1, // 'price_type' => 'one_time' // ] ]; // 创建订阅模式的Checkout Session $checkoutSession = $stripe->checkout->sessions->create([ 'line_items' => $lineItems, 'mode' => 'subscription', // 切换为订阅模式 'success_url' => 'https://hey.com/paypal/checkout-success.php?provider_session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => 'https://hey.com/paypal/cart.php?provider_session_id={CHECKOUT_SESSION_ID}', // 可选:配置一次性设置费(对应上面的小费需求) // 'subscription_data' => [ // 'setup_fee' => 500, // 一次性收取5美元(单位为分) // 'metadata' => ['tip' => '5.00'] // 记录小费信息到订阅元数据 // ] ]); // 将session ID存入数据库,后续用于查询订阅状态 // $checkoutSession->id; // 跳转至Stripe订阅支付页面 header('Content-Type: application/json'); header("HTTP/1.1 303 See Other"); header("Location: " . $checkoutSession->url); exit;
二、订阅项配置关键说明
- 必须添加
recurring参数:订阅模式下,每个订阅商品的price_data必须包含recurring字段,明确计费规则:interval:计费间隔,可选day/week/month/yearinterval_count:间隔数量,比如interval: 'month'+interval_count: 3表示每3个月计费一次
- 一次性费用处理:若需在订阅流程中加入一次性收费(如小费),优先使用
subscription_data.setup_fee配置,或添加price_type: 'one_time'的line item(需确保API版本支持)
三、自定义价格&编辑订阅价格实现
1. 用户自定义订阅价格
直接通过动态设置price_data.unit_amount实现——根据用户输入的价格(如每月15美元),转换为分后赋值给unit_amount即可。
如果需要统一管理商品,可提前在Stripe后台创建Product,或动态创建:
// 动态创建Product(后续可复用该ID) $product = $stripe->products->create([ 'name' => 'Custom Monthly Subscription', 'description' => 'User-defined recurring plan', ]); // 在price_data中使用该Product ID替代动态生成name 'product_data' => [ 'id' => $product->id, ],
2. 编辑已存在的订阅价格
方式一:API修改
从数据库中取出用户的订阅ID(可从Checkout Session的subscription字段获取),调用API更新价格:
// $subscriptionId为目标订阅ID,$subscriptionItemId为订阅内的具体项ID(从订阅的items列表获取) $stripe->subscriptions->update( $subscriptionId, [ 'items' => [ [ 'id' => $subscriptionItemId, 'price_data' => [ 'currency' => 'usd', 'product' => $productId, // 对应商品ID 'unit_amount' => 19.99 * 100, // 新的自定义价格(分) 'recurring' => [ 'interval' => 'month', ] ] ] ], 'proration_behavior' => 'create_prorations', // 可选:是否生成 prorated 账单 ] );
方式二:Stripe后台修改
- 登录Stripe后台,进入「订阅」页面找到目标订阅
- 点击「编辑订阅」,修改对应订阅项的价格(可选择已有价格或创建新的自定义价格)
- 保存后,新价格会在下一个计费周期生效(如需立即生效,可在编辑时调整生效时间)
注意事项
- 动态生成的价格会保存在Stripe后台「产品」→「价格」列表中,可统一管理
- 修改订阅价格时,需注意货币精度和Stripe的金额限制
- 若用户当前周期已付费,默认新价格在下一周期生效,可通过
proration_behavior参数配置立即生效并生成 prorated 账单
内容的提问来源于stack exchange,提问作者shadow1200
相关产品推荐
相关产品推荐

