Yii框架不内置分销分佣逻辑,需自主设计:用user_referrals表存两级关系(level仅1或2),注册时一次性写入;佣金由CommissionCalculator类计算并存commission_records;结算前生成电子发票、加Redis锁、校验层级、敏感字段AES加密;上线前须运行console命令验证链路与模拟分佣。

Yii 框架本身不内置分销分佣逻辑,需结合业务规则自主设计。核心难点不在框架选型,而在关系链建模、佣金触发时机、多级计算边界和合规拦截——尤其要规避 A→B→C→D 这类三级以上结构,否则存在法律风险。
分销关系链的 Yii 实现要点
用一张 user_referrals 表记录邀请关系,字段至少包含:id、referee_id(被邀请人)、referrer_id(邀请人)、level(层级,只允许 1 或 2)、created_at。不要用递归查询查全链路,而是在用户注册时由邀请码一次性写入两级关系:
- 用户 A 注册 → 生成邀请码;
- 用户 B 用 A 的码注册 → 写入
referrer_id=A, referee_id=B, level=1; - 用户 C 用 B 的码注册 → 同时写入两条:
referrer_id=B, referee_id=C, level=1和referrer_id=A, referee_id=C, level=2(A 是间接上级); - 用户 D 用 C 的码注册 → 不再向上写入 level=3 记录,系统直接拒绝或忽略。
佣金计算逻辑封装建议
避免在 Controller 里硬写分佣逻辑。推荐新建 CommissionCalculator 类,接收订单对象后返回明细数组:
- 按商品分类查配置表 commission_rules,获取该 SKU 的基础佣金率(如 10%)和等级奖励(如 V3 用户额外+3%);
- 查 user_referrals 中
referee_id = 当前买家的所有记录,只取level IN (1,2)的 referrer_id; - 对每个有效上级,按其会员等级查 member_levels 表得奖励系数,叠加计算最终佣金;
- 所有结果存入 commission_records 表,含订单号、分销商ID、金额、状态(pending/processed)、level。
结算与合规控制关键点
Yii 后端必须主动干预税务与资金安全:
- 佣金结算前调用
TaxInvoiceGenerator::autoCreate($record)生成电子凭证,字段含收款方身份证/税号、金额、开票时间; - 使用 Redis 锁(
Yii::$app->redis->setex('lock:order:'.$orderNo, 30, 1))防止同一订单重复触发分佣; - 在
beforeSave()中校验:若某次计算出的上级超过 2 级,自动设为 0 并记录审计日志; - 所有敏感字段(如身份证、银行卡号)入库前必须 AES-256 加密,密钥由环境变量注入,不可硬编码。
调试与上线前必做检查
用 Yii 的 console 应用写几个验证命令:
-
php yii commission/test-chain 12345—— 输入买家 ID,输出其完整两级上级链及各环节佣金预估值; -
php yii commission/dry-run 98765—— 模拟订单 98765 的分佣全流程,不落库,只打印 SQL 和返回结构; - 开启数据库慢查询日志,重点监控 user_referrals 表 JOIN 订单表的查询耗时,必要时给
referee_id + level加联合索引。


















