fix: 微信虚拟支付错误消息改为用户友好中文提示
- 新增 friendlyVpError() 工具函数,映射 VP 常见错误码 (pay cancel, access denied, SIGNATURE_INVALID 等) 为友好中文 - member.vue 两个 VP fail 回调使用 friendlyVpError 显示 原始: requestVirtualPayment:fail pay cancel 优化: 你已取消支付
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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 || '未知错误'})`
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user