| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- <?php
- /**
- * 测试URS余额检查功能与新的DTO集成
- */
- require_once __DIR__ . '/vendor/autoload.php';
- // 初始化Laravel应用
- $app = require_once __DIR__ . '/bootstrap/app.php';
- $app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
- echo "=== URS余额检查DTO集成测试 ===\n\n";
- // 测试数据
- $testData = [
- 'user_id' => 10003, // URS用户ID
- 'amount' => '50.0000'
- ];
- // 生成签名
- $secretKey = 'test_secret_key_for_urs_integration_2024';
- $timestamp = time();
- $signData = [
- 'user_id' => $testData['user_id'],
- 'amount' => $testData['amount'],
- 'timestamp' => $timestamp
- ];
- ksort($signData);
- $signString = http_build_query($signData);
- $signature = hash_hmac('sha256', $signString, $secretKey);
- echo "测试数据:\n";
- echo "URS用户ID: {$testData['user_id']}\n";
- echo "提取金额: {$testData['amount']}\n";
- echo "时间戳: {$timestamp}\n";
- echo "签名: {$signature}\n\n";
- // 构造请求数据
- $requestData = array_merge($testData, [
- 'timestamp' => $timestamp,
- 'signature' => $signature
- ]);
- try {
- // 模拟URS余额检查的核心逻辑
- echo "模拟URS余额检查核心逻辑...\n";
- $userId = $testData['user_id'];
- $amount = $testData['amount'];
- $thirdPartyAppId = 11; // URS应用ID
- // 1. 查找用户映射关系
- $userMapping = \App\Module\UrsPromotion\Models\UrsUserMapping::where('urs_user_id', $userId)
- ->where('status', 1)
- ->first();
- if (!$userMapping) {
- $result = [
- 'check' => false,
- 'diamond_balance' => '0.0000',
- 'principal_total' => $amount,
- 'fee_total' => '0.0000',
- 'required_total' => $amount,
- 'message' => '用户未进入农场系统'
- ];
- } else {
- $farmUserId = $userMapping->user_id;
- echo "找到用户映射: URS用户{$userId} -> 农场用户{$farmUserId}\n";
- // 2. 使用TransferThirdPartyService计算提取费用
- $feeDto = \App\Module\Transfer\Services\TransferThirdPartyService::calculateWithdrawFee(
- $thirdPartyAppId,
- $amount
- );
- if ($feeDto->hasError) {
- $result = [
- 'check' => false,
- 'diamond_balance' => '0.0000',
- 'principal_total' => $amount,
- 'fee_total' => '0.0000',
- 'required_total' => $amount,
- 'message' => $feeDto->errorMessage
- ];
- } else {
- // 3. 获取用户钻石余额
- $userFundService = new \App\Module\Fund\Services\FundService($farmUserId, 2); // 2是钻石的fund_id
- $diamondBalance = $userFundService->balance();
- $diamondBalanceFormatted = number_format($diamondBalance, 4); // 直接格式化,无需转换
- // 4. 计算所需总金额(本金 + 手续费)
- $principalAmount = $amount;
- $feeAmount = $feeDto->feeAmount;
- $requiredTotal = bcadd($principalAmount, $feeAmount, 4);
- // 5. 检查余额是否足够(直接比较小数值)
- $isAllowed = bccomp($diamondBalance, $requiredTotal, 10) >= 0;
- $result = [
- 'check' => $isAllowed,
- 'diamond_balance' => $diamondBalanceFormatted,
- 'principal_total' => $principalAmount,
- 'fee_total' => $feeAmount,
- 'required_total' => $requiredTotal,
- 'message' => $isAllowed ? '余额充足,允许提取' : '余额不足,无法提取'
- ];
- }
- }
-
- echo "返回结果:\n";
- echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
-
- // 验证结果结构
- $expectedKeys = ['check', 'diamond_balance', 'principal_total', 'fee_total', 'required_total', 'message'];
- $missingKeys = array_diff($expectedKeys, array_keys($result));
-
- if (empty($missingKeys)) {
- echo "✅ 返回结果结构正确,包含所有必需字段\n";
- } else {
- echo "❌ 返回结果缺少字段: " . implode(', ', $missingKeys) . "\n";
- }
-
- // 验证数据类型
- echo "\n字段类型验证:\n";
- echo "- check: " . gettype($result['check']) . " (" . ($result['check'] ? 'true' : 'false') . ")\n";
- echo "- diamond_balance: " . gettype($result['diamond_balance']) . " ({$result['diamond_balance']})\n";
- echo "- principal_total: " . gettype($result['principal_total']) . " ({$result['principal_total']})\n";
- echo "- fee_total: " . gettype($result['fee_total']) . " ({$result['fee_total']})\n";
- echo "- required_total: " . gettype($result['required_total']) . " ({$result['required_total']})\n";
- echo "- message: " . gettype($result['message']) . " ({$result['message']})\n";
-
- // 验证数值计算
- echo "\n数值计算验证:\n";
- $calculatedTotal = bcadd($result['principal_total'], $result['fee_total'], 4);
- echo "本金 + 手续费 = {$result['principal_total']} + {$result['fee_total']} = {$calculatedTotal}\n";
- echo "返回的required_total: {$result['required_total']}\n";
- echo "计算是否正确: " . ($calculatedTotal === $result['required_total'] ? '✅ 是' : '❌ 否') . "\n";
-
- } catch (\Exception $e) {
- echo "❌ 测试异常: " . $e->getMessage() . "\n";
- echo "堆栈跟踪:\n" . $e->getTraceAsString() . "\n";
- }
- echo "\n=== 测试完成 ===\n";
|