2025-12-19 12:27:55 +00:00
|
|
|
|
<script>
|
2026-03-04 08:58:40 +00:00
|
|
|
|
import { updateLuOrderPayStatus } from "@/api/service";
|
|
|
|
|
|
|
2025-12-19 12:27:55 +00:00
|
|
|
|
export default {
|
|
|
|
|
|
globalData: {
|
|
|
|
|
|
// 用于从首页跳转到服务页面时传递需要高亮的分类
|
|
|
|
|
|
serviceCategory: null
|
|
|
|
|
|
},
|
|
|
|
|
|
onLaunch: function() {
|
|
|
|
|
|
console.log('App Launch')
|
|
|
|
|
|
// 检查登录状态
|
|
|
|
|
|
this.checkLoginStatus()
|
|
|
|
|
|
},
|
|
|
|
|
|
onShow: function() {
|
|
|
|
|
|
console.log('App Show')
|
2026-02-27 08:48:28 +00:00
|
|
|
|
// 1. uni-app 中通过 uni.getEnterOptionsSync() 调用(和微信小程序API一致,只是前缀改为uni)
|
|
|
|
|
|
const options = uni.getEnterOptionsSync();
|
|
|
|
|
|
console.log("查询到的返回数据")
|
|
|
|
|
|
console.log(options)
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 注意:scene 返回的是数字类型,不是字符串!原生代码中写 '1038' 会导致判断失败
|
|
|
|
|
|
if (options.scene === 1038 &&
|
|
|
|
|
|
options.referrerInfo?.appId === 'wxef277996acc166c3') {
|
|
|
|
|
|
|
|
|
|
|
|
// 从收银台小程序返回的逻辑
|
|
|
|
|
|
const extraData = options.referrerInfo.extraData;
|
2026-03-04 08:58:40 +00:00
|
|
|
|
console.log("extraData",extraData)
|
2026-02-27 08:48:28 +00:00
|
|
|
|
|
|
|
|
|
|
if (!extraData) {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '当前通过物理按键返回,未接收到返参,建议自行查询交易结果',
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 3000
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (extraData.code === 'success') {
|
2026-03-04 08:58:40 +00:00
|
|
|
|
// 有返回成功标记后,启动轮询查询订单状态
|
|
|
|
|
|
// 1. 优先使用收银台回传的订单号
|
|
|
|
|
|
const orderNumberFromExtra =
|
|
|
|
|
|
extraData.orderNumber || extraData.reqsn || extraData.orderNo;
|
|
|
|
|
|
// 2. 如果对方没有回传,则使用我们在跳转前自己缓存到本地的订单号
|
|
|
|
|
|
const storedOrderNumber = uni.getStorageSync("lastOrderNumber");
|
|
|
|
|
|
const orderNumber = orderNumberFromExtra || storedOrderNumber;
|
|
|
|
|
|
|
|
|
|
|
|
if (orderNumber) {
|
|
|
|
|
|
this.startOrderStatusPolling(orderNumber);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '支付返回缺少订单号,请稍后在服务记录中查看',
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 3000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2026-02-27 08:48:28 +00:00
|
|
|
|
} else if (extraData.code === 'cancel') {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '支付已取消',
|
|
|
|
|
|
icon: 'none'
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: `支付失败:${extraData.errmsg || '未知错误'}`,
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 3000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-19 12:27:55 +00:00
|
|
|
|
},
|
|
|
|
|
|
onHide: function() {
|
|
|
|
|
|
console.log('App Hide')
|
2026-03-04 08:58:40 +00:00
|
|
|
|
// 页面整体隐藏时,清理轮询定时器
|
|
|
|
|
|
if (this._orderStatusTimer) {
|
|
|
|
|
|
clearInterval(this._orderStatusTimer);
|
|
|
|
|
|
this._orderStatusTimer = null;
|
|
|
|
|
|
}
|
2025-12-19 12:27:55 +00:00
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
|
|
|
// 检查登录状态
|
|
|
|
|
|
checkLoginStatus() {
|
|
|
|
|
|
const token = uni.getStorageSync('token')
|
2026-02-27 08:48:28 +00:00
|
|
|
|
|
2025-12-19 12:27:55 +00:00
|
|
|
|
// 如果有token,且当前在登录页,则跳转到首页
|
|
|
|
|
|
if (token) {
|
|
|
|
|
|
// 延迟一下,确保页面已经初始化
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
const pages = getCurrentPages()
|
|
|
|
|
|
const currentPage = pages[pages.length - 1]
|
|
|
|
|
|
const currentRoute = currentPage ? currentPage.route : ''
|
2026-02-27 08:48:28 +00:00
|
|
|
|
|
2025-12-19 12:27:55 +00:00
|
|
|
|
// 如果当前在登录页,跳转到首页
|
|
|
|
|
|
if (currentRoute === 'pages/login/login') {
|
|
|
|
|
|
uni.switchTab({
|
|
|
|
|
|
url: '/pages/index/index',
|
|
|
|
|
|
fail: () => {
|
|
|
|
|
|
// 如果switchTab失败(可能不在tabBar页面),使用reLaunch
|
|
|
|
|
|
uni.reLaunch({
|
|
|
|
|
|
url: '/pages/index/index'
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 100)
|
|
|
|
|
|
}
|
2026-03-04 08:58:40 +00:00
|
|
|
|
},
|
|
|
|
|
|
// 启动轮询支付状态
|
|
|
|
|
|
startOrderStatusPolling(orderNumber) {
|
|
|
|
|
|
// 避免重复轮询
|
|
|
|
|
|
if (this._orderStatusTimer) {
|
|
|
|
|
|
clearInterval(this._orderStatusTimer);
|
|
|
|
|
|
this._orderStatusTimer = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let times = 0;
|
|
|
|
|
|
const maxTimes = 5; // 最多轮询 20 次,大约 1 分钟
|
|
|
|
|
|
|
|
|
|
|
|
this._orderStatusTimer = setInterval(async () => {
|
|
|
|
|
|
times++;
|
|
|
|
|
|
try {
|
|
|
|
|
|
const res = await updateLuOrderPayStatus({ orderNumber });
|
|
|
|
|
|
// 约定:接口有返回数据即认为支付成功
|
|
|
|
|
|
if (res) {
|
|
|
|
|
|
clearInterval(this._orderStatusTimer);
|
|
|
|
|
|
this._orderStatusTimer = null;
|
|
|
|
|
|
// 成功后清理本地缓存的订单号
|
|
|
|
|
|
uni.removeStorageSync("lastOrderNumber");
|
|
|
|
|
|
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '支付成功',
|
|
|
|
|
|
icon: 'success'
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 跳转到服务记录页面,默认展示「待核销」tab
|
|
|
|
|
|
uni.navigateTo({
|
|
|
|
|
|
url: '/pages/profileSub/serviceRecords?tab=pending_verification'
|
|
|
|
|
|
});
|
|
|
|
|
|
} else if (times >= maxTimes) {
|
|
|
|
|
|
clearInterval(this._orderStatusTimer);
|
|
|
|
|
|
this._orderStatusTimer = null;
|
|
|
|
|
|
uni.showToast({
|
|
|
|
|
|
title: '支付状态确认超时,请稍后在服务记录中查看',
|
|
|
|
|
|
icon: 'none',
|
|
|
|
|
|
duration: 3000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('查询订单支付状态失败:', error);
|
|
|
|
|
|
if (times >= maxTimes) {
|
|
|
|
|
|
clearInterval(this._orderStatusTimer);
|
|
|
|
|
|
this._orderStatusTimer = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 3000);
|
2025-12-19 12:27:55 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style>
|
|
|
|
|
|
/*每个页面公共css */
|
2026-02-27 08:48:28 +00:00
|
|
|
|
</style>
|