实施美团式的支付流程,并增强相关功能

- 将支付流程统一至礼品支付页面,禁止从阅读页面进行支付,以优化用户体验。
- 更新了礼物支付详情页面,为发起人和朋友展示了不同的用户界面元素,包括为发起人提供的分享按钮和为朋友提供的支付按钮。
- 增强了后端逻辑,以确保在支付处理过程中正确将收益归因于发起人。
- 增加了每日章节更新,并改进了章节页面的加载状态,以提升用户交互体验。
- 更新了文档,以反映新的支付流程和相关变更。
This commit is contained in:
Alex-larget
2026-03-17 12:15:08 +08:00
parent 0d12ab1d07
commit 601044ec60
30 changed files with 822 additions and 238 deletions

View File

@@ -17,6 +17,7 @@ import accessManager from '../../utils/chapterAccessManager'
import readingTracker from '../../utils/readingTracker'
const { parseScene } = require('../../utils/scene.js')
const contentParser = require('../../utils/contentParser.js')
const { trackClick } = require('../../utils/trackClick')
const app = getApp()
@@ -65,9 +66,6 @@ Page({
// 弹窗
showShareModal: false,
showGiftShareModal: false,
shareMode: '', // 'gift' = 代付分享onShareAppMessage 返回 gift-pay/detail
giftRequestSn: '', // 代付请求号,分享时用
showLoginModal: false,
agreeProtocol: false,
showPosterModal: false,
@@ -97,13 +95,15 @@ Page({
// 支持 scene扫码、mid、id、ref、gift代付
const sceneStr = (options && options.scene) || ''
const parsed = parseScene(sceneStr)
const mid = options.mid ? parseInt(options.mid, 10) : (parsed.mid || app.globalData.initialSectionMid || 0)
let id = options.id || parsed.id || app.globalData.initialSectionId
const ref = options.ref || parsed.ref
const isGift = options.gift === '1' || options.gift === 'true'
// 代付统一到代付页gift=1&ref=requestSn 时直接跳转,禁止在阅读页代付
if (isGift && ref) {
wx.setStorageSync('gift_for_ref', ref) // 代付模式:好友打开后,购买时传 giftFor后端待支持
wx.redirectTo({ url: `/pages/gift-pay/detail?requestSn=${encodeURIComponent(ref)}` })
return
}
const mid = options.mid ? parseInt(options.mid, 10) : (parsed.mid || app.globalData.initialSectionMid || 0)
let id = options.id || parsed.id || app.globalData.initialSectionId
if (app.globalData.initialSectionMid) delete app.globalData.initialSectionMid
if (app.globalData.initialSectionId) delete app.globalData.initialSectionId
@@ -657,7 +657,7 @@ Page({
this.setData({ showShareModal: false })
},
// 代付分享弹窗:创建代付请求后分享到代付页面
// 找好友代付:创建代付请求后跳转代付页(美团式,在代付页分享)
async showGiftShareModal() {
if (!app.globalData.userInfo?.id) {
wx.showToast({ title: '请先登录', icon: 'none' })
@@ -682,7 +682,7 @@ Page({
})
wx.hideLoading()
if (res && res.success && res.requestSn) {
this.setData({ showGiftShareModal: true, giftRequestSn: res.requestSn })
wx.navigateTo({ url: `/pages/gift-pay/detail?requestSn=${res.requestSn}` })
} else {
wx.showToast({ title: res?.error || '创建失败', icon: 'none' })
}
@@ -692,20 +692,6 @@ Page({
}
},
closeGiftShareModal() {
this.setData({ showGiftShareModal: false })
},
// 分享给好友(代付):引导用户点右上角,分享到代付详情页
shareGiftToFriend() {
this.setData({ shareMode: 'gift', showGiftShareModal: false })
wx.showToast({
title: '请点击右上角「...」→ 发送给好友',
icon: 'none',
duration: 2500
})
},
// 复制链接
copyLink() {
const userInfo = app.globalData.userInfo
@@ -741,29 +727,17 @@ Page({
})
},
// 分享到微信 - 自动带分享人IDshareMode=gift 时分享到代付详情页
// 分享到微信 - 自动带分享人ID
onShareAppMessage() {
const { section, sectionId, sectionMid, shareMode, giftRequestSn } = this.data
trackClick('read', 'btn_click', '分享_' + this.data.sectionId)
const { section, sectionId, sectionMid } = this.data
const ref = app.getMyReferralCode()
const q = sectionMid ? `mid=${sectionMid}` : `id=${sectionId}`
let path = ref ? `/pages/read/read?${q}&ref=${ref}` : `/pages/read/read?${q}`
let title = section?.title
const path = ref ? `/pages/read/read?${q}&ref=${ref}` : `/pages/read/read?${q}`
const title = section?.title
? `📚 ${section.title.length > 20 ? section.title.slice(0, 20) + '...' : section.title}`
: '📚 Soul创业派对 - 真实商业故事'
if (shareMode === 'gift' && giftRequestSn) {
path = `/pages/gift-pay/detail?requestSn=${giftRequestSn}`
title = '好友请你帮忙代付 - Soul创业派对'
this.setData({ shareMode: '', giftRequestSn: '' })
} else {
title = section?.title
? `📚 ${section.title.length > 20 ? section.title.slice(0, 20) + '...' : section.title}`
: '📚 Soul创业派对 - 真实商业故事'
}
return {
title,
path
// 不设置 imageUrl使用当前阅读页截图作为分享卡片中间图片
}
return { title, path }
},
// 底部「分享到朋友圈」按钮点击:微信不支持 button open-type=shareTimeline只能通过右上角菜单分享点击时引导用户
@@ -775,16 +749,12 @@ Page({
})
},
// 分享到朋友圈:带文章标题,过长时截断shareMode=gift 时 query 带 gift=1
// 分享到朋友圈:带文章标题,过长时截断
onShareTimeline() {
const { section, sectionId, sectionMid, chapterTitle, shareMode } = this.data
const { section, sectionId, sectionMid, chapterTitle } = this.data
const ref = app.getMyReferralCode()
const q = sectionMid ? `mid=${sectionMid}` : `id=${sectionId}`
let query = ref ? `${q}&ref=${ref}` : q
if (shareMode === 'gift' && ref) {
query = `${q}&ref=${ref}&gift=1`
this.setData({ shareMode: '' })
}
const query = ref ? `${q}&ref=${ref}` : q
const articleTitle = (section?.title || chapterTitle || '').trim()
const title = articleTitle
? (articleTitle.length > 28 ? articleTitle.slice(0, 28) + '...' : articleTitle)
@@ -918,6 +888,7 @@ Page({
// 购买章节 - 直接调起支付
async handlePurchaseSection() {
trackClick('read', 'btn_click', '购买章节_' + this.data.sectionId)
console.log('[Pay] 点击购买章节按钮')
wx.showLoading({ title: '处理中...', mask: true })