forked from gxwebsoft/mp-10550
feat(invite): 优化邀请参数解析和处理逻辑
- 重构 invite 工具函数,增强参数解析能力 - 添加参数调试工具,便于排查问题 - 优化用户登录后的邀请关系处理流程- 调整 API调用,统一使用 dealerId替代 refereeId - 移除未使用的导入和冗余代码
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user