|
|
@ -553,13 +553,207 @@ export default { |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 微信在线代付处理(本阶段只定义函数) |
|
|
* 微信在线代付处理 |
|
|
*/ |
|
|
*/ |
|
|
processWechatOnlinePayment(order) { |
|
|
async processWechatOnlinePayment(order) { |
|
|
// TODO: 后续实现微信在线代付功能 |
|
|
try { |
|
|
uni.showToast({ |
|
|
uni.showLoading({ title: '正在发起支付...' }) |
|
|
title: '微信在线代付功能开发中', |
|
|
|
|
|
icon: 'none' |
|
|
// 获取用户的微信openid(异步方法) |
|
|
|
|
|
const openid = await this.getWechatOpenid() |
|
|
|
|
|
|
|
|
|
|
|
if (!openid) { |
|
|
|
|
|
uni.hideLoading() |
|
|
|
|
|
uni.showModal({ |
|
|
|
|
|
title: '提示', |
|
|
|
|
|
content: '未获取到微信授权信息,请重新登录或授权', |
|
|
|
|
|
showCancel: false, |
|
|
|
|
|
success: () => { |
|
|
|
|
|
// 可选:跳转到登录页面 |
|
|
|
|
|
// uni.navigateTo({ url: '/pages/student/login/login' }) |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
console.log('发起微信支付 - 订单ID:', order._raw?.id || order.id) |
|
|
|
|
|
console.log('发起微信支付 - OpenID:', openid.substring(0, 10) + '***') |
|
|
|
|
|
|
|
|
|
|
|
// 调用后端创建微信支付订单 |
|
|
|
|
|
const res = await apiRoute.createWechatPayment({ |
|
|
|
|
|
type: 'wechatpay', |
|
|
|
|
|
trade_type: 'school_order_table', |
|
|
|
|
|
trade_id: order._raw?.id || order.id, |
|
|
|
|
|
openid: openid, |
|
|
|
|
|
return_url: '', |
|
|
|
|
|
quit_url: '', |
|
|
|
|
|
buyer_id: '', |
|
|
|
|
|
voucher: '' |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
uni.hideLoading() |
|
|
|
|
|
|
|
|
|
|
|
if (res.code !== 1 || !res.data) { |
|
|
|
|
|
console.error('创建支付订单失败:', res) |
|
|
|
|
|
uni.showToast({ title: res.msg || '发起支付失败', icon: 'none' }) |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
console.log('支付参数:', res.data) |
|
|
|
|
|
|
|
|
|
|
|
// 唤起微信支付 |
|
|
|
|
|
await this.callWechatPay(res.data) |
|
|
|
|
|
|
|
|
|
|
|
// 支付成功后刷新订单列表 |
|
|
|
|
|
uni.showToast({ title: '支付成功', icon: 'success' }) |
|
|
|
|
|
await this.refresh() |
|
|
|
|
|
this.$emit('payment-success', order) |
|
|
|
|
|
|
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
uni.hideLoading() |
|
|
|
|
|
console.error('微信支付异常:', error) |
|
|
|
|
|
|
|
|
|
|
|
if (error.message?.includes('cancel') || error.message?.includes('取消')) { |
|
|
|
|
|
uni.showToast({ title: '已取消支付', icon: 'none' }) |
|
|
|
|
|
} else { |
|
|
|
|
|
uni.showToast({ title: error.message || '支付失败', icon: 'none' }) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 获取微信openid |
|
|
|
|
|
* @returns {Promise<string>} 微信openid |
|
|
|
|
|
*/ |
|
|
|
|
|
async getWechatOpenid() { |
|
|
|
|
|
try { |
|
|
|
|
|
// 首先尝试从本地存储获取 |
|
|
|
|
|
const userInfo = uni.getStorageSync('userInfo') |
|
|
|
|
|
let openid = '' |
|
|
|
|
|
|
|
|
|
|
|
// #ifdef MP-WEIXIN |
|
|
|
|
|
openid = userInfo?.weapp_openid || userInfo?.openid || '' |
|
|
|
|
|
if (openid) { |
|
|
|
|
|
console.log('本地获取小程序openid成功') |
|
|
|
|
|
return openid |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
console.log('本地无openid,使用 uni.login 获取...') |
|
|
|
|
|
|
|
|
|
|
|
// 调用 uni.login 获取 code |
|
|
|
|
|
const loginRes = await new Promise((resolve, reject) => { |
|
|
|
|
|
uni.login({ |
|
|
|
|
|
success: (res) => resolve(res), |
|
|
|
|
|
fail: (err) => reject(err) |
|
|
|
|
|
}) |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
if (!loginRes.code) { |
|
|
|
|
|
console.error('uni.login 获取 code 失败') |
|
|
|
|
|
return '' |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
console.log('uni.login 获取 code 成功:', loginRes.code.substring(0, 10) + '***') |
|
|
|
|
|
|
|
|
|
|
|
// 使用 code 调用接口换取 openid |
|
|
|
|
|
const res = await apiRoute.getWechatOpenid({ |
|
|
|
|
|
code: loginRes.code, |
|
|
|
|
|
type: 'miniprogram' |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
if (res.code === 1 && res.data?.openid) { |
|
|
|
|
|
openid = res.data.openid |
|
|
|
|
|
// 更新本地存储 |
|
|
|
|
|
if (userInfo) { |
|
|
|
|
|
userInfo.weapp_openid = openid |
|
|
|
|
|
uni.setStorageSync('userInfo', userInfo) |
|
|
|
|
|
} |
|
|
|
|
|
console.log('接口获取小程序openid成功') |
|
|
|
|
|
return openid |
|
|
|
|
|
} else { |
|
|
|
|
|
console.error('接口换取openid失败:', res.msg || '未知错误') |
|
|
|
|
|
return '' |
|
|
|
|
|
} |
|
|
|
|
|
// #endif |
|
|
|
|
|
|
|
|
|
|
|
// #ifdef H5 |
|
|
|
|
|
openid = userInfo?.wx_openid || userInfo?.openid || '' |
|
|
|
|
|
if (openid) { |
|
|
|
|
|
console.log('本地获取公众号openid成功') |
|
|
|
|
|
return openid |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
console.log('本地无openid,从URL获取code...') |
|
|
|
|
|
|
|
|
|
|
|
// 如果本地没有,从URL参数获取code(公众号授权后会跳转回来带上code参数) |
|
|
|
|
|
const urlParams = new URLSearchParams(window.location.search) |
|
|
|
|
|
const code = urlParams.get('code') |
|
|
|
|
|
|
|
|
|
|
|
if (code) { |
|
|
|
|
|
console.log('从URL获取code成功,调用接口换取openid...') |
|
|
|
|
|
const res = await apiRoute.getWechatOpenid({ |
|
|
|
|
|
code: code, |
|
|
|
|
|
type: 'official' |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
if (res.code === 1 && res.data?.openid) { |
|
|
|
|
|
openid = res.data.openid |
|
|
|
|
|
// 更新本地存储 |
|
|
|
|
|
if (userInfo) { |
|
|
|
|
|
userInfo.wx_openid = openid |
|
|
|
|
|
uni.setStorageSync('userInfo', userInfo) |
|
|
|
|
|
} |
|
|
|
|
|
console.log('接口获取公众号openid成功') |
|
|
|
|
|
return openid |
|
|
|
|
|
} else { |
|
|
|
|
|
console.error('接口换取openid失败:', res.msg || '未知错误') |
|
|
|
|
|
return '' |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
console.error('URL中未找到code参数,需要进行微信授权') |
|
|
|
|
|
// TODO: 这里可以引导用户进行微信授权 |
|
|
|
|
|
return '' |
|
|
|
|
|
} |
|
|
|
|
|
// #endif |
|
|
|
|
|
|
|
|
|
|
|
console.error('无法获取openid,可能需要重新微信授权') |
|
|
|
|
|
return '' |
|
|
|
|
|
} catch (error) { |
|
|
|
|
|
console.error('获取openid异常:', error) |
|
|
|
|
|
return '' |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 调用微信支付 |
|
|
|
|
|
*/ |
|
|
|
|
|
callWechatPay(payParams) { |
|
|
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
|
|
// #ifdef MP-WEIXIN |
|
|
|
|
|
wx.requestPayment({ |
|
|
|
|
|
timeStamp: payParams.timeStamp, |
|
|
|
|
|
nonceStr: payParams.nonceStr, |
|
|
|
|
|
package: payParams.package, |
|
|
|
|
|
signType: payParams.signType || 'MD5', |
|
|
|
|
|
paySign: payParams.paySign, |
|
|
|
|
|
success: (res) => { |
|
|
|
|
|
console.log('微信支付成功:', res) |
|
|
|
|
|
resolve({ code: 1, msg: '支付成功' }) |
|
|
|
|
|
}, |
|
|
|
|
|
fail: (err) => { |
|
|
|
|
|
console.error('微信支付失败:', err) |
|
|
|
|
|
if (err.errMsg?.includes('cancel')) { |
|
|
|
|
|
reject(new Error('用户取消支付')) |
|
|
|
|
|
} else { |
|
|
|
|
|
reject(new Error('微信支付失败')) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
// #endif |
|
|
|
|
|
|
|
|
|
|
|
// #ifndef MP-WEIXIN |
|
|
|
|
|
reject(new Error('当前环境不支持微信支付')) |
|
|
|
|
|
// #endif |
|
|
}) |
|
|
}) |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|