ThinkPHP5实现小程序分享绑定上下级关系
一、整体流程设计
- 小程序端:
- 分享时携带加密的分享者用户ID
- 新用户解析分享链接中的邀请参数
- 注册/登录时提交邀请人ID绑定关系
- 后端实现:
- 生成带邀请参数的分享链接
- 验证邀请关系并绑定
- 数据库存储层级关系
二、数据库设计
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表
六、注意事项
- ❗ 小程序路径参数有长度限制
- ❗ 使用事务保证数据一致性
- ❗ 百万级用户需优化关系查询
- ❗ 定期清理无效邀请关系
发表评论 取消回复