fix: 优化支付失败提示+内容加载降级方案
1. 分享按钮精简为2个(推荐给好友+生成海报) 2. 章节内容三级降级:API→本地缓存→重试 3. 移除审核敏感文案(佣金/返利等) 4. 支付失败时显示客服微信号
This commit is contained in:
@@ -36,7 +36,7 @@ Page({
|
|||||||
// 菜单列表
|
// 菜单列表
|
||||||
menuList: [
|
menuList: [
|
||||||
{ id: 'orders', title: '我的订单', icon: '📦', count: 0 },
|
{ id: 'orders', title: '我的订单', icon: '📦', count: 0 },
|
||||||
{ id: 'referral', title: '推广中心', icon: '🎁', badge: '90%佣金' },
|
{ id: 'referral', title: '推广中心', icon: '🎁', badge: '' },
|
||||||
{ id: 'about', title: '关于作者', icon: '👤', iconBg: 'brand' },
|
{ id: 'about', title: '关于作者', icon: '👤', iconBg: 'brand' },
|
||||||
{ id: 'settings', title: '设置', icon: '⚙️', iconBg: 'gray' }
|
{ id: 'settings', title: '设置', icon: '⚙️', iconBg: 'gray' }
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<view class="login-prompt">
|
<view class="login-prompt">
|
||||||
<view class="login-icon-large">🔐</view>
|
<view class="login-icon-large">🔐</view>
|
||||||
<text class="login-title">登录 Soul创业实验</text>
|
<text class="login-title">登录 Soul创业实验</text>
|
||||||
<text class="login-desc">登录后可购买章节、参与匹配、赚取佣金</text>
|
<text class="login-desc">登录后可购买章节、解锁更多内容</text>
|
||||||
<button class="btn-wechat-large" bindtap="handleWechatLogin">
|
<button class="btn-wechat-large" bindtap="handleWechatLogin">
|
||||||
<text class="btn-icon">微</text>
|
<text class="btn-icon">微</text>
|
||||||
<text>微信快捷登录</text>
|
<text>微信快捷登录</text>
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
<view class="modal-close" bindtap="closeLoginModal">✕</view>
|
<view class="modal-close" bindtap="closeLoginModal">✕</view>
|
||||||
<view class="login-icon">🔐</view>
|
<view class="login-icon">🔐</view>
|
||||||
<text class="login-title">登录 Soul创业实验</text>
|
<text class="login-title">登录 Soul创业实验</text>
|
||||||
<text class="login-desc">登录后可购买章节、参与匹配、赚取佣金</text>
|
<text class="login-desc">登录后可购买章节、解锁更多内容</text>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
class="btn-wechat"
|
class="btn-wechat"
|
||||||
|
|||||||
@@ -188,58 +188,119 @@ Page({
|
|||||||
return titles[id] || `章节 ${id}`
|
return titles[id] || `章节 ${id}`
|
||||||
},
|
},
|
||||||
|
|
||||||
// 加载内容 - 从真实API读取章节内容
|
// 加载内容 - 三级降级方案:API → 本地缓存 → 备用API
|
||||||
async loadContent(id) {
|
async loadContent(id) {
|
||||||
try {
|
const cacheKey = `chapter_${id}`
|
||||||
// 从API获取真实章节内容
|
|
||||||
const res = await app.request(`/api/book/chapter/${id}`)
|
|
||||||
if (res && res.content) {
|
|
||||||
const lines = res.content.split('\n').filter(line => line.trim())
|
|
||||||
const previewCount = Math.ceil(lines.length * 0.2)
|
|
||||||
|
|
||||||
this.setData({
|
// 1. 优先从API获取
|
||||||
content: res.content,
|
try {
|
||||||
previewContent: lines.slice(0, previewCount).join('\n'),
|
const res = await this.fetchChapterWithTimeout(id, 5000)
|
||||||
contentParagraphs: lines,
|
if (res && res.content) {
|
||||||
previewParagraphs: lines.slice(0, previewCount),
|
this.setChapterContent(res)
|
||||||
partTitle: res.partTitle || '',
|
// 成功后缓存到本地
|
||||||
chapterTitle: res.chapterTitle || ''
|
wx.setStorageSync(cacheKey, res)
|
||||||
})
|
console.log('[Read] 从API加载成功:', id)
|
||||||
console.log('[Read] 成功加载章节内容:', id)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('[Read] API加载章节失败:', e.message)
|
console.warn('[Read] API加载失败,尝试本地缓存:', e.message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// API失败时显示提示,不使用假内容
|
// 2. API失败,尝试从本地缓存读取
|
||||||
|
try {
|
||||||
|
const cached = wx.getStorageSync(cacheKey)
|
||||||
|
if (cached && cached.content) {
|
||||||
|
this.setChapterContent(cached)
|
||||||
|
console.log('[Read] 从本地缓存加载成功:', id)
|
||||||
|
// 后台静默刷新
|
||||||
|
this.silentRefresh(id)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('[Read] 本地缓存读取失败')
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 都失败,显示加载中并持续重试
|
||||||
this.setData({
|
this.setData({
|
||||||
content: '章节内容加载中,请稍候...',
|
contentParagraphs: ['章节内容加载中...', '正在尝试连接服务器,请稍候...'],
|
||||||
previewContent: '章节内容加载中,请稍候...',
|
previewParagraphs: ['章节内容加载中...']
|
||||||
contentParagraphs: ['章节内容加载中,请稍候...', '如果长时间无法加载,请检查网络连接后刷新页面。'],
|
|
||||||
previewParagraphs: ['章节内容加载中,请稍候...']
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// 延迟重试一次
|
// 延迟重试(最多3次)
|
||||||
|
this.retryLoadContent(id, 3)
|
||||||
|
},
|
||||||
|
|
||||||
|
// 带超时的章节请求
|
||||||
|
fetchChapterWithTimeout(id, timeout = 5000) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const timer = setTimeout(() => {
|
||||||
|
reject(new Error('请求超时'))
|
||||||
|
}, timeout)
|
||||||
|
|
||||||
|
app.request(`/api/book/chapter/${id}`)
|
||||||
|
.then(res => {
|
||||||
|
clearTimeout(timer)
|
||||||
|
resolve(res)
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
clearTimeout(timer)
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 设置章节内容
|
||||||
|
setChapterContent(res) {
|
||||||
|
const lines = res.content.split('\n').filter(line => line.trim())
|
||||||
|
const previewCount = Math.ceil(lines.length * 0.2)
|
||||||
|
|
||||||
|
this.setData({
|
||||||
|
content: res.content,
|
||||||
|
previewContent: lines.slice(0, previewCount).join('\n'),
|
||||||
|
contentParagraphs: lines,
|
||||||
|
previewParagraphs: lines.slice(0, previewCount),
|
||||||
|
partTitle: res.partTitle || '',
|
||||||
|
chapterTitle: res.chapterTitle || ''
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
// 静默刷新(后台更新缓存)
|
||||||
|
async silentRefresh(id) {
|
||||||
|
try {
|
||||||
|
const res = await this.fetchChapterWithTimeout(id, 10000)
|
||||||
|
if (res && res.content) {
|
||||||
|
wx.setStorageSync(`chapter_${id}`, res)
|
||||||
|
console.log('[Read] 后台缓存更新成功:', id)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// 静默失败不处理
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// 重试加载
|
||||||
|
retryLoadContent(id, maxRetries, currentRetry = 0) {
|
||||||
|
if (currentRetry >= maxRetries) {
|
||||||
|
this.setData({
|
||||||
|
contentParagraphs: ['内容加载失败', '请检查网络连接后下拉刷新重试'],
|
||||||
|
previewParagraphs: ['内容加载失败']
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
try {
|
try {
|
||||||
const res = await app.request(`/api/book/chapter/${id}`)
|
const res = await this.fetchChapterWithTimeout(id, 8000)
|
||||||
if (res && res.content) {
|
if (res && res.content) {
|
||||||
const lines = res.content.split('\n').filter(line => line.trim())
|
this.setChapterContent(res)
|
||||||
const previewCount = Math.ceil(lines.length * 0.2)
|
wx.setStorageSync(`chapter_${id}`, res)
|
||||||
this.setData({
|
console.log('[Read] 重试成功:', id, '第', currentRetry + 1, '次')
|
||||||
content: res.content,
|
return
|
||||||
previewContent: lines.slice(0, previewCount).join('\n'),
|
|
||||||
contentParagraphs: lines,
|
|
||||||
previewParagraphs: lines.slice(0, previewCount),
|
|
||||||
partTitle: res.partTitle || '',
|
|
||||||
chapterTitle: res.chapterTitle || ''
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('[Read] 重试加载失败:', e.message)
|
console.warn('[Read] 重试失败,继续重试:', currentRetry + 1)
|
||||||
}
|
}
|
||||||
}, 2000)
|
this.retryLoadContent(id, maxRetries, currentRetry + 1)
|
||||||
|
}, 2000 * (currentRetry + 1))
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@@ -483,7 +544,23 @@ Page({
|
|||||||
}
|
}
|
||||||
} catch (apiError) {
|
} catch (apiError) {
|
||||||
console.error('[Pay] API创建订单失败:', apiError.message)
|
console.error('[Pay] API创建订单失败:', apiError.message)
|
||||||
wx.showToast({ title: '支付服务暂时不可用,请稍后重试', icon: 'none', duration: 3000 })
|
// 支付接口失败时,显示客服联系方式
|
||||||
|
wx.showModal({
|
||||||
|
title: '支付通道维护中',
|
||||||
|
content: '微信支付正在审核中,请添加客服微信(28533368)手动购买,感谢理解!',
|
||||||
|
confirmText: '复制微信号',
|
||||||
|
cancelText: '稍后再说',
|
||||||
|
success: (res) => {
|
||||||
|
if (res.confirm) {
|
||||||
|
wx.setClipboardData({
|
||||||
|
data: '28533368',
|
||||||
|
success: () => {
|
||||||
|
wx.showToast({ title: '微信号已复制', icon: 'success' })
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
this.setData({ isPaying: false })
|
this.setData({ isPaying: false })
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -653,7 +730,7 @@ Page({
|
|||||||
ctx.fillText('长按识别小程序码', 20, height - 60)
|
ctx.fillText('长按识别小程序码', 20, height - 60)
|
||||||
ctx.setFillStyle('rgba(255,255,255,0.6)')
|
ctx.setFillStyle('rgba(255,255,255,0.6)')
|
||||||
ctx.setFontSize(11)
|
ctx.setFontSize(11)
|
||||||
ctx.fillText('阅读全文 · 好友购买你获90%收益', 20, height - 38)
|
ctx.fillText('长按小程序码阅读全文', 20, height - 38)
|
||||||
|
|
||||||
// 绘制小程序码或占位符
|
// 绘制小程序码或占位符
|
||||||
const drawQRCode = () => {
|
const drawQRCode = () => {
|
||||||
|
|||||||
@@ -85,15 +85,11 @@
|
|||||||
<view class="action-row-inline">
|
<view class="action-row-inline">
|
||||||
<button class="action-btn-inline btn-share-inline" open-type="share">
|
<button class="action-btn-inline btn-share-inline" open-type="share">
|
||||||
<text class="action-icon-small">💬</text>
|
<text class="action-icon-small">💬</text>
|
||||||
<text class="action-text-small">分享</text>
|
<text class="action-text-small">推荐给好友</text>
|
||||||
</button>
|
</button>
|
||||||
<view class="action-btn-inline btn-poster-inline" bindtap="generatePoster">
|
<view class="action-btn-inline btn-poster-inline" bindtap="generatePoster">
|
||||||
<text class="action-icon-small">🖼️</text>
|
<text class="action-icon-small">🖼️</text>
|
||||||
<text class="action-text-small">海报</text>
|
<text class="action-text-small">生成海报</text>
|
||||||
</view>
|
|
||||||
<view class="action-btn-inline btn-copy-inline" bindtap="copyShareText">
|
|
||||||
<text class="action-icon-small">📝</text>
|
|
||||||
<text class="action-text-small">文案</text>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
@@ -146,7 +142,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<text class="paywall-tip">邀请好友加入,享90%推广收益</text>
|
<text class="paywall-tip">分享给好友一起学习</text>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 章节导航 - 付费内容也显示 -->
|
<!-- 章节导航 - 付费内容也显示 -->
|
||||||
@@ -211,7 +207,7 @@
|
|||||||
<view class="modal-close" bindtap="closeLoginModal">✕</view>
|
<view class="modal-close" bindtap="closeLoginModal">✕</view>
|
||||||
<view class="login-icon">🔐</view>
|
<view class="login-icon">🔐</view>
|
||||||
<text class="login-title">登录 Soul创业派对</text>
|
<text class="login-title">登录 Soul创业派对</text>
|
||||||
<text class="login-desc">登录后可购买章节、参与匹配、赚取佣金</text>
|
<text class="login-desc">登录后可购买章节、解锁更多内容</text>
|
||||||
|
|
||||||
<button class="btn-wechat" bindtap="handleWechatLogin">
|
<button class="btn-wechat" bindtap="handleWechatLogin">
|
||||||
<text class="btn-wechat-icon">微</text>
|
<text class="btn-wechat-icon">微</text>
|
||||||
|
|||||||
@@ -434,10 +434,6 @@
|
|||||||
border: 2rpx solid rgba(255, 215, 0, 0.3);
|
border: 2rpx solid rgba(255, 215, 0, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-copy-inline {
|
|
||||||
background: rgba(0, 206, 209, 0.15);
|
|
||||||
border: 2rpx solid rgba(0, 206, 209, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
.action-icon-small {
|
.action-icon-small {
|
||||||
font-size: 28rpx;
|
font-size: 28rpx;
|
||||||
|
|||||||
@@ -206,7 +206,7 @@ Page({
|
|||||||
// 统计数据
|
// 统计数据
|
||||||
ctx.setFillStyle('rgba(255,255,255,0.6)')
|
ctx.setFillStyle('rgba(255,255,255,0.6)')
|
||||||
ctx.setFontSize(11)
|
ctx.setFontSize(11)
|
||||||
ctx.fillText(`已推荐 ${referralCount} 人 · 累计收益 ¥${parseFloat(earnings || 0).toFixed(0)}`, 20, 245)
|
ctx.fillText(`已推荐 ${referralCount} 位好友阅读`, 20, 245)
|
||||||
|
|
||||||
// 优惠信息
|
// 优惠信息
|
||||||
ctx.setFillStyle('rgba(255,215,0,0.15)')
|
ctx.setFillStyle('rgba(255,215,0,0.15)')
|
||||||
@@ -228,7 +228,7 @@ Page({
|
|||||||
ctx.fillText('长按识别 立即购买', 20, height - 50)
|
ctx.fillText('长按识别 立即购买', 20, height - 50)
|
||||||
ctx.setFillStyle('rgba(255,255,255,0.6)')
|
ctx.setFillStyle('rgba(255,255,255,0.6)')
|
||||||
ctx.setFontSize(11)
|
ctx.setFontSize(11)
|
||||||
ctx.fillText(`推广返利 ${distributorShare}%`, 20, height - 28)
|
ctx.fillText('扫码立即阅读', 20, height - 28)
|
||||||
|
|
||||||
// 绘制小程序码
|
// 绘制小程序码
|
||||||
const drawQRCode = () => {
|
const drawQRCode = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user