From a91652c39689d2fe3e7514b6f999c0318f21fc61 Mon Sep 17 00:00:00 2001 From: zhouyanli <593579392@qq.com> Date: Mon, 21 Sep 2026 10:31:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0=E7=BC=93?= =?UTF-8?q?=E5=AD=98bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- huakai-app/App.vue | 5 +- huakai-app/pageSubPack/api/appLaunch.js | 66 ++++++++++++++++--- huakai-app/pageSubPack/api/request.js | 8 +-- .../pages/arrearsPayment/arrearsPayment.vue | 43 ++++++++++-- 4 files changed, 99 insertions(+), 23 deletions(-) diff --git a/huakai-app/App.vue b/huakai-app/App.vue index 9a84212..923c105 100644 --- a/huakai-app/App.vue +++ b/huakai-app/App.vue @@ -14,10 +14,11 @@ onShow((options) => { console.log('App onShow, options:', JSON.stringify(options)) + // 先判断是否为支付小程序返回:是则本次进入只按支付结果处理, + // 不能再走 App 跳转参数捕获,否则兜底参数会把上一次的账单写回缓存 + if (capturePaymentResult(options)) return // 捕获 App 跳转传入的支付参数(热启动 — options 携带新的 referrerInfo) captureAppLaunchData(options) - // 捕获日照银行支付小程序返回的支付结果(navigateBackMiniProgram 的 extraData) - capturePaymentResult(options) }) // 获取 uniPush 2.0 CID diff --git a/huakai-app/pageSubPack/api/appLaunch.js b/huakai-app/pageSubPack/api/appLaunch.js index f6560f2..0491111 100644 --- a/huakai-app/pageSubPack/api/appLaunch.js +++ b/huakai-app/pageSubPack/api/appLaunch.js @@ -9,6 +9,10 @@ const STORAGE_KEY = 'app_launch_payment_data' const APP_QUERY_KEY = 'app_query_params' +/** 页面缓存的缴费条目(arrearsPayment 页展示用) */ +const PAYMENT_ITEM_KEY = 'arrearsPayment' +/** 日照银行支付小程序返回的原始结果 */ +const PAYMENT_RESULT_KEY = 'payment_return_result' /** * 需要转为数组的参数字段(逗号分隔字符串 → 数组) @@ -73,6 +77,8 @@ function normalizeBillParams(obj) { export function captureAppLaunchData(onShowOptions) { let data = null let queryData = null + // 参数来源:current=本次进入 / enter=当前进入 / launch=冷启动兜底(热启动时仍是首次冷启动的旧值) + let dataSource = null const tryGetData = (options, label) => { if (!options) return null @@ -106,6 +112,7 @@ export function captureAppLaunchData(onShowOptions) { // 热启动再次从 App 进入时,getLaunchOptionsSync 仍返回首次冷启动的旧值, // 若先读它会导致新 token 被旧 token 覆盖,因此这里以本次 options 为准。 data = tryGetData(onShowOptions, '本次进入') + if (data) dataSource = 'current' // 兜底:本次 options 未取到数据时,依次尝试当前进入参数、冷启动参数。 // 注意:不能以 !onShowOptions 判断,onLaunch/onShow 始终会传入 options 对象, @@ -113,14 +120,20 @@ export function captureAppLaunchData(onShowOptions) { if (!data) { try { data = tryGetData(wx.getEnterOptionsSync?.() || {}, '当前进入(getEnterOptionsSync)') + if (data) dataSource = 'enter' } catch (e) { console.error('getEnterOptionsSync 失败:', e) } } if (!data) { try { data = tryGetData(wx.getLaunchOptionsSync?.() || {}, '冷启动(getLaunchOptionsSync)') + if (data) dataSource = 'launch' } catch (e) { console.error('getLaunchOptionsSync 失败:', e) } } + // getLaunchOptionsSync 返回的是首次冷启动的参数,热启动再次从 App 进入时仍是旧值。 + // 用它恢复缴费参数会把上一次的金额/billIds 覆盖进来,因此只允许它恢复登录态。 + const isStaleSource = dataSource === 'launch' + if (data) { // 恢复登录态:只要 App 传入了 token/userId 就恢复,不依赖支付字段名 if (data.token) { @@ -133,7 +146,10 @@ export function captureAppLaunchData(onShowOptions) { } // 存在支付参数时才作为 App 支付进入处理 - if (data.payAmount || data.acct || data.custId || data.billId || data.billIds) { + const hasPaymentParams = !!(data.payAmount || data.acct || data.custId || data.billId || data.billIds) + if (hasPaymentParams && isStaleSource) { + console.log('冷启动兜底参数为旧值,跳过缴费参数恢复') + } else if (hasPaymentParams) { // 归一化 billId/billIds:单个 id 用 billId,多个用 billIds,统一转为 billIds 数组 normalizeBillParams(data) uni.setStorageSync(STORAGE_KEY, data) @@ -144,8 +160,9 @@ export function captureAppLaunchData(onShowOptions) { // 归一化 queryData 中的 billId/billIds normalizeBillParams(queryData) - // 单独保存参数供接口使用(优先 queryData,fallback 到 data,即 extraData 来源) - const queryParams = queryData || data + // 单独保存参数供接口使用(优先 queryData,fallback 到 data,即 extraData 来源)。 + // 冷启动兜底来源不写入,避免拿着上一次的账单去支付。 + const queryParams = isStaleSource ? null : (queryData || data) if (queryParams) { uni.setStorageSync(APP_QUERY_KEY, queryParams) console.log('已存储 App 接口参数:', JSON.stringify(queryParams)) @@ -179,6 +196,23 @@ export function clearAppQueryParams() { uni.removeStorageSync(APP_QUERY_KEY) } +/** + * 清理全部缴费缓存(App 传入参数 / 接口参数 / 页面条目 / 支付返回结果) + * 用于返回 App 前、以及再次从 App 进入时重置上一次的数据, + * 避免小程序热启动 onLoad 不执行导致继续展示上一次的金额。 + */ +export function clearPaymentCache() { + uni.removeStorageSync(STORAGE_KEY) + uni.removeStorageSync(APP_QUERY_KEY) + uni.removeStorageSync(PAYMENT_RESULT_KEY) + uni.removeStorageSync(PAYMENT_ITEM_KEY) +} + +/** 清除页面缓存的缴费条目 */ +export function clearPaymentItem() { + uni.removeStorageSync(PAYMENT_ITEM_KEY) +} + /** 组装 paymentItem */ export function buildPaymentItemFromApp(appData) { if (!appData) return null @@ -193,22 +227,31 @@ export function buildPaymentItemFromApp(appData) { * 本小程序在 App.onShow 中通过 referrerInfo.extraData 接收(场景值 1038)。 * 这里只负责捕获/读取/清除原始返回数据,成功/失败判定见 resolvePaymentResult。 */ -const PAYMENT_RESULT_KEY = 'payment_return_result' + +/** + * 判断 extraData 是否为 App 跳转参数(而非支付小程序返回)。 + * App 跳转必然带登录凭证或缴费参数,支付返回只带支付结果字段。 + */ +function isAppLaunchExtraData(extraData) { + if (!extraData || typeof extraData !== 'object') return false + return !!(extraData.token || extraData.userId || extraData.payAmount || extraData.acct || + extraData.custId || extraData.billId || extraData.billIds) +} /** * 捕获支付返回结果(在 App.onShow 中调用) + * 返回 true 表示本次进入是支付返回,调用方(App.vue)据此跳过 App 跳转参数捕获 —— + * 否则兜底参数会把上一次的账单写回缓存,缴费页会误判为「再次从 App 进入」并重置成待缴费状态。 * 注意:App 冷/热启动进入时 extraData 是支付参数(payAmount/billIds 等), * 并非支付返回,需跳过,避免覆盖真实结果。 */ export function capturePaymentResult(onShowOptions) { - if (!onShowOptions) return + if (!onShowOptions) return false const extraData = onShowOptions?.referrerInfo?.extraData - if (!extraData) return + if (!extraData) return false - // 含支付参数字段说明是 App 跳转进入(冷/热启动),不是支付返回,跳过 - if (typeof extraData === 'object' && (extraData.payAmount || extraData.billId || extraData.billIds || extraData.acct || extraData.custId)) { - return - } + // 含登录凭证/缴费参数字段说明是 App 跳转进入(冷/热启动),不是支付返回 + if (isAppLaunchExtraData(extraData)) return false let parsed = extraData if (typeof extraData === 'string') { @@ -218,8 +261,11 @@ export function capturePaymentResult(onShowOptions) { parsed = parseQueryString(extraData) } } + if (isAppLaunchExtraData(parsed)) return false + console.log('捕获到支付返回结果:', JSON.stringify(parsed)) uni.setStorageSync(PAYMENT_RESULT_KEY, parsed) + return true } /** 读取支付返回结果(读取后建议调用 clearPaymentReturnResult 清除) */ diff --git a/huakai-app/pageSubPack/api/request.js b/huakai-app/pageSubPack/api/request.js index 5985360..9c1d996 100644 --- a/huakai-app/pageSubPack/api/request.js +++ b/huakai-app/pageSubPack/api/request.js @@ -1,11 +1,11 @@ let baseUrl = ''; if (process.env.NODE_ENV === 'development') { // baseUrl = 'https://wuyeapi.ckdzkj.com'; // 开发环境 - // baseUrl = "http://192.168.1.222:8080" - baseUrl = "https://apitest.ckdzkj.com"; + baseUrl = "http://192.168.0.222:8080" + // baseUrl = "https://wuyeapi.ckdzkj.com"; } else { - // baseUrl = 'https://wuyeapi.ckdzkj.com'; // 生产环境 - baseUrl = "https://apitest.ckdzkj.com"; + baseUrl = 'https://wuyeapi.ckdzkj.com'; // 生产环境 + // baseUrl = "https://apitest.ckdzkj.com"; } /** diff --git a/huakai-app/pages/arrearsPayment/arrearsPayment.vue b/huakai-app/pages/arrearsPayment/arrearsPayment.vue index 4915f42..b1a9b41 100644 --- a/huakai-app/pages/arrearsPayment/arrearsPayment.vue +++ b/huakai-app/pages/arrearsPayment/arrearsPayment.vue @@ -19,13 +19,13 @@ - - @@ -35,7 +35,7 @@