为UrsCheckWebhook增加对数额0的兼容性处理,当金额为0时只返回用户余额信息,不进行手续费计算和其他复杂逻辑。
2025-06-19 00:05
在UrsCheckWebhook的验证逻辑中,存在以下限制:
// 验证金额
$amount = $request->input('amount');
if (!is_numeric($amount) || $amount <= 0) {
throw new \Exception('提取金额必须大于0');
}
这个验证要求金额必须大于0,但在某些业务场景中,需要支持金额为0的查询请求,用于:
当金额为0时,应该:
修改前:
// 验证金额
$amount = $request->input('amount');
if (!is_numeric($amount) || $amount <= 0) {
throw new \Exception('提取金额必须大于0');
}
修改后:
// 验证金额
$amount = $request->input('amount');
if (!is_numeric($amount) || $amount < 0) {
throw new \Exception('提取金额不能为负数');
}
变化说明:
$amount <= 0 改为 $amount < 0在processCheck方法中添加了专门的0金额处理逻辑:
// 2. 获取用户钻石余额
$userFundService = new \App\Module\Fund\Services\FundService($farmUserId, 2);
$diamondBalance = $userFundService->balance();
$diamondBalanceFormatted = number_format($diamondBalance, 4);
// 3. 特殊处理:如果金额为0,只返回余额信息,不计算手续费
if (bccomp($amount, '0', 4) === 0) {
Log::info("URS余额查询(金额为0)", [
'urs_user_id' => $userId,
'farm_user_id' => $farmUserId,
'diamond_balance' => $diamondBalanceFormatted,
]);
return [
'check' => true,
'diamond_balance' => $diamondBalanceFormatted,
'principal_total' => '0.0000',
'fee_total' => '0.0000',
'required_total' => '0.0000',
'message' => '余额查询成功'
];
}
通过测试脚本验证了以下场景:
金额为0的余额查询
user_id=1, amount=0金额为正数的余额检查
user_id=1, amount=10.00负数金额验证
user_id=1, amount=-5.00从测试输出可以看到:
金额为0的响应:
{
"check": true,
"diamond_balance": "0.0000",
"principal_total": "0.0000",
"fee_total": "0.0000",
"required_total": "0.0000",
"message": "余额查询成功"
}
金额为正数的响应:
{
"check": false,
"diamond_balance": "0.0000",
"principal_total": "10.00",
"fee_total": "0.0000",
"required_total": "10.00",
"message": "未找到对应的划转应用配置"
}
负数金额的错误:
"提取金额不能为负数"
{
"success": true,
"data": {
"check": true,
"diamond_balance": "用户实际余额",
"principal_total": "0.0000",
"fee_total": "0.0000",
"required_total": "0.0000",
"message": "余额查询成功"
}
}
check: 固定为true(余额查询总是成功的)diamond_balance: 用户的实际钻石余额principal_total: 本金金额(0.0000)fee_total: 手续费金额(0.0000)required_total: 所需总金额(0.0000)message: 操作结果消息客户端可以通过传递amount=0来查询用户余额,而不需要指定具体的提取金额。
系统可以使用amount=0来验证用户账户状态和服务可用性。
前端可以在用户进入提取页面时先查询余额,然后再进行具体的提取操作。
可以批量检查多个用户的账户状态,而不需要指定具体金额。
check字段为true不代表可以提取任意金额UrsCheckWebhook的数额0兼容性支持实现完全成功,提供了:
这个改进使得UrsCheckWebhook更加灵活,支持更多的业务场景,同时保持了代码的简洁性和安全性。