fix: improve h5 payment return flow

This commit is contained in:
wushumin
2026-06-04 16:12:59 +08:00
parent 13c21ac67f
commit 46dae160be
13 changed files with 328 additions and 8 deletions

View File

@@ -10,6 +10,7 @@ const orders = ref<OrderListItem[]>([]);
const privacyMode = ref(getPrivacyMode());
const orderHeroBackground = ref("");
const defaultOrderHeroBackground = "/static/order/order-reference.jpg";
let orderRefreshTicket = 0;
const orderHeroStyle = computed(() => ({
backgroundImage: `url("${orderHeroBackground.value || defaultOrderHeroBackground}")`,
@@ -67,17 +68,59 @@ async function fetchPageVisuals() {
}
}
function shouldSyncPaymentStatus(item: OrderListItem) {
return item.order_status === "pending_payment" && item.payment_status !== "paid";
}
async function syncPendingPaymentOrders(list: OrderListItem[]) {
const pendingOrders = list.filter(shouldSyncPaymentStatus);
if (!pendingOrders.length) {
return false;
}
const results = await Promise.all(
pendingOrders.map(async (item) => {
try {
const data = await appApi.getOrderPaymentStatus(item.order_id);
return data.order_status !== item.order_status
|| data.payment_status !== item.payment_status
|| data.display_status !== item.display_status;
} catch (error) {
console.warn("order payment status sync skipped", error);
return false;
}
}),
);
return results.some(Boolean);
}
async function refreshOrdersWithPaymentSync() {
const ticket = ++orderRefreshTicket;
const data = await appApi.getOrders();
if (ticket !== orderRefreshTicket) return;
orders.value = data.list;
const needsRefresh = await syncPendingPaymentOrders(data.list);
if (!needsRefresh || ticket !== orderRefreshTicket) return;
const refreshed = await appApi.getOrders();
if (ticket === orderRefreshTicket) {
orders.value = refreshed.list;
}
}
onShow(async () => {
privacyMode.value = getPrivacyMode();
void fetchPageVisuals();
if (!isLoggedIn()) {
orderRefreshTicket += 1;
orders.value = [];
redirectToLogin("/pages/order/index");
return;
}
try {
const data = await appApi.getOrders();
orders.value = data.list;
await refreshOrdersWithPaymentSync();
} catch (error) {
orders.value = [];
showErrorToast(error, "订单加载失败");