From 33ab46aec099eb47e14ccdc4423af30824dbb526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Wed, 22 Apr 2026 10:21:53 +0800 Subject: [PATCH] 1 --- src/order_pages/orderDetail/index.tsx | 22 ++++---------- src/utils/order.pay.ts | 44 +++++++++++++++++++++------ 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/order_pages/orderDetail/index.tsx b/src/order_pages/orderDetail/index.tsx index 6022295..8f55418 100644 --- a/src/order_pages/orderDetail/index.tsx +++ b/src/order_pages/orderDetail/index.tsx @@ -23,7 +23,6 @@ import { isPhoneNumber, genGameLength, } from "@/utils"; -import { getStorage, setStorage } from "@/store/storage"; import { useGlobalStore } from "@/store/global"; import { useOrder } from "@/store/orderStore"; import detailService, { GameData } from "@/services/detailService"; @@ -692,35 +691,26 @@ const OrderCheck = () => { } setPaying(true); - let payment_params = {}; + let payment_params: any = {}; try { payment_params = await getPaymentParams(); - if (!id) { - setStorage("backFlag", "1"); - Taro.redirectTo({ - url: `/order_pages/orderDetail/index?id=${payment_params.order_id}`, - }); - } await payOrder(payment_params); Taro.showToast({ title: "支付成功", icon: "success", }); - const backFlag = getStorage("backFlag"); - if (backFlag === "1") { - setStorage("backFlag", "0"); - Taro.navigateBack(); + // 支付成功后再跳转,避免部分机型(如华为)在页面切换中拉起支付导致卡死 + if (!id && payment_params?.order_id) { + Taro.redirectTo({ + url: `/order_pages/orderDetail/index?id=${payment_params.order_id}`, + }); } - // Taro.navigateBack({ - // delta: 1, - // }); } catch (error) { Taro.showToast({ title: error.message, icon: "none", }); } finally { - setStorage("backFlag", "0"); init(); setPaying(false); } diff --git a/src/utils/order.pay.ts b/src/utils/order.pay.ts index 060fc7b..0c29f00 100644 --- a/src/utils/order.pay.ts +++ b/src/utils/order.pay.ts @@ -7,14 +7,40 @@ export function delay(ms: number) { export async function payOrder(params) { const { timeStamp, nonceStr, package: _package, signType, paySign } = params; return new Promise((resolve, reject) => { - Taro.requestPayment({ - timeStamp, - nonceStr, - package: _package, - signType, - paySign, - success: resolve, - fail: reject.bind(null, new Error("支付失败")), - }); + let settled = false; + const timeout = setTimeout(() => { + if (settled) return; + settled = true; + reject(new Error("支付响应超时,请在订单页确认支付结果")); + }, 20000); + + const finish = (cb: () => void) => { + if (settled) return; + settled = true; + clearTimeout(timeout); + cb(); + }; + + try { + Taro.requestPayment({ + timeStamp, + nonceStr, + package: _package, + signType, + paySign, + success: (res) => finish(() => resolve(res)), + fail: (err: any) => + finish(() => { + const errMsg = String(err?.errMsg || ""); + if (errMsg.includes("cancel")) { + reject(new Error("已取消支付")); + return; + } + reject(new Error("支付失败,请重试")); + }), + }); + } catch { + finish(() => reject(new Error("支付拉起失败,请重试"))); + } }); }