feat(invite): 优化邀请参数解析和处理逻辑

- 重构 invite 工具函数,增强参数解析能力
- 添加参数调试工具,便于排查问题
- 优化用户登录后的邀请关系处理流程- 调整 API调用,统一使用 dealerId替代 refereeId
- 移除未使用的导入和冗余代码
This commit is contained in:
2025-08-26 18:53:14 +08:00
parent 0a6f21d182
commit 24c6e6c0fd
13 changed files with 358 additions and 64 deletions

View File

@@ -15,22 +15,41 @@ export interface InviteParams {
*/
export function parseInviteParams(options: any): InviteParams | null {
try {
console.log('开始解析邀请参数完整options:', JSON.stringify(options))
// 优先从 query.scene 参数中解析邀请信息
let sceneStr = null
if (options.query && options.query.scene) {
sceneStr = typeof options.query.scene === 'string' ? options.query.scene : String(options.query.scene)
console.log('从query.scene解析参数:', sceneStr, '类型:', typeof sceneStr)
} else if (options.scene) {
// 兼容直接从 scene 参数解析
sceneStr = typeof options.scene === 'string' ? options.scene : String(options.scene)
console.log('从options.scene解析参数:', sceneStr, '类型:', typeof sceneStr)
}
// 从 scene 参数中解析邀请信息
if (options.scene) {
// 确保 scene 是字符串类型
const sceneStr = typeof options.scene === 'string' ? options.scene : String(options.scene)
console.log('解析scene参数:', sceneStr)
if (sceneStr) {
// 处理 uid_xxx 格式的邀请码
if (sceneStr.startsWith('uid_')) {
const inviterId = sceneStr.replace('uid_', '')
console.log('提取的邀请人ID:', inviterId)
if (inviterId && !isNaN(parseInt(inviterId))) {
console.log('检测到uid格式邀请码:', inviterId)
return {
const parsedInviterId = parseInt(inviterId)
console.log('检测到uid格式邀请码邀请人ID:', parsedInviterId)
const inviteParams = {
inviter: inviterId,
source: 'qrcode',
t: Date.now().toString()
}
console.log('返回的邀请参数:', inviteParams)
return inviteParams
} else {
console.log('邀请人ID无效:', inviterId)
}
}
@@ -59,6 +78,8 @@ export function parseInviteParams(options: any): InviteParams | null {
console.log('检测到传统格式邀请码:', params)
return params
}
} else {
console.log('options中没有scene参数或query.scene参数')
}
// 从 query 参数中解析邀请信息(兼容旧版本)
@@ -81,11 +102,17 @@ export function parseInviteParams(options: any): InviteParams | null {
*/
export function saveInviteParams(params: InviteParams) {
try {
Taro.setStorageSync('invite_params', {
const saveData = {
...params,
timestamp: Date.now()
})
console.log('邀请参数已保存:', params)
}
Taro.setStorageSync('invite_params', saveData)
console.log('邀请参数已保存到本地存储:', saveData)
// 验证保存是否成功
const saved = Taro.getStorageSync('invite_params')
console.log('验证保存结果:', saved)
} catch (error) {
console.error('保存邀请参数失败:', error)
}
@@ -97,21 +124,28 @@ export function saveInviteParams(params: InviteParams) {
export function getStoredInviteParams(): InviteParams | null {
try {
const stored = Taro.getStorageSync('invite_params')
console.log('从本地存储获取的邀请参数:', stored)
if (stored && stored.inviter) {
// 检查是否过期24小时
const now = Date.now()
const expireTime = 24 * 60 * 60 * 1000 // 24小时
if (now - stored.timestamp < expireTime) {
return {
const result = {
inviter: stored.inviter,
source: stored.source || 'unknown',
t: stored.t
}
console.log('返回有效的邀请参数:', result)
return result
} else {
console.log('邀请参数已过期,清除本地存储')
// 过期则清除
clearInviteParams()
}
} else {
console.log('本地存储中没有有效的邀请参数')
}
return null
} catch (error) {
@@ -159,7 +193,7 @@ export async function handleInviteRelation(userId: number): Promise<boolean> {
// 使用新的绑定推荐关系接口
await bindRefereeRelation({
refereeId: inviterId,
dealerId: inviterId,
userId: userId,
source: inviteParams.source || 'qrcode',
scene: inviteParams.source === 'qrcode' ? `uid_${inviterId}` : `inviter=${inviterId}&source=${inviteParams.source}&t=${inviteParams.t}`
@@ -275,20 +309,68 @@ export function trackInviteSource(source: string, inviterId?: number) {
}
}
/**
* 调试工具:打印所有邀请相关的存储信息
*/
export function debugInviteInfo() {
try {
console.log('=== 邀请参数调试信息 ===')
// 获取启动参数
const launchOptions = Taro.getLaunchOptionsSync()
console.log('启动参数:', JSON.stringify(launchOptions, null, 2))
// 获取存储的邀请参数
const storedParams = Taro.getStorageSync('invite_params')
console.log('存储的邀请参数:', JSON.stringify(storedParams, null, 2))
// 获取用户信息
const userId = Taro.getStorageSync('UserId')
const userInfo = Taro.getStorageSync('userInfo')
console.log('用户ID:', userId)
console.log('用户信息:', JSON.stringify(userInfo, null, 2))
// 获取邀请统计
const inviteTracks = Taro.getStorageSync('invite_tracks')
console.log('邀请统计:', JSON.stringify(inviteTracks, null, 2))
console.log('=== 调试信息结束 ===')
return {
launchOptions,
storedParams,
userId,
userInfo,
inviteTracks
}
} catch (error) {
console.error('获取调试信息失败:', error)
return null
}
}
/**
* 检查并处理当前用户的邀请关系
* 用于在用户登录后立即检查是否需要建立邀请关系
*/
export async function checkAndHandleInviteRelation(): Promise<boolean> {
try {
// 打印调试信息
debugInviteInfo()
// 获取当前用户信息
const userInfo = Taro.getStorageSync('userInfo')
if (!userInfo || !userInfo.userId) {
const userId = Taro.getStorageSync('UserId')
const finalUserId = userId || userInfo?.userId
if (!finalUserId) {
console.log('用户未登录,无法处理邀请关系')
return false
}
return await handleInviteRelation(userInfo.userId)
console.log('使用用户ID处理邀请关系:', finalUserId)
return await handleInviteRelation(parseInt(finalUserId))
} catch (error) {
console.error('检查邀请关系失败:', error)
return false
@@ -353,7 +435,7 @@ export async function bindReferee(refereeId: number, userId?: number, source: st
}
await bindRefereeRelation({
refereeId: refereeId,
dealerId: refereeId,
userId: targetUserId,
source: source,
scene: source === 'qrcode' ? `uid_${refereeId}` : undefined