feat(cashier): 收银台前端读后端 needOpenId 配合主扫/H5 强制 OAuth

- CashierItemPublic 接口新增 needOpenId?: boolean 字段
- CashierEnvPage 选中项的 needOpenId 优先读后端返回值(基于 method +
  clientEnv + openId 黑名单综合判定), 旧后端无此字段时降级到
  clientEnvNeedsOpenId 硬编码兜底, 实现主扫/H5 等原本免 openId 方式
  在存在 openId 黑名单时也走静默 OAuth 取 openId 拦截
This commit is contained in:
bootx
2026-07-20 12:01:48 +08:00
parent a426fd624e
commit 015f13258f
2 changed files with 19 additions and 3 deletions

View File

@@ -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 时跳转 OAuthreturnPath 带回环境页并 autoPay
*/
async function ensureOpenIdOrRedirect(): Promise<string | null> {
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 或无需继续

View File

@@ -50,6 +50,8 @@ export interface CashierItemPublic {
icon?: string
recommend?: boolean
sortNo?: number
/** 该项是否需要先走 OAuth 获取 openId后端按 method + clientEnv 综合判定) */
needOpenId?: boolean
}
/** 查询网关订单 */