فهرست منبع

第三方会员使用id

doge 11 ساعت پیش
والد
کامیت
a48e3a8f30

+ 27 - 1
app/Services/ThirdGameBalanceService.php

@@ -2,6 +2,7 @@
 
 namespace App\Services;
 
+use App\Models\User;
 use Carbon\Carbon;
 use Illuminate\Http\Client\Pool;
 use Illuminate\Http\Client\Response;
@@ -124,9 +125,34 @@ class ThirdGameBalanceService
         return $totals;
     }
 
+    /**
+     * member_id 仅用于找到用户,三方唯一 ID 只取 users.id。
+     */
     public function playerId(string $memberId): string
     {
-        return 'p' . substr(md5(config('third_game.sn') . '_' . $memberId), 0, 10);
+        $memberId = trim($memberId);
+        if ($memberId === '') {
+            throw new \InvalidArgumentException('member_id 不能为空');
+        }
+
+        $userId = (int) User::query()->where('member_id', $memberId)->value('id');
+        if ($userId <= 0) {
+            throw new \InvalidArgumentException('用户不存在,无法生成三方玩家 ID');
+        }
+
+        return $this->playerIdFromUserId($userId);
+    }
+
+    /**
+     * 新规则:直接 u + users.id,不补零、不做哈希。
+     */
+    public function playerIdFromUserId(int $userId): string
+    {
+        if ($userId <= 0) {
+            throw new \InvalidArgumentException('users.id 必须是正整数');
+        }
+
+        return 'u' . $userId;
     }
 
     /**

+ 19 - 7
app/Services/ThirdGameOrderService.php

@@ -262,22 +262,34 @@ class ThirdGameOrderService
      */
     private function usersByPlayerId(array $playerIds): array
     {
-        if ($playerIds === []) {
+        $requested = [];
+        foreach ($playerIds as $playerId) {
+            $playerId = trim((string) $playerId);
+            if (!preg_match('/^u([1-9]\d*)$/D', $playerId, $matches)) {
+                continue;
+            }
+            $userId = filter_var($matches[1], FILTER_VALIDATE_INT, [
+                'options' => ['min_range' => 1, 'max_range' => PHP_INT_MAX],
+            ]);
+            if ($userId !== false) {
+                $requested[(int) $userId] = $playerId;
+            }
+        }
+        if ($requested === []) {
             return [];
         }
 
-        $sn = (string) config('third_game.sn');
-        $placeholders = implode(',', array_fill(0, count($playerIds), '?'));
-        $expression = "CONCAT('p', SUBSTRING(MD5(CONCAT(?, '_', `member_id`)), 1, 10))";
         $rows = DB::table('users')
             ->select(['id', 'member_id', 'username', 'first_name'])
-            ->selectRaw($expression . ' AS third_game_player_id', [$sn])
-            ->whereRaw($expression . " IN ({$placeholders})", array_merge([$sn], $playerIds))
+            ->whereIn('id', array_keys($requested))
             ->get();
 
         $result = [];
         foreach ($rows as $row) {
-            $result[(string) $row->third_game_player_id] = $row;
+            $playerId = $requested[(int) $row->id] ?? null;
+            if ($playerId !== null) {
+                $result[$playerId] = $row;
+            }
         }
 
         return $result;

+ 1 - 1
docs/admin-third-game-order-api.md

@@ -42,7 +42,7 @@ Authorization: Bearer <token>
         "member_id": "10001",
         "username": "test01",
         "first_name": "测试用户",
-        "player_id": "p1234567890",
+        "player_id": "u123",
         "platform": "ag",
         "currency": "CNY",
         "game_type": 1,

+ 27 - 0
tests/Unit/ThirdGamePlayerIdTest.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace Tests\Unit;
+
+use App\Services\ThirdGameBalanceService;
+use InvalidArgumentException;
+use PHPUnit\Framework\TestCase;
+
+class ThirdGamePlayerIdTest extends TestCase
+{
+    public function test_player_id_uses_users_primary_key_without_padding(): void
+    {
+        $service = new ThirdGameBalanceService();
+
+        $this->assertSame('u1', $service->playerIdFromUserId(1));
+        $this->assertSame('u483', $service->playerIdFromUserId(483));
+        $this->assertSame('u751434', $service->playerIdFromUserId(751434));
+    }
+
+    public function test_player_id_rejects_non_positive_user_id(): void
+    {
+        $service = new ThirdGameBalanceService();
+
+        $this->expectException(InvalidArgumentException::class);
+        $service->playerIdFromUserId(0);
+    }
+}