开发文档

鲜花交易系统与鲜花交易平台(PHP / ThinkPHP 版)的研发记录:功能上线、架构演进与实施经验,按发布日期持续更新。

租户自助注册:一条跨三端的开通链路怎么设计

开通实际要做六件事

客户在官网填完手机号验证码,点"注册开通"之后,系统需要完成:

  1. 创建租户记录(租户名、短码、形态、状态);
  2. 建立"域名/DNS 映射"(租户用子域还是自有域名);
  3. 在租户内创建首个超级管理员(含初始角色);
  4. 生成试用授权(30 天、能力清单);
  5. 向厂商侧登记(授权单 + 实例关系);
  6. 初始化该租户的默认数据(字典、菜单、必要配置)。

第 6 步最容易被忽略:新租户登录后如果菜单是空的,客户会认为"系统没装好"。所以租户初始化必须自带一份可用的菜单与权限种子。

为什么授权要走厂商侧

有人会问:试用授权为什么不让平台端自己发?

因为授权是整个产品体系的一部分:它决定了客户能用哪些模块、什么时候到期、后续怎么转付费。让平台端自己发授权,等于授权数据有第二个真源,长期一定会不一致。

所以链路是单向的:平台端提交开通请求 → 厂商侧生成授权 → 客户端心跳拉取 → 客户后台显示授权状态。平台端只读授权结果,不改。

这条单向性还有一个好处:客户续费或加购模块时,动作落在同一个地方(厂商侧),不需要在多个系统里同步。

幂等:按钮被点两次不能开两个租户

注册接口天然会被重复提交(网络慢、用户着急连点)。防御方式有三层:

  • 业务键唯一:手机号 + 租户短码组合唯一;
  • 请求幂等键:前端每次进入注册页生成一个请求号,服务端按请求号去重;
  • 状态机:租户状态从"待开通"到"已开通"只能前进一次,重复请求返回已有结果而不是新建。

其中第三层最有效:它让"重复请求"变成一个可解释的返回,而不是一个报错。

排障:一次"注册成功但打不开"

真实出现过:注册接口返回成功,后台也能看到租户,但客户访问子域是 404 或空白。

排查顺序是从外到内:

  1. 域名能否解析(DNS 是否已添加);
  2. 解析是否指向正确的站点(通配子域是否生效);
  3. 站点能否正确解析出租户(Host → 租户映射);
  4. 租户是否有可登录的管理员。

结论是第 1 步:新子域没有解析记录。问题不在注册逻辑,而在"注册成功后要做但没做的事"。

修复方式有两个方向:一是注册时把域名配置纳入必做项并给出明确提示;二是在后台租户详情页展示"域名状态"(已生效 / 待配置)。我们两个都做了——把隐性前置条件变成可见状态,比写在文档里有效得多。

试用期到期的设计

试用 30 天到期后,不能直接锁死:

  • 允许登录与查看数据;
  • 禁止新增业务数据;
  • 后台顶部明确显示剩余天数与升级入口;
  • 到期前 7 天开始提醒。

这样客户不会因为"突然不能用"而流失,转化路径也更自然。

小结

自助开通的价值是把销售流程变成产品流程,但它的技术难点不在注册表单,而在跨端链路的完整性与可解释性:每一步都要有状态、有日志、有可见的失败原因。否则"打不开"三个字会让支持团队查一整天。

本文属于「开发文档」系列,记录鲜花交易系统(PHP + ThinkPHP 8 + MySQL 8)的实际研发进展。想了解功能清单与报价,可前往系统报价或联系我们。