用途:为已登录用户提供购买后的自助管理页面,涵盖订阅、升级、取消续订(含挽留优惠)、账单信息与发票,应用无需重新实现计费逻辑。
主要能力:门户为无头、服务端驱动。SDK 提供 PortalRequestProcessor,后端只需暴露一个端点(GET|POST /api/portal),由 SDK 处理数据获取与各操作。操作通过预签名 URL 完成(cancel、coupon、billing-update、invoice),组件只请求这些 URL,SDK 在服务端校验令牌;升级是例外,走服务端构建的 license-upgrade checkout(setLicenseUpgradeByKey)。组件渲染四个区块:订阅、取消、账单、支付与发票。
使用方式:后端用 freemius.customerPortal.request.createProcessor 创建处理器,配置 portalEndpoint、isSandbox 与 getUser(由会话解析 Freemius 用户,如按邮箱)。路由保持精简:鉴权后委托处理器。处理器按 ?action= 分发:GET portal_data 返回订阅+账单+支付+签名 URL;POST billing 更新账单;POST subscription_cancellation 取消续订;POST subscription_cancellation_coupon 应用挽留优惠;GET invoice 流式返回发票 PDF。前端使用 CustomerPortal 组件,传入 endpoint 与 fetcher。
适用场景:React 19+ 配合 shadcn UI + Tailwind 的应用(可通过 npx shadcn@latest add https://shadcn.freemius.com/all.json 安装);非 shadcn/React 应用可将其作为参考实现。路由示例基于 Hono,但 SDK 门户处理器兼容任何支持 Web 标准 Request/Response 路由的框架。
限制与注意:身份解析由应用负责,Freemius 凭据始终留在服务端。沙箱校验时 isSandbox 应绑定专用 FREEMIUS_SANDBOX 环境变量,而非 NODE_ENV。取消应先尝试挽留:若有续订取消优惠券,先提供再完成取消。升级不要用 checkout.create({ licenseId }),该选项对活跃续订许可证会返回 500;应服务端获取许可证并使用 setLicenseUpgradeByKey(license.secret_key)。操作后可在门户 UI 重新获取 portal_data 同步;本地权益镜像通过 freemius-core 的 webhook 更新,设置或更改 webhook URL 后约需 5 分钟生效,此前事件不会补发。仪表盘需创建续订取消(挽留)优惠券以填充 cancellationCoupons。