Files
soul/app/api/referral/visit/route.ts
卡若 395501e961 fix: 修复分销数据不显示和用户ID唯一性问题
1. 分销数据修复:
   - 添加访问记录API,即使未登录也记录访问
   - 登录成功后自动绑定推荐码
   - 在链接访问时立即记录访问统计

2. 支付商品名称修复:
   - 支付时显示完整章节名称而非仅ID
   - 格式:章节9.12-美业整合:一个人的公司如何月入十万

3. 用户ID唯一性修复:
   - 移除mockLogin,必须使用真实微信登录
   - 用户ID使用openId作为唯一标识
   - 同一微信用户每次登录都是同一ID
2026-01-29 11:11:58 +08:00

101 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 推荐访问记录API
* 用于统计「通过链接进的人数」
* 不需要用户登录即可记录
*/
import { NextRequest, NextResponse } from 'next/server'
import { query } from '@/lib/db'
/**
* POST - 记录推荐访问
*/
export async function POST(request: NextRequest) {
try {
const body = await request.json()
const { referralCode, visitorOpenId, visitorId, source, page } = body
if (!referralCode) {
return NextResponse.json({
success: false,
error: '推荐码不能为空'
}, { status: 400 })
}
// 查找推荐人
const referrers = await query(
'SELECT id FROM users WHERE referral_code = ?',
[referralCode]
) as any[]
if (referrers.length === 0) {
return NextResponse.json({
success: false,
error: '推荐码无效'
}, { status: 400 })
}
const referrerId = referrers[0].id
// 记录访问(允许重复访问记录,用于统计总访问次数)
try {
await query(`
INSERT INTO referral_visits (
referrer_id, visitor_id, visitor_openid, source, page, created_at
) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
`, [
referrerId,
visitorId || null,
visitorOpenId || null,
source || 'miniprogram',
page || ''
])
console.log(`[Referral Visit] 记录访问: 推荐人=${referrerId}, 访客openId=${visitorOpenId?.slice(0,10) || 'unknown'}`)
} catch (insertError) {
// 表可能不存在,尝试创建
console.log('[Referral Visit] 插入失败,尝试创建表...')
await query(`
CREATE TABLE IF NOT EXISTS referral_visits (
id INT AUTO_INCREMENT PRIMARY KEY,
referrer_id VARCHAR(50) NOT NULL COMMENT '推广者ID',
visitor_id VARCHAR(50) COMMENT '访客ID可能为空',
visitor_openid VARCHAR(100) COMMENT '访客openId',
source VARCHAR(50) DEFAULT 'miniprogram' COMMENT '来源miniprogram/web/share',
page VARCHAR(200) COMMENT '落地页路径',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_referrer_id (referrer_id),
INDEX idx_visitor_id (visitor_id),
INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
`)
// 重试插入
await query(`
INSERT INTO referral_visits (
referrer_id, visitor_id, visitor_openid, source, page, created_at
) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
`, [
referrerId,
visitorId || null,
visitorOpenId || null,
source || 'miniprogram',
page || ''
])
}
return NextResponse.json({
success: true,
message: '访问已记录'
})
} catch (error) {
console.error('[Referral Visit] 错误:', error)
// 即使出错也返回成功,不影响用户体验
return NextResponse.json({
success: true,
message: '已处理'
})
}
}