用户指南支付配置
动态定价配置
在管理后台实时管理定价方案,无需修改代码或重新部署
动态定价让你直接在管理后台创建、编辑和调整定价方案,无需修改代码或重新部署。默认的静态定价(config/payment.ts)不受影响,两种模式可随时切换。
开启动态定价
-
在
.env中设置:PRICING_MODE=dynamic -
确保数据库已创建
pricing_plan表。新版本模板的数据库结构自带该表,正常初始化(pnpm db:push)即可,无需额外操作;从旧版本升级的项目需要手动补充表结构:pnpm db:push # PostgreSQL pnpm db:push:sqlite # SQLite / D1 -
重启应用。定价页面将改为从数据库读取方案。
PRICING_MODE 仅在服务端生效;不设置或设为 static 时行为与之前完全一致。
管理后台
开启动态定价后,访问 /admin/pricing 管理所有方案:
- 创建 / 编辑方案:填写名称、价格、货币、类型(订阅 / 终身 / 积分包),以及对应支付商的 Price ID / Product ID
- 启用 / 停用:通过开关控制方案是否在定价页显示
- 排序:拖拽调整方案在定价页的展示顺序
- 一键导入:将
config/payment.ts中已有的静态方案导入数据库,适合首次迁移
导入操作只新增记录、不覆盖已有方案,重复导入会产生重复数据。
核心能力
相比静态定价,动态模式额外提供:
- 划线价格:设置原价
originalPrice,定价页自动显示删除线和折扣 - 多语言内容:每个方案可按语言单独设置名称、描述和功能特性,缺失语言自动回退到英语
- Markdown 功能特性:Features 支持 Markdown 格式,可编写富文本功能亮点
- 区域筛选:为方案指定适用语言(如仅
zh-CN),定价页按用户语言自动过滤;不指定则对所有用户可见 - 自定义排序:通过排序权重控制展示顺序,不受代码顺序限制
区域筛选只控制定价页的展示范围,不影响实际支付——用户仍可通过 API 直接购买其他区域的方案。
从静态迁移到动态
本节仅适用于从旧版本升级的已有项目。新版本项目的数据库结构自带 pricing_plan 表,设置 PRICING_MODE=dynamic 后直接在后台导入或创建方案即可,无需执行第 1 步。
- 执行
pnpm db:push(或pnpm db:push:sqlite)为数据库补充pricing_plan表 - 在
/admin/pricing点击「Import from Config」导入现有方案 - 检查导入结果,特别是各支付商的 Price / Product ID
- 设置
PRICING_MODE=dynamic并重启 - 用测试模式跑一遍完整支付流程,确认定价页展示和 Webhook 回调正常
回退:把 PRICING_MODE 改回 static 并重启即可,数据库中的方案会保留。
注意事项
- 动态方案必须正确填写支付商 ID,否则无法发起支付:Stripe 填
stripePriceId、Creem 填creemProductId、Dodo 填dodoProductId、Waffo 填waffoProductId(PROD_xxx);微信 / 支付宝无需填写 - 与返利系统完全兼容,佣金按订单实付金额计算,与定价模式无关
- 运行
pnpm db:seed可生成各提供商的示例方案(含 Stripe、微信、Creem、PayPal、Dodo、Waffo)。若库中已有方案,seed 会跳过插入,需在管理后台手动新增