如何基于用户角色在Stripe customer portal中过滤展示对应订阅产品
Stripe Customer Portal按用户角色展示产品实现方案
核心逻辑
不需要依赖Stripe全局配置,在生成用户的Portal跳转会话时,动态传入对应角色可见的产品列表即可实现隔离。
实现步骤
方案一:动态过滤产品(适合产品迭代频繁的场景)
- 给Stripe产品添加角色标记
- 打开Stripe后台的产品管理页,分别给学生、教师对应的订阅产品添加元数据:键设为
access_role,值对应为student/teacher,也可以通过Stripe API批量更新,示例如下:
// Node.js 示例 await stripe.products.update('你的学生产品ID', { metadata: { access_role: 'student' } }); await stripe.products.update('你的教师产品ID', { metadata: { access_role: 'teacher' } });
- 创建Portal会话时动态筛选产品
生成跳转链接前,先获取当前登录用户的角色,拉取对应权限的产品传入会话配置:
// 1. 从你的业务系统获取当前用户角色和绑定的Stripe客户ID const userRole = currentUser.role; const stripeCustomerId = currentUser.stripe_customer_id; // 2. 拉取当前角色可见的所有有效产品 const allowedProducts = await stripe.products.list({ active: true, type: 'service', metadata: { access_role: userRole } }); // 3. 格式化产品参数适配Portal要求 const portalProducts = allowedProducts.data.map(product => ({ product: product.id, prices: [product.default_price] // 可按需指定该产品下要展示的价格 })); // 4. 创建Portal会话 const session = await stripe.billingPortal.sessions.create({ customer: stripeCustomerId, return_url: '你的平台用户中心跳转地址', configuration: { features: { subscription_update: { enabled: true, products: portalProducts // 仅展示过滤后的产品 }, // 其他Portal功能按需配置 subscription_cancel: { enabled: true }, invoice_history: { enabled: true } } } }); // 5. 前端直接跳转session.url即可
方案二:多配置隔离(适合产品固定的场景)
如果你的订阅产品很少且不会频繁改动,可以用更简单的配置方案:
- 打开Stripe后台的Customer Portal配置页,创建两个独立的配置:学生配置仅添加面向学生的产品,教师配置仅添加面向教师的产品,分别记录两个配置的ID
- 创建Portal会话时根据用户角色传入对应配置ID即可:
const configMap = { student: '你的学生Portal配置ID', teacher: '你的教师Portal配置ID' }; const session = await stripe.billingPortal.sessions.create({ customer: stripeCustomerId, configuration: configMap[userRole], return_url: '你的平台用户中心跳转地址' });
注意事项
- 确保你使用的Stripe API版本不低于2022-08-01,否则可能不支持动态覆盖配置参数
- 两种方案都不会修改全局Portal配置,不同角色的用户进入Portal后只能看到权限内的产品,不会出现越权可见的问题
内容的提问来源于stack exchange,提问作者Akash Ahmad
相关产品推荐
相关产品推荐

