19日0335-修复划转订单金额转换和手续费逻辑.md 3.8 KB

修复划转订单金额转换和手续费逻辑

时间: 2025-06-19 03:35
任务: 修复划转订单44金额转换错误问题,并改进手续费收取逻辑

问题分析

原始问题(订单44)

  • 输入外部金额: 2500
  • 错误的外部金额: 8.3333333333
  • 错误的内部金额: 2500.0000000000
  • 根本原因: 第三方应用金额转换逻辑存在双重转换问题

手续费逻辑问题(订单51)

  • 用户反馈: "外部金额10,内部3000,再加上手续费只会更多,怎么还变少了呢?"
  • 原逻辑: 手续费从转出金额中扣除(转出2990+手续费10=总扣3000)
  • 新需求: 手续费额外收取(转出3000+手续费10=总扣3010)

修复内容

1. 修复金额转换双重转换问题

问题:

  • TransferThirdPartyService::createWithdrawOrder中转换一次
  • TransferLogic::createTransferOutForThirdParty中再转换一次

修复:

  • 移除TransferThirdPartyService中的金额转换
  • 只在TransferLogic::createTransferOutForThirdParty中进行转换

2. 修改手续费逻辑为额外收取模式

修改文件:

  • app/Module/Transfer/Logics/TransferLogic.php
  • app/Module/Transfer/Models/TransferApp.php
  • app/Module/Transfer/Validators/TransferBalanceValidator.php

核心变更:

// 原逻辑:转账扣除手续费后的金额
$tradeResult = $userFundService->trade(
    $app->fund_to_uid,
    $order->actual_amount, // 2990(扣除手续费后)
    'transfer_out',
    $order->id,
    "转出到{$app->title}"
);

// 新逻辑:转账完整金额,手续费额外收取
$tradeResult = $userFundService->trade(
    $app->fund_to_uid,
    $order->amount, // 3000(完整金额)
    'transfer_out',
    $order->id,
    "转出到{$app->title}"
);

3. 新增专用手续费计算方法

新增方法: TransferApp::calculateOutFeeWithExtraCharge

// 计算用户总支付金额(转出金额 + 手续费)
$actualAmount = bcadd($amountDecimal, $feeAmount, 4);

保持原方法: TransferApp::calculateFee(用于转入)

// 计算实际到账金额(扣除手续费后)
$actualAmount = bcsub($amountDecimal, $feeAmount, 4);

测试验证

修复前后对比

项目 订单44(错误) 订单51(原逻辑) 订单52(修复后)
外部金额输入 2500 10 10
外部金额存储 8.3333 10.0000 10.0000
内部金额存储 2500.0000 3000.0000 3000.0000
转出到目标账户 - 2990钻石 3000钻石
手续费收取 - 10钻石 10钻石
用户总扣减 - 3000钻石 3010钻石
外部实际收到 - 2990钻石 3000钻石

资金日志验证(订单52)

转出操作: -3000钻石 (transfer_out-52)
手续费操作: -10钻石 (transfer_out_fee-52)
总扣减: 3010钻石 ✅

技术要点

1. 金额转换逻辑

  • 第三方应用: 外部金额 × 汇率 = 内部金额
  • 普通应用: 内部金额 ÷ 汇率 = 外部金额

2. 手续费模式区分

  • 转出: 手续费额外收取(用户支付转出金额+手续费)
  • 转入: 手续费从金额中扣除(用户收到转入金额-手续费)

3. 验证器一致性

  • 验证逻辑与执行逻辑保持一致
  • 转出验证:检查转出金额+手续费的总和
  • 转入验证:检查转入金额本身

提交记录

Commit: eccbff93
Message: 修改转出订单手续费逻辑为额外收取模式

结果

金额转换问题完全修复
手续费逻辑改为额外收取模式
验证器与执行逻辑保持一致
第三方应用金额处理正确

用户现在可以正确理解:转出3000钻石需要额外支付10钻石手续费,总共扣除3010钻石,外部系统收到完整的3000钻石。