fix: 微信虚拟支付错误消息改为用户友好中文提示

- 新增 friendlyVpError() 工具函数,映射 VP 常见错误码
  (pay cancel, access denied, SIGNATURE_INVALID 等) 为友好中文
- member.vue 两个 VP fail 回调使用 friendlyVpError 显示
  原始: requestVirtualPayment:fail pay cancel
  优化: 你已取消支付
This commit is contained in:
yuzhiran
2026-07-02 13:12:55 +08:00
parent f955ecc71d
commit bd398f154a
2 changed files with 51 additions and 3 deletions
+3 -3
View File
@@ -113,7 +113,7 @@
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { onLoad, onShow } from '@dcloudio/uni-app' import { onLoad, onShow } from '@dcloudio/uni-app'
import { api } from '../../config' import { api } from '../../config'
import { checkAuth } from '../../utils/auth' import { checkAuth, friendlyVpError } from '../../utils/auth'
const isLoggedIn = ref(false) const isLoggedIn = ref(false)
const isMp = ref(false) const isMp = ref(false)
@@ -282,7 +282,7 @@ const startGravityPay = async () => {
console.error('[VP] 支付失败:', JSON.stringify(err2)) console.error('[VP] 支付失败:', JSON.stringify(err2))
vpStatus.value = true vpStatus.value = true
vpSuccess.value = false vpSuccess.value = false
vpStatusText.value = err2?.errMsg || '支付取消' vpStatusText.value = friendlyVpError(err2?.errMsg) || '你已取消支付'
}, },
}) })
} else { } else {
@@ -381,7 +381,7 @@ const startPlanPay = async (selectedPlan) => {
console.error('[VP-plan] 支付失败:', JSON.stringify(err2)) console.error('[VP-plan] 支付失败:', JSON.stringify(err2))
vpStatus.value = true vpStatus.value = true
vpSuccess.value = false vpSuccess.value = false
vpStatusText.value = err2?.errMsg || '支付取消' vpStatusText.value = friendlyVpError(err2?.errMsg) || '你已取消支付'
}, },
}) })
} else { } else {
+48
View File
@@ -22,3 +22,51 @@ export function checkAuth(res: any): boolean {
} }
return false return false
} }
/**
* 微信虚拟支付(VP)错误消息 → 用户友好中文提示
* 覆盖 wx.requestVirtualPayment fail 回调中的常见错误码
*/
export function friendlyVpError(errMsg: string): string {
if (!errMsg) return '支付失败,请重试'
const map: Record<string, string> = {
'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 || '未知错误'}`
}