文件
fenleixinxi/application/common/library/WithdrawText.php

101 行
3.9 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace app\common\library;
/**
* 提现文案翻译
*
* 微信商家转账会把失败/撤销以「错误码」形式返回(如 MCH_CANCEL、NOT_ENOUGH),
* 早期驳回原因也存在数字编码,这些标识对用户不可读。
* 此处统一把码值翻译为中文,数据库仍保留原始码值以便排查。
*/
class WithdrawText
{
/** 微信转账失败/撤销错误码 → 中文说明 */
protected static $failMap = [
'NOT_ENOUGH' => '商户转账账户余额不足',
'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;
}
}