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 || '未知错误'})` +}