/** * 清除登录状态 —— token 过期 / 未授权时调用 */ export function clearAuth() { uni.removeStorageSync('token') uni.removeStorageSync('userInfo') uni.showToast({ title: '登录已过期,请重新登录', icon: 'none' }) // 延迟跳转,避免和当前页面操作冲突 setTimeout(() => { uni.navigateTo({ url: '/pages/login/login' }) }, 800) } /** * 检查 uni.request 的响应是否为 401,是则自动清除登录态 * 返回 true 表示已处理 401(调用方应停止后续逻辑) */ export function checkAuth(res: any): boolean { if (res.statusCode === 401) { clearAuth() return true } 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 || '未知错误'})` }