更新时间: 2025-06-19 03:43 模块: Transfer 功能: 手续费系统 维护状态: 🔄 持续维护中
FeeService 增加 ,‘转移’方法用于将手续费转移到指定用户, 参数 :appid(出钱的), 目标用户ID(收钱的),金额(钱数), 订单ID(划转依据)
Transfer模块现已支持转入/转出手续费功能,可以为每个划转应用配置不同的手续费率、最低手续费和最高手续费。手续费系统支持灵活的配置选项,包括费率设置、限额控制、账户指定等功能,满足不同业务场景的需求。
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| fee_in_rate | DECIMAL(5,4) | 0.0000 | 转入手续费率(0.0000-1.0000) |
| fee_out_rate | DECIMAL(5,4) | 0.0000 | 转出手续费率(0.0000-1.0000) |
| fee_in_min | DECIMAL(15,4) | 0.0000 | 转入最低手续费 |
| fee_in_max | DECIMAL(15,4) | 0.0000 | 转入最高手续费(0为不限制) |
| fee_out_min | DECIMAL(15,4) | 0.0000 | 转出最低手续费 |
| fee_out_max | DECIMAL(15,4) | 0.0000 | 转出最高手续费(0为不限制) |
| fee_account_uid | INT | 1 | 手续费收取账户UID(默认为1) |
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| fee_rate | DECIMAL(5,4) | 0.0000 | 使用的手续费率 |
| fee_amount | DECIMAL(15,4) | 0.0000 | 手续费金额 |
| actual_amount | DECIMAL(15,4) | 0.0000 | 实际到账金额(扣除手续费后) |
手续费计算遵循以下步骤:
手续费 = 金额 × 手续费率if (手续费 < 最低手续费) 手续费 = 最低手续费if (最高手续费 > 0 && 手续费 > 最高手续费) 手续费 = 最高手续费实际到账金额 = 原金额 - 手续费假设应用配置:
不同金额的手续费计算:
| 转出金额 | 按比例计算 | 应用限制后 | 实际到账 | 说明 |
|---|---|---|---|---|
| 10.00 | 0.10 | 0.50 (最低) | 9.50 | 触发最低限制 |
| 100.00 | 1.00 | 1.00 | 99.00 | 正常计算 |
| 1500.00 | 15.00 | 10.00 (最高) | 1490.00 | 触发最高限制 |
| 0.00 | 0.00 | 0.50 (最低) | -0.50 | 零金额也收最低费 |
use App\Module\Transfer\Services\TransferService;
// 计算转出手续费
$feeInfo = TransferService::calculateOutFee(
transferAppId: 1,
amount: '100.00'
);
// 返回结果
[
'fee_rate' => 0.0100, // 手续费率
'fee_amount' => '1.0000', // 手续费金额
'actual_amount' => '99.0000' // 实际到账金额
]
// 计算转入手续费
$feeInfo = TransferService::calculateInFee(
transferAppId: 1,
amount: '100.00'
);
// 转出订单 - 手续费会自动计算并从用户账户扣除
$result = TransferService::createTransferOut(
transferAppId: 1,
userId: 12345,
amount: '100.00',
password: 'user_password'
);
// 转入订单 - 手续费会自动计算,用户收到扣除手续费后的金额
$result = TransferService::createTransferIn(
transferAppId: 1,
userId: 12345,
businessId: 'BIZ_001',
amount: '100.00'
);
$config = TransferService::getFeeConfig(transferAppId: 1);
// 返回结果
[
'in' => [
'rate' => 0.0050, // 转入费率 0.5%
'min' => 0.1000, // 最低 0.1
'max' => 5.0000, // 最高 5.0
'enabled' => true // 是否启用
],
'out' => [
'rate' => 0.0100, // 转出费率 1.0%
'min' => 0.2000, // 最低 0.2
'max' => 10.0000, // 最高 10.0
'enabled' => true // 是否启用
],
'account_uid' => 999 // 手续费收取账户
]
// 获取所有应用的手续费统计
$stats = TransferService::getFeeStatistics();
// 获取指定应用和时间范围的统计
$stats = TransferService::getFeeStatistics(
appId: 1,
startDate: '2025-06-01',
endDate: '2025-06-30'
);
// 返回结果
[
'total_orders' => 150, // 总订单数
'total_fee' => 125.50, // 总手续费
'avg_fee_rate' => 0.0075, // 平均费率
'in_orders' => 80, // 转入订单数
'in_fee' => 60.25, // 转入手续费
'out_orders' => 70, // 转出订单数
'out_fee' => 65.25, // 转出手续费
]
// 获取应用的手续费收入统计
$income = TransferService::getAppFeeIncome(
appId: 1,
days: 30
);
// 批量计算多个金额的手续费
$amounts = ['100.00', '200.00', '500.00'];
$feeResults = [];
foreach ($amounts as $amount) {
$feeResults[] = TransferService::calculateOutFee(
transferAppId: 1,
amount: $amount
);
}
// 预估手续费总额
$totalFee = array_sum(array_column($feeResults, 'fee_amount'));
// 验证手续费配置是否合理
$validation = TransferService::validateFeeConfig([
'fee_rate' => 0.0150, // 1.5%
'fee_min' => 0.10, // 最低0.1
'fee_max' => 50.00, // 最高50
]);
if ($validation['valid']) {
echo "配置有效";
} else {
echo "配置错误: " . $validation['message'];
}
用户账户 → 手续费账户 (手续费金额)
用户余额: 1000.00
转出金额: 100.00
手续费: 1.00
实际转出: 99.00
执行后:
- 用户余额: 899.00 (扣除 100.00)
- 目标账户: +99.00 (实际到账)
- 手续费账户: +1.00
来源账户 → 手续费账户 (手续费金额)
来源账户余额: 1000.00
转入金额: 100.00
手续费: 1.00
实际到账: 99.00
执行后:
- 来源账户余额: 900.00 (扣除 100.00)
- 用户账户: +99.00 (实际到账)
- 手续费账户: +1.00
fee_account_uid 或配置为0,系统自动使用账户UID 1收取手续费-- 配置应用手续费
UPDATE kku_transfer_apps
SET
fee_in_rate = 0.0050, -- 转入手续费 0.5%
fee_out_rate = 0.0100, -- 转出手续费 1.0%
fee_in_min = 0.1000, -- 转入最低手续费 0.1
fee_in_max = 10.0000, -- 转入最高手续费 10
fee_out_min = 0.2000, -- 转出最低手续费 0.2
fee_out_max = 20.0000, -- 转出最高手续费 20
fee_account_uid = 1 -- 手续费收取账户
WHERE keyname = 'game_app';
use App\Module\Transfer\Models\TransferApp;
$app = TransferApp::find(1);
// 检查是否启用手续费
if ($app->isFeeEnabled('out')) {
echo "转出手续费已启用";
}
// 计算手续费
$feeInfo = $app->calculateOutFee('100.00');
echo "手续费: {$feeInfo['fee_amount']}";
echo "实际到账: {$feeInfo['actual_amount']}";
use App\Module\Transfer\Models\TransferOrder;
$order = TransferOrder::find(1);
// 检查是否有手续费
if ($order->hasFee()) {
echo "手续费率: {$order->getFeeRatePercentAttribute()}";
echo "手续费金额: {$order->getFeeAmountTextAttribute()}";
echo "实际到账: {$order->getActualAmountTextAttribute()}";
}
-- 查找手续费异常高的订单
SELECT
id, transfer_app_id, amount, fee_rate, fee_amount, created_at
FROM kku_transfer_orders
WHERE fee_rate > 0.1000 -- 手续费率超过10%
OR fee_amount > amount * 0.1 -- 手续费超过金额的10%
ORDER BY created_at DESC;
-- 手续费收入日报
SELECT
DATE(created_at) as date,
COUNT(*) as orders,
SUM(fee_amount) as total_fee,
AVG(fee_rate) as avg_rate
FROM kku_transfer_orders
WHERE status = 100 AND fee_amount > 0
AND created_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
GROUP BY DATE(created_at)
ORDER BY date DESC;
// 调试手续费计算
$app = TransferApp::find(1);
$feeInfo = $app->calculateOutFee('100.00');
var_dump($feeInfo);
// 检查订单手续费信息
$order = TransferOrder::find(1);
echo "原金额: {$order->amount}";
echo "手续费: {$order->fee_amount}";
echo "实际金额: {$order->actual_amount}";
// 验证手续费配置
$app = TransferApp::find(1);
echo "转出费率: " . ($app->fee_out_rate * 100) . "%";
echo "最低费用: {$app->fee_out_min}";
echo "最高费用: " . ($app->fee_out_max > 0 ? $app->fee_out_max : '不限制');
// 测试不同金额的手续费
$testAmounts = ['10.00', '100.00', '1000.00'];
foreach ($testAmounts as $amount) {
$fee = TransferService::calculateOutFee(1, $amount);
echo "金额: {$amount}, 手续费: {$fee['fee_amount']}, 实际: {$fee['actual_amount']}";
}
文档创建时间: 2025-06-15 最后更新时间: 2025-06-19 03:43 维护状态: 🔄 持续维护中 如有疑问请联系开发团队