thinkphp分销裂变需稳建邀请关系树与准算佣金不重不漏:推荐path字段或user_ancestor冗余表存关系,邀请码校验防作弊,commissionservice服务化+幂等化结算,退款反向扣佣。

ThinkPHP 实现分销裂变,核心是两件事:**稳建邀请关系树** + **准算佣金不重不漏**。关系链不能靠临时递归查,佣金逻辑不能散在控制器里——否则订单一多就卡、一改规则就崩、一退单就资损。
邀请关系怎么存才靠谱
别只用 parent_id 字段硬连。查下级要 N+1,算三级佣金得连查 3 次,高并发下数据库直呼吃不消。
- 推荐加 path 字段(如 "0-100-205-318"),注册时由上级 path 拼接生成,开头固定为 0
- path 字段设为 VARCHAR(255),支持至少 5 级以上深度
- 或更进一步,建 user_ancestor 冗余表:每条记录存 user_id、ancestor_id、level(1=直推,2=间推…),用户注册/换上级时一次性补全所有祖先路径
- 两者都建议加索引:
KEY idx_path (path)或KEY idx_anc (ancestor_id, level)
邀请码与裂变追踪怎么做
邀请码不是摆设,它是裂变链路的唯一入口。
- 每个用户生成 8–10 位唯一邀请码(字母数字组合),存在 users 表或独立 invite_codes 表
- 新用户注册时提交邀请码,后端校验有效性,并写入 inviter_id 和 invite_time
- 防作弊必须做:同一设备 ID / IP / 手机号 24 小时内最多记 3 次有效邀请
- 奖励触发点要明确:注册、首单支付、复购完成等行为,通过事件(如
UserRegistered、OrderPaid)驱动奖励发放
佣金结算必须服务化 + 幂等化
佣金不是“订单完成就发钱”,而是“按规则、按状态、按幂等标识精准落账”。
- 抽离 CommissionService 类,封装所有计算逻辑;控制器只负责触发事件(如
event('OrderPaid', $order)) - 佣金比例走配置:存在 commission_levels 表或配置文件,字段含
level、rate、min_amount、可选category_id或user_tier - 结算前生成唯一 settlement_id(如 order_88923_settle_v1),查
commission_log表确认未处理再执行 - 关键操作进事务:
SELECT ... FOR UPDATE锁住当前用户及其上级几条记录,避免并发重复结算 - 退款必须反向扣佣:同样走 CommissionService,传入负金额 + 原 settlement_id,保证账务可追溯、可对冲
查下级、算层级、分组展示
前端常要“显示我下面一级、二级、三级分别有谁”,别用 with 关联或 PHP 层循环 explode。
- 用 path 查询全部下级:
User::where('path', 'like', $user->path . '-%')->select() - MySQL 内算层级差:
LENGTH(path) - LENGTH(REPLACE(path, '-', '')) - LENGTH('$userPath') + LENGTH(REPLACE('$userPath', '-', '')),结果即为相对级数 - 更省事:在 users 表加 level 字段(相对于平台根节点),业务层维护;查某人第 N 级下线直接
WHERE level = {$userLevel + $n} - 高频查询场景,建议把 level 单独建字段并加索引,避免每次字符串计算
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











