# 修复UrsCheckWebhook手续费计算问题 ## 任务概述 修复 UrsCheckWebhook 手续费计算问题,应该使用 URS 推广模块的手续费计算服务,而不是自己计算。 ## 完成时间 2025-06-22 19:18:45 - 2025-06-22 19:18:45 ## 问题分析 ### 原始问题 `UrsCheckWebhook` 在计算提现手续费时,使用了 `TransferThirdPartyService::calculateWithdrawFee()` 方法,但该方法没有传递用户上下文信息,导致 URS 推广模块的手续费监听器无法获取用户信息来计算正确的手续费率。 ### 根本原因 1. `calculateWithdrawFee` 方法没有传递用户ID等上下文信息 2. URS 推广模块的 `UrsTransferFeeListener` 需要用户ID来根据房屋等级和达人等级计算手续费率 3. 没有上下文信息时,只能使用默认的手续费率 ## 解决方案 ### 1. 修改 TransferThirdPartyService 在 `app/Module/Transfer/Services/TransferThirdPartyService.php` 中: - 保留原有的 `calculateWithdrawFee` 方法(向后兼容) - 新增 `calculateWithdrawFeeWithContext` 方法,支持传递上下文信息 - 原方法内部调用新方法,传递空数组作为上下文 ```php /** * 计算提现手续费(带上下文信息) * * @param int $thirdPartyAppId 三方应用ID * @param string $amount 提现金额 * @param array $context 上下文信息(包含用户ID等,用于URS推广模块计算手续费率) * @return TransferFeeDto */ public static function calculateWithdrawFeeWithContext(int $thirdPartyAppId, string $amount, array $context = []): TransferFeeDto ``` ### 2. 修改 UrsCheckWebhook 在 `ThirdParty/Urs/Webhook/UrsCheckWebhook.php` 中: - 将原来的 `calculateWithdrawFee` 调用改为 `calculateWithdrawFeeWithContext` - 传递农场用户ID作为上下文信息,让URS推广模块能够计算正确的手续费率 ```php // 修改前 $feeDto = \App\Module\Transfer\Services\TransferThirdPartyService::calculateWithdrawFee( $thirdPartyAppId, $amount ); // 修改后 $feeDto = \App\Module\Transfer\Services\TransferThirdPartyService::calculateWithdrawFeeWithContext( $thirdPartyAppId, $amount, ['user_id' => $farmUserId] // 传递农场用户ID ); ``` ## 测试验证 ### 测试结果 通过编写测试脚本验证修改效果: 1. **不带用户上下文的手续费计算**: - 手续费率: 0.01 (1%) - 手续费金额: 10.0000 2. **带用户上下文的手续费计算**: - 手续费率: 0.04 (4%) - 手续费金额: 400.0000 3. **直接调用URS推广模块服务**: - URS推广模块计算的手续费率: 0.04 ### 验证结论 - ✅ 修改成功:带用户上下文时,URS推广模块的监听器被正确触发 - ✅ 手续费率从默认的1%变为根据用户等级计算的4% - ✅ 直接调用URS推广模块服务返回相同的4%费率 - ✅ 完整的URS检查Webhook流程正常工作 ## 技术细节 ### 事件机制工作流程 1. `UrsCheckWebhook` 调用 `calculateWithdrawFeeWithContext` 并传递用户ID 2. `TransferThirdPartyService` 调用 `TransferApp::calculateOutFee` 并传递上下文 3. `TransferApp::calculateOutFee` 调用 `FeeService::calculateOutFee` 4. `FeeService` 触发 `FeeCalculatingEvent` 事件 5. `UrsTransferFeeListener` 监听到事件,获取用户ID 6. 根据用户的房屋等级和达人等级计算最优手续费率 7. 修改事件中的手续费率和金额 8. 返回最终的手续费计算结果 ### 关键改进 - **向后兼容**:保留原有方法,不影响其他调用方 - **上下文传递**:通过事件机制正确传递用户信息 - **模块解耦**:URS推广模块通过事件监听器影响手续费计算,不直接耦合 ## 影响范围 - ✅ UrsCheckWebhook 现在使用正确的手续费率 - ✅ 其他使用 `calculateWithdrawFee` 的代码不受影响 - ✅ URS推广模块的手续费配置功能得到正确应用 ## 提交信息 ``` 修复UrsCheckWebhook手续费计算问题 - 修改UrsCheckWebhook使用URS推广模块的手续费计算服务 - 在TransferThirdPartyService中添加calculateWithdrawFeeWithContext方法 - 传递用户ID上下文信息,让URS推广模块能够根据房屋等级和达人等级计算正确的手续费率 - 测试验证:不带上下文使用默认费率1%,带上下文使用URS推广模块费率4% ```