diff --git a/src/mobile/router/modules.ts b/src/mobile/router/modules.ts index 46740e3..b80518c 100644 --- a/src/mobile/router/modules.ts +++ b/src/mobile/router/modules.ts @@ -47,6 +47,15 @@ const routeModuleList: Array = [ }, ], }, + // 收银台小程序引导页(跨端:浏览器直接打开 /cm/:orderNo 时展示扫码提示,不发起支付) + { + path: RoutePath.CASHIER_MINI, + name: 'CashierMiniGuide', + component: () => import('@/mobile/views/cashier-mini/index.vue'), + meta: { + title: 'route.cashier', // 收银台 + }, + }, // 聚合扫码:入口 + 非宿主提示 + 各宿主环境页 统一在 Aggregate 父级下作为子路由 // 让 App.vue 顶层 transition key(matched[0].name)在 entry → 环境页跳转时保持不变(都是 Aggregate), // 避免整页 remount 与 Entry.vue 的 onBeforeMount router.replace 竞争导致白屏 diff --git a/src/mobile/views/cashier-mini/index.vue b/src/mobile/views/cashier-mini/index.vue new file mode 100644 index 0000000..1c93490 --- /dev/null +++ b/src/mobile/views/cashier-mini/index.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/pc/router/index.ts b/src/pc/router/index.ts index 78efce9..5e65d93 100644 --- a/src/pc/router/index.ts +++ b/src/pc/router/index.ts @@ -27,6 +27,13 @@ const routes: RouteRecordRaw[] = [ component: () => import('@/pc/views/cashier/index.vue'), meta: { title: 'route.cashier' }, // 收银台 }, + // 收银台小程序引导页(跨端:浏览器直接打开 /cm/:orderNo 时展示扫码提示,不发起支付) + { + path: RoutePath.CASHIER_MINI, + name: 'PcCashierMini', + component: () => import('@/pc/views/cashier-mini/index.vue'), + meta: { title: 'route.cashier' }, // 收银台 + }, // 聚合「非宿主」提示:须在 /aggregate/:orderNo 之前注册,避免 path 段 "unsupported" 被当成 orderNo 查单 { path: RoutePath.AGGREGATE_UNSUPPORTED, diff --git a/src/pc/views/cashier-mini/index.vue b/src/pc/views/cashier-mini/index.vue new file mode 100644 index 0000000..263a616 --- /dev/null +++ b/src/pc/views/cashier-mini/index.vue @@ -0,0 +1,150 @@ + + + + + diff --git a/src/shared/locales/en-US/cashier.json b/src/shared/locales/en-US/cashier.json index 56b2fc0..678a4ca 100644 --- a/src/shared/locales/en-US/cashier.json +++ b/src/shared/locales/en-US/cashier.json @@ -41,5 +41,9 @@ "paidTip": "Payment completed. Thank you", "autoRedirectTip": "Auto-return to merchant in {n}s", "backToMerchant": "Return to merchant", - "payTime": "Payment time" + "payTime": "Payment time", + "miniScanTitle": "Scan to open the cashier mini-program", + "miniScanDesc": "Scan the QR code with WeChat to open the cashier and complete payment", + "miniInWalletTitle": "Cashier mini-program unavailable", + "miniInWalletDesc": "Please confirm the cashier mini-program is published and its normal-link QR rule is configured" } diff --git a/src/shared/locales/id-ID/cashier.json b/src/shared/locales/id-ID/cashier.json index e99c3f0..efe06ab 100644 --- a/src/shared/locales/id-ID/cashier.json +++ b/src/shared/locales/id-ID/cashier.json @@ -41,5 +41,9 @@ "paidTip": "Pembayaran selesai. Terima kasih", "autoRedirectTip": "Kembali ke merchant otomatis dalam {n} detik", "backToMerchant": "Kembali ke merchant", - "payTime": "Waktu pembayaran" + "payTime": "Waktu pembayaran", + "miniScanTitle": "Pindai untuk membuka mini-program kasir", + "miniScanDesc": "Pindai kode QR dengan WeChat untuk membuka kasir dan menyelesaikan pembayaran", + "miniInWalletTitle": "Mini-program kasir tidak tersedia", + "miniInWalletDesc": "Pastikan mini-program kasir telah diterbitkan dan aturan QR tautan biasa telah dikonfigurasi" } diff --git a/src/shared/locales/ja-JP/cashier.json b/src/shared/locales/ja-JP/cashier.json index 8dc27cc..87773ef 100644 --- a/src/shared/locales/ja-JP/cashier.json +++ b/src/shared/locales/ja-JP/cashier.json @@ -41,5 +41,9 @@ "paidTip": "支払いが完了しました。ありがとうございます", "autoRedirectTip": "{n} 秒後に自動的に店舗に戻ります", "backToMerchant": "店舗に戻る", - "payTime": "支払い日時" + "payTime": "支払い日時", + "miniScanTitle": "スキャンして決済ミニプログラムを開く", + "miniScanDesc": "WeChatでQRコードをスキャンして決済ミニプログラムを開き、支払いを完了してください", + "miniInWalletTitle": "決済ミニプログラムは現在利用できません", + "miniInWalletDesc": "決済ミニプログラムが公開され、通常リンクQRコードが設定されていることを確認してください" } diff --git a/src/shared/locales/ko-KR/cashier.json b/src/shared/locales/ko-KR/cashier.json index 0b151df..c780bec 100644 --- a/src/shared/locales/ko-KR/cashier.json +++ b/src/shared/locales/ko-KR/cashier.json @@ -41,5 +41,9 @@ "paidTip": "결제가 완료되었습니다. 감사합니다", "autoRedirectTip": "{n}초 후 자동으로 가맹점으로 돌아갑니다", "backToMerchant": "가맹점으로 돌아가기", - "payTime": "결제 시간" + "payTime": "결제 시간", + "miniScanTitle": "스캔하여 결제 미니프로그램 열기", + "miniScanDesc": "WeChat으로 QR 코드를 스캔하여 결제 미니프로그램을 열고 결제를 완료하세요", + "miniInWalletTitle": "결제 미니프로그램을 사용할 수 없습니다", + "miniInWalletDesc": "결제 미니프로그램이 게시되고 일반 링크 QR 규칙이 설정되었는지 확인하세요" } diff --git a/src/shared/locales/ms-MY/cashier.json b/src/shared/locales/ms-MY/cashier.json index e412484..0dc9275 100644 --- a/src/shared/locales/ms-MY/cashier.json +++ b/src/shared/locales/ms-MY/cashier.json @@ -41,5 +41,9 @@ "paidTip": "Pembayaran selesai. Terima kasih", "autoRedirectTip": "Kembali ke merchant automatik dalam {n} saat", "backToMerchant": "Kembali ke merchant", - "payTime": "Masa pembayaran" + "payTime": "Masa pembayaran", + "miniScanTitle": "Imbas untuk membuka mini-program kaunter", + "miniScanDesc": "Sila imbas kod QR dengan WeChat untuk membuka kaunter dan melengkapkan bayaran", + "miniInWalletTitle": "Mini-program kaunter tidak tersedia", + "miniInWalletDesc": "Sahkan mini-program kaunter telah diterbitkan dan peraturan QR pautan biasa telah dikonfigurasi" } diff --git a/src/shared/locales/th-TH/cashier.json b/src/shared/locales/th-TH/cashier.json index cf88cf8..74e25c1 100644 --- a/src/shared/locales/th-TH/cashier.json +++ b/src/shared/locales/th-TH/cashier.json @@ -41,5 +41,9 @@ "paidTip": "ชำระเงินสำเร็จ ขอบคุณที่ใช้บริการ", "autoRedirectTip": "กลับสู่ร้านค้าอัตโนมัติใน {n} วินาที", "backToMerchant": "กลับสู่ร้านค้า", - "payTime": "เวลาที่ชำระ" + "payTime": "เวลาที่ชำระ", + "miniScanTitle": "สแกนเพื่อเปิดมินิโปรแกรมแคชเชียร์", + "miniScanDesc": "โปรดสแกนคิวอาร์โค้ดด้วย WeChat เพื่อเปิดแคชเชียร์และชำระเงินให้เสร็จสิ้น", + "miniInWalletTitle": "มินิโปรแกรมแคชเชียร์ไม่พร้อมใช้งาน", + "miniInWalletDesc": "โปรดยืนยันว่ามินิโปรแกรมแคชเชียร์เผยแพร่แล้วและตั้งค่ากฎ QR ลิงก์ปกติแล้ว" } diff --git a/src/shared/locales/vi-VN/cashier.json b/src/shared/locales/vi-VN/cashier.json index 22a8697..7c03dc5 100644 --- a/src/shared/locales/vi-VN/cashier.json +++ b/src/shared/locales/vi-VN/cashier.json @@ -41,5 +41,9 @@ "paidTip": "Thanh toán hoàn tất. Cảm ơn bạn", "autoRedirectTip": "Tự động quay lại merchant sau {n} giây", "backToMerchant": "Quay lại merchant", - "payTime": "Thời gian thanh toán" + "payTime": "Thời gian thanh toán", + "miniScanTitle": "Quét để mở mini-program thu ngân", + "miniScanDesc": "Vui lòng quét mã QR bằng WeChat để mở thu ngân và hoàn tất thanh toán", + "miniInWalletTitle": "Mini-program thu ngân không khả dụng", + "miniInWalletDesc": "Vui lòng xác nhận mini-program thu ngân đã được phát hành và đã cấu hình quy tắc QR liên kết thường" } diff --git a/src/shared/locales/zh-CN/cashier.json b/src/shared/locales/zh-CN/cashier.json index 639acc8..db800c0 100644 --- a/src/shared/locales/zh-CN/cashier.json +++ b/src/shared/locales/zh-CN/cashier.json @@ -41,5 +41,9 @@ "paidTip": "支付已完成,感谢使用", "autoRedirectTip": "{n} 秒后自动返回商户", "backToMerchant": "返回商户", - "payTime": "支付时间" + "payTime": "支付时间", + "miniScanTitle": "请扫码打开收银台小程序", + "miniScanDesc": "请使用微信扫描二维码进入统一收银台并完成支付", + "miniInWalletTitle": "收银台小程序暂不可用", + "miniInWalletDesc": "请确认收银台小程序已发布并配置普通链接二维码规则" } diff --git a/src/shared/locales/zh-HK/cashier.json b/src/shared/locales/zh-HK/cashier.json index ac3380c..a63f41e 100644 --- a/src/shared/locales/zh-HK/cashier.json +++ b/src/shared/locales/zh-HK/cashier.json @@ -41,5 +41,9 @@ "paidTip": "支付已完成,感謝使用", "autoRedirectTip": "{n} 秒後自動返回商戶", "backToMerchant": "返回商戶", - "payTime": "支付時間" + "payTime": "支付時間", + "miniScanTitle": "請掃碼開啟收銀台小程式", + "miniScanDesc": "請使用微信掃描二維碼進入統一收銀台並完成付款", + "miniInWalletTitle": "收銀台小程式暫不可用", + "miniInWalletDesc": "請確認收銀台小程式已發布並已設定普通連結二維碼規則" } diff --git a/src/shared/locales/zh-TW/cashier.json b/src/shared/locales/zh-TW/cashier.json index ac3380c..f94baa2 100644 --- a/src/shared/locales/zh-TW/cashier.json +++ b/src/shared/locales/zh-TW/cashier.json @@ -41,5 +41,9 @@ "paidTip": "支付已完成,感謝使用", "autoRedirectTip": "{n} 秒後自動返回商戶", "backToMerchant": "返回商戶", - "payTime": "支付時間" + "payTime": "支付時間", + "miniScanTitle": "請掃碼開啟收銀台小程式", + "miniScanDesc": "請使用微信掃描二維碼進入統一收銀台並完成付款", + "miniInWalletTitle": "收銀台小程式暫不可用", + "miniInWalletDesc": "請確認收銀台小程式已發布並已配置普通連結二維碼規則" } diff --git a/src/shared/pay/use-mini-guide-env.ts b/src/shared/pay/use-mini-guide-env.ts index 483a147..1fcc1d1 100644 --- a/src/shared/pay/use-mini-guide-env.ts +++ b/src/shared/pay/use-mini-guide-env.ts @@ -1,11 +1,11 @@ /** - * 小程序入口引导页(/m/:code、/am/:orderNo)的 UA 感知文案与图标 + * 小程序入口引导页(/m/:code、/am/:orderNo、/cm/:orderNo)的 UA 感知文案与图标 * * 钱包 App 内(微信/支付宝/云闪付/抖音)扫码本应由「普通链接二维码」规则拉起 * cashier 小程序;若规则未配/未匹配/小程序未发布,会落到本 H5 引导页。此时再显示 * "请用微信扫码"会自相矛盾(用户就在微信里),故按 UA 分流: * - 钱包内:展示"收款小程序暂不可用"提示,并仅高亮当前钱包图标(聚焦) - * - 系统浏览器/PC:保持"请扫码支付"提示 + 四钱包图标 + * - 系统浏览器/PC:保持"请扫码支付"提示 + 钱包图标(收银台小程序仅微信) * * UA 一次扫描即定(同一会话不变),无需响应式。 */ @@ -37,7 +37,7 @@ const ENV_ICON_MAP: Record = { export interface MiniGuideEnv { /** 是否在钱包 App 内(微信/支付宝/云闪付/抖音) */ inWallet: boolean - /** 图标列表:钱包内仅当前钱包(高亮聚焦);系统浏览器为四钱包 */ + /** 图标列表:钱包内仅当前钱包(高亮聚焦);收银台小程序仅展示微信 */ icons: MiniGuideWalletIcon[] /** 标题 i18n key */ titleKey: string @@ -45,21 +45,27 @@ export interface MiniGuideEnv { descKey: string } +/** 小程序映射入口所属业务 */ +export type MiniGuideScope = 'aggregate' | 'cashier' + /** * 探测当前 UA,返回引导页所需的文案 key 与图标列表 */ -export function useMiniGuideEnv(): MiniGuideEnv { +export function useMiniGuideEnv(scope: MiniGuideScope = 'aggregate'): MiniGuideEnv { const env = detectClientEnv() const inWallet = isAggregateClientEnv(env) // inWallet 为 true 时,env 已收窄为 AggregateClientEnv(type guard) - const icons = inWallet - ? [ENV_ICON_MAP[env]] - : AGGREGATE_CLIENT_ENVS.map(e => ENV_ICON_MAP[e]) + const icons = scope === 'cashier' + ? [ENV_ICON_MAP.wechat] + : inWallet + ? [ENV_ICON_MAP[env]] + : AGGREGATE_CLIENT_ENVS.map(e => ENV_ICON_MAP[e]) + const messagePrefix = scope === 'cashier' ? 'cashier' : 'aggregate' return { inWallet, icons, // 钱包内:小程序未拉起专属文案;否则:通用扫码文案 - titleKey: inWallet ? 'aggregate.miniInWalletTitle' : 'aggregate.miniScanTitle', - descKey: inWallet ? 'aggregate.miniInWalletDesc' : 'aggregate.miniScanDesc', + titleKey: inWallet ? `${messagePrefix}.miniInWalletTitle` : `${messagePrefix}.miniScanTitle`, + descKey: inWallet ? `${messagePrefix}.miniInWalletDesc` : `${messagePrefix}.miniScanDesc`, } } diff --git a/src/shared/router/paths.ts b/src/shared/router/paths.ts index 66b6519..ad62883 100644 --- a/src/shared/router/paths.ts +++ b/src/shared/router/paths.ts @@ -26,6 +26,12 @@ export const RoutePath = { * 与运营端 H5 配置分桶一一对应;OAuth returnPath 指向此路径 */ CASHIER_ENV: '/cashier/:orderNo/:clientEnv', + /** + * 收银台小程序入口(跨端;cashier 预下单返回的 miniUrl 契约) + * 微信/支付宝扫码后由「普通链接二维码」规则拉起收银台小程序; + * 浏览器直接打开时展示扫码引导提示(不发起支付) + */ + CASHIER_MINI: '/cm/:orderNo', /** * 聚合扫码入口(跨端;预下单落地 URL 契约,不可改) * Mobile:UA 探测后 replace 到环境页;PC:单页处理