101 行
3.9 KiB
PHP
101 行
3.9 KiB
PHP
<?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;
|
||
}
|
||
}
|