fix: improve h5 payment return flow
This commit is contained in:
@@ -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, "订单加载失败");
|
||||
|
||||
@@ -192,7 +192,35 @@ export function redirectToLogin(targetUrl?: string) {
|
||||
});
|
||||
}
|
||||
|
||||
function consumeShouqianbaH5Return() {
|
||||
// #ifdef H5
|
||||
const url = new URL(window.location.href);
|
||||
const rawOrderId = url.searchParams.get("sqb_return_order_id") || "";
|
||||
const orderId = Number(rawOrderId);
|
||||
if (!Number.isInteger(orderId) || orderId <= 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
url.searchParams.delete("sqb_return_order_id");
|
||||
window.history.replaceState({}, document.title, url.toString());
|
||||
|
||||
const targetUrl = `/pages/order/detail?id=${orderId}`;
|
||||
if (!isLoggedIn()) {
|
||||
redirectToLogin(targetUrl);
|
||||
return true;
|
||||
}
|
||||
|
||||
uni.reLaunch({ url: targetUrl });
|
||||
return true;
|
||||
// #endif
|
||||
return false;
|
||||
}
|
||||
|
||||
export function ensureAuthenticatedPageAccess() {
|
||||
if (consumeShouqianbaH5Return()) {
|
||||
return;
|
||||
}
|
||||
|
||||
const currentUrl = getCurrentPageUrl();
|
||||
if (!currentUrl || !isAuthRequiredPage(currentUrl) || isLoggedIn()) {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user