test_urs_check_with_dto.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. /**
  3. * 测试URS余额检查功能与新的DTO集成
  4. */
  5. require_once __DIR__ . '/vendor/autoload.php';
  6. // 初始化Laravel应用
  7. $app = require_once __DIR__ . '/bootstrap/app.php';
  8. $app->make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
  9. echo "=== URS余额检查DTO集成测试 ===\n\n";
  10. // 测试数据
  11. $testData = [
  12. 'user_id' => 10003, // URS用户ID
  13. 'amount' => '50.0000'
  14. ];
  15. // 生成签名
  16. $secretKey = 'test_secret_key_for_urs_integration_2024';
  17. $timestamp = time();
  18. $signData = [
  19. 'user_id' => $testData['user_id'],
  20. 'amount' => $testData['amount'],
  21. 'timestamp' => $timestamp
  22. ];
  23. ksort($signData);
  24. $signString = http_build_query($signData);
  25. $signature = hash_hmac('sha256', $signString, $secretKey);
  26. echo "测试数据:\n";
  27. echo "URS用户ID: {$testData['user_id']}\n";
  28. echo "提取金额: {$testData['amount']}\n";
  29. echo "时间戳: {$timestamp}\n";
  30. echo "签名: {$signature}\n\n";
  31. // 构造请求数据
  32. $requestData = array_merge($testData, [
  33. 'timestamp' => $timestamp,
  34. 'signature' => $signature
  35. ]);
  36. try {
  37. // 模拟URS余额检查的核心逻辑
  38. echo "模拟URS余额检查核心逻辑...\n";
  39. $userId = $testData['user_id'];
  40. $amount = $testData['amount'];
  41. $thirdPartyAppId = 11; // URS应用ID
  42. // 1. 查找用户映射关系
  43. $userMapping = \App\Module\UrsPromotion\Models\UrsUserMapping::where('urs_user_id', $userId)
  44. ->where('status', 1)
  45. ->first();
  46. if (!$userMapping) {
  47. $result = [
  48. 'check' => false,
  49. 'diamond_balance' => '0.0000',
  50. 'principal_total' => $amount,
  51. 'fee_total' => '0.0000',
  52. 'required_total' => $amount,
  53. 'message' => '用户未进入农场系统'
  54. ];
  55. } else {
  56. $farmUserId = $userMapping->user_id;
  57. echo "找到用户映射: URS用户{$userId} -> 农场用户{$farmUserId}\n";
  58. // 2. 使用TransferThirdPartyService计算提取费用
  59. $feeDto = \App\Module\Transfer\Services\TransferThirdPartyService::calculateWithdrawFee(
  60. $thirdPartyAppId,
  61. $amount
  62. );
  63. if ($feeDto->hasError) {
  64. $result = [
  65. 'check' => false,
  66. 'diamond_balance' => '0.0000',
  67. 'principal_total' => $amount,
  68. 'fee_total' => '0.0000',
  69. 'required_total' => $amount,
  70. 'message' => $feeDto->errorMessage
  71. ];
  72. } else {
  73. // 3. 获取用户钻石余额
  74. $userFundService = new \App\Module\Fund\Services\FundService($farmUserId, 2); // 2是钻石的fund_id
  75. $diamondBalance = $userFundService->balance();
  76. $diamondBalanceFormatted = number_format($diamondBalance, 4); // 直接格式化,无需转换
  77. // 4. 计算所需总金额(本金 + 手续费)
  78. $principalAmount = $amount;
  79. $feeAmount = $feeDto->feeAmount;
  80. $requiredTotal = bcadd($principalAmount, $feeAmount, 4);
  81. // 5. 检查余额是否足够(直接比较小数值)
  82. $isAllowed = bccomp($diamondBalance, $requiredTotal, 10) >= 0;
  83. $result = [
  84. 'check' => $isAllowed,
  85. 'diamond_balance' => $diamondBalanceFormatted,
  86. 'principal_total' => $principalAmount,
  87. 'fee_total' => $feeAmount,
  88. 'required_total' => $requiredTotal,
  89. 'message' => $isAllowed ? '余额充足,允许提取' : '余额不足,无法提取'
  90. ];
  91. }
  92. }
  93. echo "返回结果:\n";
  94. echo json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) . "\n\n";
  95. // 验证结果结构
  96. $expectedKeys = ['check', 'diamond_balance', 'principal_total', 'fee_total', 'required_total', 'message'];
  97. $missingKeys = array_diff($expectedKeys, array_keys($result));
  98. if (empty($missingKeys)) {
  99. echo "✅ 返回结果结构正确,包含所有必需字段\n";
  100. } else {
  101. echo "❌ 返回结果缺少字段: " . implode(', ', $missingKeys) . "\n";
  102. }
  103. // 验证数据类型
  104. echo "\n字段类型验证:\n";
  105. echo "- check: " . gettype($result['check']) . " (" . ($result['check'] ? 'true' : 'false') . ")\n";
  106. echo "- diamond_balance: " . gettype($result['diamond_balance']) . " ({$result['diamond_balance']})\n";
  107. echo "- principal_total: " . gettype($result['principal_total']) . " ({$result['principal_total']})\n";
  108. echo "- fee_total: " . gettype($result['fee_total']) . " ({$result['fee_total']})\n";
  109. echo "- required_total: " . gettype($result['required_total']) . " ({$result['required_total']})\n";
  110. echo "- message: " . gettype($result['message']) . " ({$result['message']})\n";
  111. // 验证数值计算
  112. echo "\n数值计算验证:\n";
  113. $calculatedTotal = bcadd($result['principal_total'], $result['fee_total'], 4);
  114. echo "本金 + 手续费 = {$result['principal_total']} + {$result['fee_total']} = {$calculatedTotal}\n";
  115. echo "返回的required_total: {$result['required_total']}\n";
  116. echo "计算是否正确: " . ($calculatedTotal === $result['required_total'] ? '✅ 是' : '❌ 否') . "\n";
  117. } catch (\Exception $e) {
  118. echo "❌ 测试异常: " . $e->getMessage() . "\n";
  119. echo "堆栈跟踪:\n" . $e->getTraceAsString() . "\n";
  120. }
  121. echo "\n=== 测试完成 ===\n";