MuseMVP 文档
计费与支付

计费配置

选择一个网关、关联你的套餐,并完成第一次沙盒结账。

先接通一个网关即可。目标是完成一次完整沙盒购买:用户登录、结账、Webhook 到达,应用显示正确套餐。

开始前准备

准备可运行的应用、具备沙盒/测试权限的支付账号,以及要售卖的套餐、金额、币种和周期。Webhook 需要可公开访问的 HTTPS 测试部署,或服务商支持的转发工具。

首次测试不要使用正式密钥或真实扣款。配置准备好之前,可以保持 config.payments.enableBilling=false。

1. 选择一个支付网关

网关配置教程主要凭据
CreemCreemCREEM_API_KEY
StripeStripeSTRIPE_SECRET_KEY
Dodo PaymentsDodoDODO_PAYMENTS_API_KEY
WaffoWaffoWAFFO_MERCHANT_ID 与 WAFFO_PRIVATE_KEY

根据商户资质、目标市场、支付方式与业务需求选择。具体可用能力以服务商和账号为准,不需要同时开通四个账号。

2. 关联你的套餐

在 packages/config/src/index.ts 的 payments.productCatalog 保留稳定的应用套餐 ID。所选应用内:

  • src/config/saas/pricing-desc.ts:套餐名称、描述和权益文案。
  • src/config/saas/pricing-desc-usage.ts:金额、币种、订阅周期和可购买项。

在网关后台创建对应产品/价格,按网关教程复制正确类型的 ID。将你启用的套餐映射到该网关环境变量。例如 Stripe 在应用 .env.local 中使用:

BILLING_DEFAULT_GATEWAY="muse_stripe"
STRIPE_SECRET_KEY="YOUR_TEST_SECRET_KEY"
STRIPE_WEBHOOK_SECRET="YOUR_TEST_WEBHOOK_SECRET"
STRIPE_PRODUCT_ID_PRO_MONTHLY="YOUR_MONTHLY_PRICE_ID"
STRIPE_PRODUCT_ID_PRO_YEARLY="YOUR_YEARLY_PRICE_ID"
STRIPE_PRODUCT_ID_LIFETIME="YOUR_ONE_TIME_PRICE_ID"

网关价格、币种、周期要与应用配置一致。originalAmount 只展示划线对比价,不修改网关价格。本地与生产凭据的配置方式见 环境变量。

3. 注册 Webhook

使用你的测试 origin 加对应路径:

网关路径
Creem/api/muse-billing/notify/muse_creem
Stripe/api/muse-billing/notify/muse_stripe
Dodo/api/muse-billing/notify/muse_dodo
Waffo/api/muse-billing/notify/muse_waffo

按网关教程配置签名密钥与事件列表。Waffo 使用 SDK 验签与 WAFFO_ENVIRONMENT=test,没有独立 Webhook secret 变量。浏览器返回成功页不代表已获得付费权限,服务端会根据 Webhook 更新状态。

4. 完成第一次沙盒购买

开启 payments.enableBilling,使用测试配置重启/重新部署,登录开发用户。打开 /pricing,选择已配置套餐,用服务商沙盒方式完成支付。等待 Webhook 后,检查用户套餐和账号计费页面。

确认结果

  • 定价页展示正确套餐,托管结账金额、币种和周期符合预期。
  • 网关后台显示 Webhook 投递成功。
  • 刷新后,购买用户的套餐与有效期正确。
  • 订阅套餐可以通过对应客户门户管理。
  • 失败或取消的结账不会获得付费权限。

常见问题

问题处理方式
网关不可选或结账失败检查对应凭据和产品映射,本地修改后重启
找不到产品/价格对照网关教程检查 ID 类型与测试/正式环境
Webhook 没有到达使用公开 HTTPS 地址或转发工具,查看网关投递日志和 URL
签名被拒绝匹配该端点签名密钥;Waffo 检查签名请求头和环境
结账成功但套餐没更新排查 Webhook 投递、服务端报错和合约匹配,而非只看返回页

切换正式环境前,创建正式产品、替换测试凭据和 Webhook 配置,并完成 上线检查清单。生产不要使用开发 seed 账号。

本页目录