如何在 Stripe 中实现“首月试用 + 年度升级”的订阅调度与前置支付

落宇大大_6802

落宇大大_6802

2026-09-06

636人浏览

原创

如何在 Stripe 中实现“首月试用 + 年度升级”的订阅调度与前置支付

本文详解如何通过 stripe checkout 的 setup 模式预先收集客户支付方式、绑定为默认付款方法,并基于该客户创建带多阶段价格的 subscription schedule,从而安全完成首期收费与后续自动升级。

本文详解如何通过 stripe checkout 的 setup 模式预先收集客户支付方式、绑定为默认付款方法,并基于该客户创建带多阶段价格的 subscription schedule,从而安全完成首期收费与后续自动升级。

在 Stripe 中实现「首月固定价 → 次月同价 → 第 13 个月起切换为年度高价」这类分阶段订阅逻辑,不能直接在空客户(无支付方式)上创建 Subscription Schedule 并期待自动扣款——因为 Stripe 要求每个 SubscriptionSchedule 在 start_date 到来前,其关联客户必须拥有已确认、可扣款的默认支付方式(invoice_settings.default_payment_method)。你当前代码中仅创建了客户但未绑定卡,导致 Schedule 虽创建成功却无法触发首次计费,页面无限加载正是因前端未收到有效 session.url 或后端未正确重定向。

✅ 正确路径是:先通过 Stripe Checkout 的 setup 模式安全收卡 → 获取 PaymentMethod → 绑定为客户默认付款方式 → 再创建 Subscription Schedule。整个流程无需自行构建卡表单,完全复用 Stripe 官方托管页,兼顾合规性与开发效率。

✅ 推荐实现步骤(含关键代码)

1. 前端:发起 Setup 模式的 Checkout Session

修改你的 WordPress 表单,调用后端接口生成 setup 类型的 Session:


2. 后端:创建 Setup Session(PHP 示例)

function checkout_setup() {
    \Stripe\Stripe::setApiKey('sk_test_51e7DRPLRnISGb5vSFxnvvuDx1GzhlBIFeazcmpEevsUFf29jHXJ1YgE2xaJ1lGfzjtKzE8uoN0eR9Klaq00CnMFWvfB');

    // 创建客户(可选:传 email 提升体验)
    $customer = \Stripe\Customer::create([
        'email' => $_POST['email'] ?? null,
        'name'  => $_POST['name'] ?? null,
    ]);

    // 创建 Setup Session:仅收卡,不扣款
    $session = \Stripe\Checkout\Session::create([
        'customer' => $customer->id,
        'payment_method_types' => ['card'],
        'mode' => 'setup',
        'success_url' => 'https://yoursite.com/success?session_id={CHECKOUT_SESSION_ID}',
        'cancel_url' => 'https://yoursite.com/cancel',
        'billing_address_collection' => 'required', // 强制收集地址(推荐)
    ]);

    // 返回前端跳转 URL
    wp_send_json(['url' => $session->url]);
}

⚠️ 注意:mode: 'setup' 是关键——它告诉 Stripe 此 Session 仅用于保存支付方式,而非立即创建订阅或发票。

3. 处理 Setup 成功回调(Webhook 或 success_url 页面)

当用户完成卡片录入并返回 success_url 时,需用 session_id 检索 SetupIntent 并提取 PaymentMethod:

// 在 success.php 或 Webhook 中处理
$session = \Stripe\Checkout\Session::retrieve($_GET['session_id']);
$setupIntent = \Stripe\SetupIntent::retrieve($session->setup_intent);

// 将 PaymentMethod 设为客户默认付款方式
\Stripe\Customer::update($session->customer, [
    'invoice_settings' => [
        'default_payment_method' => $setupIntent->payment_method,
    ],
]);

4. 创建 Subscription Schedule(此时客户已具备有效默认卡)

$subscriptionSchedule = \Stripe\SubscriptionSchedule::create([
    'customer' => $session->customer,
    'start_date' => 'now',
    'end_behavior' => 'release',
    'phases' => [
        // 第 1–12 个月:每月 price_1LRF5C...
        [
            'items' => [['price' => 'price_1LRF5CIne7DRPLRnwuLVE2pu', 'quantity' => 1]],
            'iterations' => 12,
        ],
        // 第 13 个月起:切换为年度价格 price_1LPujQ...
        [
            'items' => [['price' => 'price_1LPujQIne7DRPLRnj3EOweJN', 'quantity' => 1]],
            // 不设 iterations → 持续到 subscription 取消
        ],
    ],
]);

✅ 至此,首次账单将在 start_date(即 now)立即生成并尝试扣款,后续按 phase 自动滚动。

? 关键注意事项

  • 不要跳过 SetupIntent 验证:直接调用 Customer::create() + SubscriptionSchedule::create() 不会触发任何支付,Stripe 会在首次账单时因无可用支付方式而失败。
  • Webhook 更可靠:建议用 setup_intent.succeeded Webhook 替代 success_url 处理,默认支付方式绑定逻辑,避免用户手动关闭页面导致中断。
  • 错误处理必加:所有 Stripe API 调用需包裹 try/catch,捕获 \Stripe\Exception\CardException 等异常并反馈给用户。
  • 测试务必用 test cards:如 4242 4242 4242 4242(成功)、4000 0000 0000 0002(拒绝),验证全流程。

通过这一标准模式,你既复用了 Stripe 最安全的托管支付页,又精准实现了「先收卡、再排期、分阶计费」的业务需求,无需自建 PCI 合规表单,也规避了客户 ID 与支付方式脱节的核心陷阱。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9964

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5921

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2075

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3708

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4414

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3451

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

4917

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

3842

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

11822

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习