'商户转账账户余额不足', 'ACCOUNT_ERROR' => '收款账户状态异常', 'V2_ACCOUNT_SIMPLE_BAN' => '收款账户被限制收款', 'V3_ACCOUNT_NOT_EXIST' => '收款微信账户不存在', 'NAME_NOT_MATCH' => '收款人姓名与微信实名不一致', 'USER_NAME_NOT_MATCH' => '收款人姓名与微信实名不一致', 'REAL_NAME_CHECK_FAIL' => '收款人微信实名核验未通过', 'INVALID_OPENID' => '收款人微信标识无效', 'OPENID_ERROR' => '收款人微信标识异常', 'AMOUNT_EXCEED' => '超出单笔转账限额', 'DAILY_LIMIT_EXCEED' => '超出当日转账限额', 'MCH_CANCEL' => '商户主动撤销转账', 'MCH_REVOKE' => '商户主动撤销转账', 'TRANSFER_FAILED' => '微信转账未成功', 'FAIL' => '微信转账未成功', 'CANCEL' => '转账已撤销', 'CANCELLED' => '转账已撤销', 'PARAM_ERROR' => '转账参数有误,请联系客服', 'SYSTEM_ERROR' => '微信系统繁忙,请稍后重试', 'FREQUENCY_LIMITED' => '操作过于频繁,请稍后重试', 'RULE_LIMIT' => '触发微信风控限制', 'ACCOUNT_FROZEN' => '收款账户已被冻结', 'NO_AUTH' => '商户无转账接口权限', 'APPID_MCHID_NOT_MATCH' => '小程序与商户号不匹配', 'SIGN_ERROR' => '商户签名错误', 'IP_NOT_ALLOWED' => '服务器IP未加入微信白名单', 'IP_FORBIDDEN' => '服务器IP未加入微信白名单', ]; /** 未识别码值的兜底文案 */ const FAIL_FALLBACK = '微信转账未成功,请稍后重试或联系客服'; const REASON_FALLBACK = '审核未通过,请联系客服了解详情'; /** * 转账失败原因翻译 * * @param string $raw 数据库原始 fail_reason * @return string 可读中文 */ public static function fail($raw) { $text = trim((string)$raw); if ($text === '') { return ''; } // 去掉「微信转账失败:」这类前缀,只留原因本体 $text = preg_replace('/^微信转账(失败|撤销)[::]\s*/u', '', $text); $text = trim((string)$text); $code = strtoupper($text); if (isset(self::$failMap[$code])) { return self::$failMap[$code]; } // 纯码值(如 V3_XXX / ERR_123):翻译不出就兜底,不把码抛给用户 if (preg_match('/^[A-Z0-9_\-\.\/]{2,60}$/i', $text)) { return self::FAIL_FALLBACK; } // 已是中文(微信返回的描述)则直接展示 return $text; } /** * 驳回原因翻译 * * @param string $raw 数据库原始 reason * @return string 可读中文 */ public static function reason($raw) { $text = trim((string)$raw); if ($text === '') { return ''; } // 数字编码或纯码值(早期数据)→ 兜底文案 if (preg_match('/^[0-9]+$/', $text) || preg_match('/^[A-Z0-9_\-\.\/]{2,60}$/i', $text)) { return self::REASON_FALLBACK; } return $text; } }