日期: 2026-05-25
状态: 已审批
通过微信小程序原生分享卡片(Forward Message),携带加密邀请参数。接收方点击卡片进入小程序,后端根据邀请码类型自动处理注册/登录/绑定。三种邀请卡片分别对应不同的业务场景和入口。
| 类型 | type 值 | 入口页面 | 生成条件 | 接收方行为 |
|---|---|---|---|---|
| 邀请孩子 | child |
孩子管理 → 每个孩子旁的「邀请」按钮 | 该孩子已在家庭中,有手机号 | 获取手机号 → 匹配 → 自动注册/登录 → 进入孩子端 |
| 邀请家人 | family |
我的页面 → 「邀请家人」按钮 | 用户已有家庭 | 获取手机号 → 匹配 → 加入家庭 → 登录 |
| 邀请规划师 | guide |
成长档案管理 → 「邀请规划师」按钮 | 用户已有家庭 | 打开规划师注册页 → 绑定家庭 |
使用微信小程序原生 wx.shareAppMessage 分享卡片,卡片信息包含:
?invite_code=xxx接收方打开小程序时,App.onLaunch / Page.onLoad 可获取 invite_code 参数。
后端生成统一的邀请码,前缀标识类型 + 随机码:
示例:CHILD_a1b2c3、FAMILY_d4e5f6、GUIDE_g7h8i9
每个邀请码含:
type:业务类型(child/family/guide)ref_id:关联 ID(childId / familyId)code:唯一邀请码字符串created_at:创建时间expires_at:过期时间(24小时)used:是否已使用POST /api/user/invite-card/generate
Request: { type: "child"|"family"|"guide", refId: childId|familyId|familyId }
Response: { code: "CHILD_a1b2c3", expiresAt: "2026-05-26T12:00:00" }
POST /api/user/invite-card/accept
Request: { code: "CHILD_a1b2c3", encryptedData: "", iv: "", phone?: "139..." }
Response: { token, userId, role, familyId, ... }
流程:
POST /api/user/invite-card/verify
Request: { code: "CHILD_a1b2c3" }
Response: { type: "child", nickname: "小明", familyName: "张三家庭" }
CREATE TABLE invite_card (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
type VARCHAR(20) NOT NULL COMMENT 'child/family/guide',
code VARCHAR(64) NOT NULL UNIQUE COMMENT '邀请码',
ref_id BIGINT NOT NULL COMMENT '关联ID(childId/familyId)',
creator_id BIGINT NOT NULL COMMENT '创建人',
expires_at DATETIME NOT NULL COMMENT '过期时间',
used TINYINT DEFAULT 0 COMMENT '是否已使用',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_code (code),
INDEX idx_ref_type (ref_id, type)
) COMMENT='邀请卡片';
| 页面 | 添加内容 |
|---|---|
pages/profile/children.vue |
每个孩子卡片右下角加「邀请」按钮 → 生成 child 类型卡片 → wx.shareAppMessage |
pages/profile/profile.vue |
菜单列表加「邀请家人」→ 生成 family 类型卡片 |
pages/growth/index.vue |
加「邀请规划师」按钮 → 生成 guide 类型卡片 |
使用 button open-type="share" 触发分享,在 onShareAppMessage 中设置:
onShareAppMessage() {
return {
title: 'xxx 邀请你加入家庭',
path: '/pages/login/login?invite_code=CHILD_a1b2c3',
imageUrl: '/static/invite-card.png'
}
}
login.vue 的 onLoad 中检测 invite_code:
onLoad(options) {
if (options.invite_code) {
this.inviteCode = options.invite_code
}
}
invite_codeacceptInviteCard(code, encryptedData, iv)