import accessManager from '../../utils/chapterAccessManager' const app = getApp() const { trackClick } = require('../../utils/trackClick') Page({ data: { statusBarHeight: 44, isVip: false, daysRemaining: 0, expireDateStr: '', price: 1980, originalPrice: 6980, /* 按 premium_membership_landing_v1 设计稿 */ contentRights: [ { title: '解锁全部章节', desc: '365天全案精读', icon: 'book-open' }, { title: '案例库', desc: '100+创业实战案例', icon: 'book-open' }, { title: '智能纪要', desc: 'AI每日精华推送', icon: 'lightbulb' }, { title: '会议纪要库', desc: '往期完整沉淀', icon: 'folder' } ], socialRights: [ { title: '匹配创业伙伴', desc: '精准人脉匹配', icon: 'users' }, { title: '创业老板排行', desc: '项目曝光展示', icon: 'bar-chart' }, { title: '链接资源', desc: '深度私域资源池', icon: 'link' }, { title: '专属VIP标识', desc: '金色尊享光圈', icon: 'check' } ], purchasing: false }, onLoad() { wx.showShareMenu({ withShareTimeline: true }) this.setData({ statusBarHeight: app.globalData.statusBarHeight }) this.loadVipInfo() }, async loadVipInfo() { const userId = app.globalData.userInfo?.id if (!userId) return try { const res = await app.request({ url: `/api/miniprogram/vip/status?userId=${userId}`, silent: true }) if (res?.success) { const d = res.data let expStr = '' if (d.expireDate) { const dt = new Date(d.expireDate) expStr = `${dt.getFullYear()}-${String(dt.getMonth()+1).padStart(2,'0')}-${String(dt.getDate()).padStart(2,'0')}` } // 同步 VIP 状态到全局(与「我的」页保持一致) const isVip = !!d.isVip app.globalData.isVip = isVip app.globalData.vipExpireDate = d.expireDate || expStr || '' const userInfo = app.globalData.userInfo || {} userInfo.isVip = isVip userInfo.vipExpireDate = app.globalData.vipExpireDate app.globalData.userInfo = userInfo wx.setStorageSync('userInfo', userInfo) this.setData({ isVip, daysRemaining: d.daysRemaining, expireDateStr: expStr, price: d.price || 1980 }) } } catch (e) { console.log('[VIP] 加载失败', e) } }, async handlePurchase() { trackClick('vip', 'btn_click', '开通VIP') let userId = app.globalData.userInfo?.id let openId = app.globalData.openId || app.globalData.userInfo?.open_id if (!userId || !openId) { wx.showLoading({ title: '登录中...', mask: true }) try { await app.login() userId = app.globalData.userInfo?.id openId = app.globalData.openId || app.globalData.userInfo?.open_id wx.hideLoading() if (!userId || !openId) { wx.showToast({ title: '登录失败,请重试', icon: 'none' }) return } } catch (e) { wx.hideLoading() wx.showToast({ title: '登录失败', icon: 'none' }) return } } // 支付前:若头像/昵称仍为默认值,引导先完善(仅头像+昵称) if (this._shouldGuideAvatarNickname()) { wx.showModal({ title: '完善资料', content: '开通超级个体前,请先设置头像和昵称,让他人更好地认识你', confirmText: '去完善', cancelText: '稍后', success: (res) => { if (res.confirm) wx.navigateTo({ url: '/pages/avatar-nickname/avatar-nickname' }) } }) return } this.setData({ purchasing: true }) const amount = this.data.price try { // 0. 尝试余额支付(若余额足够) const referralCode = wx.getStorageSync('referral_code') || '' try { const balanceRes = await app.request({ url: `/api/miniprogram/balance?userId=${userId}`, silent: true }) const balance = balanceRes?.data?.balance || 0 if (balance >= amount) { const consumeRes = await app.request({ url: '/api/miniprogram/balance/consume', method: 'POST', data: { userId, productType: 'vip', productId: 'vip_annual', amount, referralCode: referralCode || undefined } }) if (consumeRes?.success) { this.setData({ purchasing: false }) wx.showToast({ title: 'VIP开通成功', icon: 'success' }) await this._onVipPaymentSuccess() return } } } catch (e) { console.warn('[VIP] 余额支付失败,改用微信支付:', e) } // 1. 微信支付 const payRes = await app.request('/api/miniprogram/pay', { method: 'POST', data: { openId, userId, productType: 'vip', productId: 'vip_annual', amount, description: '卡若创业派对VIP年度会员(365天)' } }) if (payRes?.success && payRes.data?.payParams) { wx.requestPayment({ ...payRes.data.payParams, success: async () => { wx.showToast({ title: 'VIP开通成功', icon: 'success' }) await this._onVipPaymentSuccess() }, fail: () => wx.showToast({ title: '支付取消', icon: 'none' }) }) } else { wx.showToast({ title: payRes?.error || '支付参数获取失败', icon: 'none' }) } } catch (e) { console.error('[VIP] 购买失败', e) wx.showToast({ title: '购买失败,请稍后重试', icon: 'none' }) } finally { this.setData({ purchasing: false }) } }, async _onVipPaymentSuccess() { wx.showLoading({ title: '同步权益中...', mask: true }) try { await new Promise(r => setTimeout(r, 1500)) await accessManager.refreshUserPurchaseStatus() // 重新拉取 VIP 状态并同步到全局 await this.loadVipInfo() const pages = getCurrentPages() pages.forEach(p => { if (typeof p.initUserStatus === 'function') p.initUserStatus() else if (typeof p.updateUserStatus === 'function') p.updateUserStatus() }) // 开通成功后兜底:仍为默认头像/昵称则引导完善 if (this._shouldGuideAvatarNickname()) { wx.navigateTo({ url: '/pages/avatar-nickname/avatar-nickname' }) } } catch (e) { console.error('[VIP] 支付后同步失败:', e) } wx.hideLoading() }, _shouldGuideAvatarNickname() { const user = app.globalData.userInfo || {} const avatar = (user.avatar || user.avatarUrl || '').trim() const nickname = (user.nickname || user.nickName || '').trim() // 与 ruleEngine.checkRule_FillAvatar 保持同口径(允许前端兜底) if (avatar && !avatar.includes('default') && nickname && nickname !== '微信用户' && !nickname.startsWith('微信用户')) return false return true }, goBack() { getApp().goBackOrToHome() }, onShareAppMessage() { const ref = app.getMyReferralCode() return { title: 'Soul创业派对 - VIP会员', path: ref ? `/pages/vip/vip?ref=${ref}` : '/pages/vip/vip' } }, onShareTimeline() { const ref = app.getMyReferralCode() return { title: 'Soul创业派对 - VIP会员', query: ref ? `ref=${ref}` : '' } } })