From bd398f154ab320c9b298e3dde091c1f8ee83ccfa Mon Sep 17 00:00:00 2001 From: yuzhiran Date: Thu, 2 Jul 2026 13:12:55 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=BE=AE=E4=BF=A1=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E9=94=99=E8=AF=AF=E6=B6=88=E6=81=AF=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E7=94=A8=E6=88=B7=E5=8F=8B=E5=A5=BD=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 friendlyVpError() 工具函数,映射 VP 常见错误码 (pay cancel, access denied, SIGNATURE_INVALID 等) 为友好中文 - member.vue 两个 VP fail 回调使用 friendlyVpError 显示 原始: requestVirtualPayment:fail pay cancel 优化: 你已取消支付 --- zhiyin-app/src/pages/member/member.vue | 6 ++-- zhiyin-app/src/utils/auth.ts | 48 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/zhiyin-app/src/pages/member/member.vue b/zhiyin-app/src/pages/member/member.vue index 09ab760..e9ffc02 100644 --- a/zhiyin-app/src/pages/member/member.vue +++ b/zhiyin-app/src/pages/member/member.vue @@ -113,7 +113,7 @@ import { ref, onMounted } from 'vue' import { onLoad, onShow } from '@dcloudio/uni-app' import { api } from '../../config' -import { checkAuth } from '../../utils/auth' +import { checkAuth, friendlyVpError } from '../../utils/auth' const isLoggedIn = ref(false) const isMp = ref(false) @@ -282,7 +282,7 @@ const startGravityPay = async () => { console.error('[VP] 支付失败:', JSON.stringify(err2)) vpStatus.value = true vpSuccess.value = false - vpStatusText.value = err2?.errMsg || '支付取消' + vpStatusText.value = friendlyVpError(err2?.errMsg) || '你已取消支付' }, }) } else { @@ -381,7 +381,7 @@ const startPlanPay = async (selectedPlan) => { console.error('[VP-plan] 支付失败:', JSON.stringify(err2)) vpStatus.value = true vpSuccess.value = false - vpStatusText.value = err2?.errMsg || '支付取消' + vpStatusText.value = friendlyVpError(err2?.errMsg) || '你已取消支付' }, }) } else { diff --git a/zhiyin-app/src/utils/auth.ts b/zhiyin-app/src/utils/auth.ts index 420be86..84bce1f 100644 --- a/zhiyin-app/src/utils/auth.ts +++ b/zhiyin-app/src/utils/auth.ts @@ -22,3 +22,51 @@ export function checkAuth(res: any): boolean { } return false } + +/** + * 微信虚拟支付(VP)错误消息 → 用户友好中文提示 + * 覆盖 wx.requestVirtualPayment fail 回调中的常见错误码 + */ +export function friendlyVpError(errMsg: string): string { + if (!errMsg) return '支付失败,请重试' + + const map: Record = { + 'pay cancel': '你已取消支付', + 'cancel': '你已取消支付', + 'access denied': '支付权限不足,请联系客服', + '商户收款功能受限': '商户暂不支持收款,请联系客服', + 'PRODUCT_ID_EMPTY': '商品信息错误', + 'PRODUCT_NOT_EXIST': '商品不存在', + 'PRODUCT_NOT_ONLINE': '商品未上架', + 'PAY_SIG_INVALID': '支付签名异常,请重试', + 'SIGNATURE_INVALID': '支付验证失败,请重试', + 'BALANCE_NOT_ENOUGH': '余额不足', + 'ORDER_NOT_EXIST': '订单不存在', + 'ORDER_EXPIRED': '订单已过期,请重新下单', + 'ORDER_PAYED': '订单已支付', + 'ORDER_CANCELED': '订单已取消', + 'PRICE_NOT_MATCH': '价格异常,请联系客服', + 'TOKEN_NOT_EXIST': '登录态失效,请重新登录', + 'TOKEN_EXPIRED': '登录态已过期,请重新登录', + 'TOKEN_NOT_MATCH': '登录态不匹配,请重新登录', + 'internal error': '支付异常,请稍后重试', + 'system error': '系统繁忙,请稍后重试', + 'payment limit exceeded': '已超出支付限额', + } + + // 尝试精确匹配 + const lower = errMsg.toLowerCase() + for (const [key, msg] of Object.entries(map)) { + if (lower.includes(key.toLowerCase())) return msg + } + + // fallback:去前缀(requestVirtualPayment:fail xxx → xxx) + const cleaned = errMsg.replace(/^requestVirtualPayment:fail\s*/i, '').replace(/^requestPayment:fail\s*/i, '').trim() + if (cleaned && cleaned !== errMsg) { + for (const [key, msg] of Object.entries(map)) { + if (cleaned.toLowerCase().includes(key.toLowerCase())) return msg + } + } + + return `支付失败(${cleaned || '未知错误'})` +}