feat: 小程序真实微信支付功能

新增:
1. /api/miniprogram/pay - 创建预支付订单API
2. /api/miniprogram/pay/notify - 支付回调处理
3. /api/miniprogram/login - 小程序登录获取openId

配置:
- 小程序AppID: wxb8bbb2b10dec74aa
- 商户号: 1318592501
- 回调地址: https://soul.cunbao.net/api/miniprogram/pay/notify

更新:
- app.js: 添加getOpenId方法,支付前获取openId
- read.js: processPayment调用真实支付接口
- 支持API不可用时回退到测试模式
This commit is contained in:
卡若
2026-01-23 05:44:21 +08:00
parent b60edb3d47
commit 0a5d470fef
5 changed files with 646 additions and 45 deletions

View File

@@ -6,10 +6,14 @@
App({
globalData: {
// API基础地址
baseUrl: 'https://soul.ckb.fit',
baseUrl: 'https://soul.cunbao.net',
// 小程序配置
appId: 'wxb8bbb2b10dec74aa',
// 用户信息
userInfo: null,
openId: null, // 微信openId支付必需
isLoggedIn: false,
// 书籍数据
@@ -170,7 +174,7 @@ App({
})
},
// 登录方法 - 支持模拟登录回退
// 登录方法 - 获取openId用于支付
async login() {
try {
// 获取微信登录code
@@ -181,37 +185,80 @@ App({
})
})
console.log('[App] 获取登录code成功')
try {
// 尝试发送code到服务器
const res = await this.request('/api/wechat/login', {
// 发送code到服务器获取openId
const res = await this.request('/api/miniprogram/login', {
method: 'POST',
data: { code: loginRes.code }
})
if (res.success && res.data) {
// 保存用户信息
this.globalData.userInfo = res.data.user
this.globalData.isLoggedIn = true
this.globalData.purchasedSections = res.data.user.purchasedSections || []
this.globalData.hasFullBook = res.data.user.hasFullBook || false
// 保存openId
if (res.data.openId) {
this.globalData.openId = res.data.openId
wx.setStorageSync('openId', res.data.openId)
console.log('[App] 获取openId成功')
}
wx.setStorageSync('userInfo', res.data.user)
wx.setStorageSync('token', res.data.token)
// 保存用户信息
if (res.data.user) {
this.globalData.userInfo = res.data.user
this.globalData.isLoggedIn = true
this.globalData.purchasedSections = res.data.user.purchasedSections || []
this.globalData.hasFullBook = res.data.user.hasFullBook || false
wx.setStorageSync('userInfo', res.data.user)
wx.setStorageSync('token', res.data.token || '')
}
return res.data
}
} catch (apiError) {
console.log('API登录失败使用模拟登录:', apiError)
console.log('[App] API登录失败使用模拟登录:', apiError.message)
}
// API不可用时使用模拟登录
return this.mockLogin()
} catch (e) {
console.error('登录失败:', e)
console.error('[App] 登录失败:', e)
// 最后尝试模拟登录
return this.mockLogin()
}
},
// 获取openId (支付必需)
async getOpenId() {
// 先检查缓存
const cachedOpenId = wx.getStorageSync('openId')
if (cachedOpenId) {
this.globalData.openId = cachedOpenId
return cachedOpenId
}
// 没有缓存则登录获取
try {
const loginRes = await new Promise((resolve, reject) => {
wx.login({ success: resolve, fail: reject })
})
const res = await this.request('/api/miniprogram/login', {
method: 'POST',
data: { code: loginRes.code }
})
if (res.success && res.data?.openId) {
this.globalData.openId = res.data.openId
wx.setStorageSync('openId', res.data.openId)
return res.data.openId
}
} catch (e) {
console.error('[App] 获取openId失败:', e)
}
return null
},
// 模拟登录(后端不可用时使用)
mockLogin() {