addError('缺少必需的用户ID或应用ID参数', 'amount'); return false; } $userId = $data['user_id']; $transferAppId = $data['transfer_app_id']; $inputAmount = (string) $value; // 输入金额 // 验证金额是否为正数 if (bccomp($inputAmount, '0', 10) <= 0) { $this->addError('转出金额必须大于0', 'amount'); return false; } try { // 获取转账应用配置 $transferApp = TransferApp::find($transferAppId); if (!$transferApp) { $this->addError('转账应用不存在', 'transfer_app_id'); return false; } // 检查应用是否启用 if (!$transferApp->is_enabled) { $this->addError('转账应用已禁用', 'transfer_app_id'); return false; } // 检查是否允许转出 if (!$transferApp->allow_transfer_out) { $this->addError('该应用不允许转出操作', 'transfer_app_id'); return false; } // 获取用户资金服务 $fundService = new FundService($userId, $transferApp->fund_id); // 检查用户账户是否存在 if (!$fundService->getAccount()) { $this->addError('用户资金账户不存在', 'user_id'); return false; } // 获取用户当前余额 $userBalance = $fundService->balance(); // 验证器接收到的金额统一为内部金额(调用方已经完成转换) $amountToCheck = $inputAmount; $amountDescription = "内部金额 {$inputAmount}"; // 计算手续费(基于内部金额) $feeInfo = $transferApp->calculateOutFee($amountToCheck); $totalRequired = bcadd($amountToCheck, $feeInfo['fee_amount'], 10); // 总需要金额 = 转出金额 + 手续费 // 验证余额是否充足 if (bccomp((string) $userBalance, $totalRequired, 10) < 0) { $this->addError("余额不足,当前余额:{$userBalance},需要金额:{$totalRequired}({$amountDescription})", 'amount'); return false; } // 将转账应用对象设置到验证器中,供后续使用 if (property_exists($this->validation, 'transfer_app')) { $this->validation->transfer_app = $transferApp; } return true; } catch (\Exception $e) { $this->addError('余额验证失败:' . $e->getMessage(), 'amount'); return false; } } }