From 015f13258fb6496bd894e74d7d6746c578cd40a4 Mon Sep 17 00:00:00 2001 From: bootx Date: Mon, 20 Jul 2026 12:01:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(cashier):=20=E6=94=B6=E9=93=B6=E5=8F=B0?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=AF=BB=E5=90=8E=E7=AB=AF=20needOpenId=20?= =?UTF-8?q?=E9=85=8D=E5=90=88=E4=B8=BB=E6=89=AB/H5=20=E5=BC=BA=E5=88=B6=20?= =?UTF-8?q?OAuth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CashierItemPublic 接口新增 needOpenId?: boolean 字段 - CashierEnvPage 选中项的 needOpenId 优先读后端返回值(基于 method + clientEnv + openId 黑名单综合判定), 旧后端无此字段时降级到 clientEnvNeedsOpenId 硬编码兜底, 实现主扫/H5 等原本免 openId 方式 在存在 openId 黑名单时也走静默 OAuth 取 openId 拦截 --- src/mobile/views/cashier/CashierEnvPage.vue | 20 +++++++++++++++++--- src/shared/api/gateway.ts | 2 ++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/mobile/views/cashier/CashierEnvPage.vue b/src/mobile/views/cashier/CashierEnvPage.vue index 58bdd69..91b3a58 100644 --- a/src/mobile/views/cashier/CashierEnvPage.vue +++ b/src/mobile/views/cashier/CashierEnvPage.vue @@ -243,11 +243,25 @@ async function loadPage() { } } +/** + * 当前选中支付项是否需要 openId + * + * 优先读后端返回的 item.needOpenId(基于 method + clientEnv + openId 黑名单综合判定); + * 旧后端无此字段时降级到 clientEnv 硬编码(wechat/alipay/douyin → true)。 + */ +function selectedItemNeedsOpenId(): boolean { + const selected = payMethods.value.find(i => i.id === selectId.value) + if (selected?.needOpenId !== undefined) { + return !!selected.needOpenId + } + return clientEnvNeedsOpenId(clientEnvParam) +} + /** * 需要 openId 时跳转 OAuth;returnPath 带回环境页并 autoPay */ async function ensureOpenIdOrRedirect(): Promise { - if (!clientEnvNeedsOpenId(clientEnvParam)) { + if (!selectedItemNeedsOpenId()) { return getPayOpenId(orderNo, clientEnvParam) || null } const existing = getPayOpenId(orderNo, clientEnvParam) @@ -307,9 +321,9 @@ async function pay() { showQrcode.value = false qrContent.value = '' try { - // 微信/支付宝/抖音环境优先补齐 openId(跳转授权时本函数会中断) + // 选中项需要 openId 时(微信/支付宝/抖音环境或后端标记 needOpenId)跳转授权 let openId: string | undefined - if (clientEnvNeedsOpenId(clientEnvParam)) { + if (selectedItemNeedsOpenId()) { const id = await ensureOpenIdOrRedirect() if (id == null) { // 已跳转 OAuth 或无需继续 diff --git a/src/shared/api/gateway.ts b/src/shared/api/gateway.ts index da29d7d..84bdbe7 100644 --- a/src/shared/api/gateway.ts +++ b/src/shared/api/gateway.ts @@ -50,6 +50,8 @@ export interface CashierItemPublic { icon?: string recommend?: boolean sortNo?: number + /** 该项是否需要先走 OAuth 获取 openId(后端按 method + clientEnv 综合判定) */ + needOpenId?: boolean } /** 查询网关订单 */