ThinkPHP5实现小程序分享绑定上下级关系

一、整体流程设计

  1. 小程序端:
    • 分享时携带加密的分享者用户ID
    • 新用户解析分享链接中的邀请参数
    • 注册/登录时提交邀请人ID绑定关系
  2. 后端实现:
    • 生成带邀请参数的分享链接
    • 验证邀请关系并绑定
    • 数据库存储层级关系

二、数据库设计

CREATE TABLE `user` (

 `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

 `openid` varchar(50) NOT NULL COMMENT '小程序openid',

 `nickname` varchar(50) COMMENT '昵称',

 `inviter_id` int(11) DEFAULT 0 COMMENT '邀请人ID',

 `create_time` datetime DEFAULT NULL

);



CREATE TABLE `user_relation` (

 `id` int(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

 `user_id` int(11) NOT NULL COMMENT '用户ID',

 `parent_id` int(11) NOT NULL COMMENT '直接上级ID',

 `ancestor_id` int(11) NOT NULL COMMENT '顶级祖先ID',

 `level` tinyint(4) DEFAULT 1 COMMENT '层级'

);

三、核心代码实现

1. 小程序端分享功能

// 分享按钮事件

onShareAppMessage() {

 const inviterId = wx.getStorageSync('userId');

 return {

 title: '分享标题',

 path: `/pages/index/index?inviter=${btoa(String(inviterId))}`,

 imageUrl: '/images/share.jpg'

 }

}

2. ThinkPHP5后端实现

// 用户登录/注册接口

public function login()

{

 $code = input('code');

 $inviterCode = input('inviter');

 

 // 获取openid

 $wxData = $this->getOpenid($code);

 $user = UserModel::get(['openid' => $wxData['openid']]);

 

 if(!$user) {

 $user = new UserModel;

 $user->openid = $wxData['openid'];

 

 if($inviterCode) {

 $inviterId = base64_decode($inviterCode);

 if(UserModel::get($inviterId)) {

 $user->inviter_id = $inviterId;

 $this->bindRelation($user->id, $inviterId);

 }

 }

 $user->save();

 }

 return json(['user_id' => $user->id]);

}



// 绑定关系方法

private function bindRelation($userId, $inviterId)

{

 $data = [

 'user_id' => $userId,

 'parent_id' => $inviterId,

 'ancestor_id' => $inviterId,

 'level' => 1

 ];

 UserRelation::create($data);

}

四、安全增强方案

措施实现方式
邀请码加密使用ThinkPHP加密类+APP_KEY
防作弊禁止自邀请、单用户单绑定
时效控制链接添加时间戳和签名

五、流程示意图

1. 用户A分享 → 生成带加密ID的链接
2. 用户B打开链接 → 解析邀请参数
3. 用户B注册 → 绑定与A的上下级关系
4. 关系写入user_relation表

六、注意事项

  • ❗ 小程序路径参数有长度限制
  • ❗ 使用事务保证数据一致性
  • ❗ 百万级用户需优化关系查询
  • ❗ 定期清理无效邀请关系

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部