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

React集成Stripe订阅:如何设置多个success_url?

在React中实现Stripe多订阅方案的专属success_url

核心思路

每个订阅方案对应独立的success_url,关键是在创建Stripe Checkout Session时,根据用户选择的Plan动态传入不同的跳转地址,而非固定通用地址。

具体实现步骤

1. 前端:给每个订阅按钮绑定Plan标识

在React组件中,为三个订阅方案的按钮添加点击事件,传递对应plan参数到后端接口:

import { loadStripe } from '@stripe/stripe-js';

// 初始化Stripe实例,替换为你的公钥
const stripePromise = loadStripe('pk_test_xxxxxx');

const SubscriptionPlans = () => {
  const handleSubscribe = async (planId) => {
    const stripe = await stripePromise;
    // 调用后端创建Checkout Session的接口
    const response = await fetch('/api/create-checkout-session', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ planId }),
    });

    const session = await response.json();
    // 跳转至Stripe支付页面
    const result = await stripe.redirectToCheckout({ sessionId: session.id });
    if (result.error) {
      console.error(result.error.message);
    }
  };

  return (
    <div className="plans-container">
      <button onClick={() => handleSubscribe('plan_a')}>订阅Plan-A</button>
      <button onClick={() => handleSubscribe('plan_b')}>订阅Plan-B</button>
      <button onClick={() => handleSubscribe('plan_c')}>订阅Plan-C</button>
    </div>
  );
};

export default SubscriptionPlans;

2. 后端:根据PlanId动态设置success_url

以Node.js/Express为例,后端接收前端传递的planId,映射对应success_url和Stripe价格ID:

const stripe = require('stripe')('sk_test_xxxxxx'); // 替换为你的私钥
const express = require('express');
const app = express();
app.use(express.json());

app.post('/api/create-checkout-session', async (req, res) => {
  const { planId } = req.body;
  
  // 配置各方案对应的Stripe价格ID和跳转地址
  const planConfig = {
    plan_a: {
      priceId: 'price_xxxxxx', // Stripe后台创建的Plan-A价格ID
      successUrl: `${process.env.CLIENT_URL}/thank-you/plan-a`,
    },
    plan_b: {
      priceId: 'price_yyyyyy',
      successUrl: `${process.env.CLIENT_URL}/thank-you/plan-b`,
    },
    plan_c: {
      priceId: 'price_zzzzzz',
      successUrl: `${process.env.CLIENT_URL}/thank-you/plan-c`,
    },
  };

  const selectedPlan = planConfig[planId];
  if (!selectedPlan) {
    return res.status(400).json({ error: '无效的订阅方案' });
  }

  // 创建Checkout Session
  const session = await stripe.checkout.sessions.create({
    payment_method_types: ['card'],
    line_items: [{ price: selectedPlan.priceId, quantity: 1 }],
    mode: 'subscription',
    success_url: selectedPlan.successUrl,
    cancel_url: `${process.env.CLIENT_URL}/subscription-plans`, // 取消支付后的跳转地址
  });

  res.json({ id: session.id });
});

app.listen(3001, () => console.log('后端服务运行在3001端口'));

3. 前端:创建专属感谢页面

通过React Router配置三个感谢页面的路由,展示对应方案的权益:

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import SubscriptionPlans from './pages/SubscriptionPlans';
import ThankYouPlanA from './pages/ThankYouPlanA';
import ThankYouPlanB from './pages/ThankYouPlanB';
import ThankYouPlanC from './pages/ThankYouPlanC';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/subscription-plans" element={<SubscriptionPlans />} />
        <Route path="/thank-you/plan-a" element={<ThankYouPlanA />} />
        <Route path="/thank-you/plan-b" element={<ThankYouPlanB />} />
        <Route path="/thank-you/plan-c" element={<ThankYouPlanC />} />
      </Routes>
    </Router>
  );
}

export default App;

4. 备用方案:通过URL参数传递Plan信息

如果不想后端区分方案,可在success_url中携带plan参数,前端跳转后解析展示:

  • 后端统一设置success_url:${process.env.CLIENT_URL}/thank-you?plan=${planId}
  • 前端感谢页面解析参数:
import { useLocation } from 'react-router-dom';

const ThankYouPage = () => {
  const location = useLocation();
  const planId = new URLSearchParams(location.search).get('plan');

  return (
    <div className="thank-you-page">
      {planId === 'plan_a' && <div><h1>感谢订阅Plan-A</h1><p>你的专属权益:xxx</p></div>}
      {planId === 'plan_b' && <div><h1>感谢订阅Plan-B</h1><p>你的专属权益:yyy</p></div>}
      {planId === 'plan_c' && <div><h1>感谢订阅Plan-C</h1><p>你的专属权益:zzz</p></div>}
    </div>
  );
};

export default ThankYouPage;

注意事项

  • 确保Stripe后台已创建对应方案的价格ID,且与后端配置一致
  • success_url必须添加到Stripe控制台的「Web设置」允许域名列表中
  • 生产环境建议用环境变量存储公钥、私钥和客户端URL,避免硬编码

内容的提问来源于stack exchange,提问作者Ronith Aryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 17:32:35