diff --git a/app/admin/lang/en/mall/points_log.php b/app/admin/lang/en/mall/points_log.php new file mode 100644 index 0000000..49a3cc0 --- /dev/null +++ b/app/admin/lang/en/mall/points_log.php @@ -0,0 +1,13 @@ + 'User asset', + 'Points adjustment' => 'Points adjustment', + 'User asset not found' => 'User asset not found', + 'Points adjustment must be a non-zero integer' => 'Points adjustment must be a non-zero integer', + 'Insufficient available points' => 'Insufficient available points', + 'Administrator added %s points' => 'Administrator added %s points', + 'Administrator deducted %s points' => 'Administrator deducted %s points', + 'Points log cannot be modified' => 'Points log cannot be modified', + 'Points log cannot be deleted' => 'Points log cannot be deleted', +]; diff --git a/app/admin/lang/zh-cn/mall/points_log.php b/app/admin/lang/zh-cn/mall/points_log.php new file mode 100644 index 0000000..202607b --- /dev/null +++ b/app/admin/lang/zh-cn/mall/points_log.php @@ -0,0 +1,13 @@ + '用户资产', + 'Points adjustment' => '调整积分', + 'User asset not found' => '用户资产不存在', + 'Points adjustment must be a non-zero integer' => '调整积分必须为非零整数', + 'Insufficient available points' => '可用积分不足', + 'Administrator added %s points' => '管理员增加积分 %s', + 'Administrator deducted %s points' => '管理员扣除积分 %s', + 'Points log cannot be modified' => '积分流水不允许修改', + 'Points log cannot be deleted' => '积分流水不允许删除', +]; diff --git a/app/api/controller/v1/Playx.php b/app/api/controller/v1/Playx.php index e40fb32..e87c9f8 100644 --- a/app/api/controller/v1/Playx.php +++ b/app/api/controller/v1/Playx.php @@ -28,7 +28,7 @@ use support\Response; class Playx extends Api { /** - * 从请求解析 mall_user_asset.id(muser token、session、user_id 均指向资产表主键或 playx_user_id) + * 从请求解析 mall_user_asset.id(muser token 或 mall_session) */ private function resolvePlayxAssetIdFromRequest(Request $request): ?int { @@ -58,19 +58,6 @@ class Playx extends Api return $this->resolveAssetIdByToken($token); } - $userId = strval($request->post('user_id', $request->get('user_id', ''))); - if ($userId === '') { - return null; - } - if (ctype_digit($userId)) { - return intval($userId); - } - - $asset = MallUserAsset::where('playx_user_id', $userId)->find(); - if ($asset) { - return intval($asset->getKey()); - } - return null; } @@ -683,7 +670,7 @@ class Playx extends Api /** * 用户资产 - * GET /api/v1/playx/assets?user_id=xxx + * GET /api/v1/mall/assets */ public function assets(Request $request): Response { @@ -846,7 +833,7 @@ class Playx extends Api /** * 订单列表 - * GET /api/v1/playx/orders?user_id=xxx + * GET /api/v1/mall/orders */ public function orders(Request $request): Response { @@ -885,7 +872,7 @@ class Playx extends Api * 按订单 ID 查询订单(仅当前登录用户本人的订单) * GET /api/v1/mall/order?order_id=xxx * - * 鉴权:token / session_id / user_id(同 assets/orders) + * 鉴权:token / session_id(同 assets/orders) */ public function order(Request $request): Response { @@ -936,7 +923,7 @@ class Playx extends Api * 积分流水(领取/兑换/退回/管理员调整) * GET /api/v1/mall/pointsLogs * - * 鉴权:token / session_id / user_id(同 assets/orders) + * 鉴权:token / session_id(同 assets/orders) * * 参数: * - limit: 每页条数(默认 20,最大 100) diff --git a/app/api/lang/en.php b/app/api/lang/en.php index e7d64ea..9bb44c2 100644 --- a/app/api/lang/en.php +++ b/app/api/lang/en.php @@ -72,11 +72,11 @@ return [ 'Daily push signature missing or incomplete' => 'Daily push signature missing or incomplete', 'Daily push signature verification failed' => 'Daily push signature verification failed', 'Failed to ensure PlayX user asset' => 'Failed to ensure PlayX user asset', - 'claim_request_id and user_id/session_id required' => 'claim_request_id and user_id/session_id/token are required', + 'claim_request_id and user_id/session_id required' => 'claim_request_id and session_id/token are required', 'User asset not found' => 'User asset not found', 'No points to claim or limit reached' => 'No points to claim or daily limit reached', 'Claim success' => 'Claim successful', - 'item_id and user_id/session_id required' => 'item_id and user_id/session_id/token are required', + 'item_id and user_id/session_id required' => 'item_id and session_id/token are required', 'Item not found or not available' => 'Item not found or not available', 'Insufficient points' => 'Insufficient points', 'Administrator added %s points' => 'Administrator added %s points', diff --git a/app/api/lang/ms.php b/app/api/lang/ms.php index e843a06..332a30e 100644 --- a/app/api/lang/ms.php +++ b/app/api/lang/ms.php @@ -73,11 +73,11 @@ return [ 'Daily push signature missing or incomplete' => 'Tandatangan push harian tiada atau tidak lengkap', 'Daily push signature verification failed' => 'Pengesahan tandatangan push harian gagal', 'Failed to ensure PlayX user asset' => 'Gagal mencipta/memeta aset pengguna', - 'claim_request_id and user_id/session_id required' => 'claim_request_id dan user_id/session_id/token diperlukan', + 'claim_request_id and user_id/session_id required' => 'claim_request_id dan session_id/token diperlukan', 'User asset not found' => 'Aset pengguna tidak dijumpai', 'No points to claim or limit reached' => 'Tiada mata untuk dituntut atau had harian dicapai', 'Claim success' => 'Tuntutan berjaya', - 'item_id and user_id/session_id required' => 'item_id dan user_id/session_id/token diperlukan', + 'item_id and user_id/session_id required' => 'item_id dan session_id/token diperlukan', 'Item not found or not available' => 'Item tidak dijumpai atau tidak tersedia', 'Insufficient points' => 'Mata tidak mencukupi', 'Administrator added %s points' => 'Pentadbir menambah %s mata', diff --git a/app/api/lang/zh-cn.php b/app/api/lang/zh-cn.php index 09faaac..0ca7757 100644 --- a/app/api/lang/zh-cn.php +++ b/app/api/lang/zh-cn.php @@ -74,11 +74,11 @@ return [ 'Daily push signature missing or incomplete' => '签名缺失或不完整', 'Daily push signature verification failed' => '签名校验失败', 'Failed to ensure PlayX user asset' => '创建/映射用户资产失败', - 'claim_request_id and user_id/session_id required' => '缺少 claim_request_id,或未提供有效的 user_id/session_id/token', + 'claim_request_id and user_id/session_id required' => '缺少 claim_request_id,或未提供有效的 session_id/token', 'User asset not found' => '未找到用户资产', 'No points to claim or limit reached' => '暂无可领取积分或已达今日上限', 'Claim success' => '领取成功', - 'item_id and user_id/session_id required' => '缺少 item_id,或未提供有效的 user_id/session_id/token', + 'item_id and user_id/session_id required' => '缺少 item_id,或未提供有效的 session_id/token', 'Item not found or not available' => '商品不存在或已下架', 'Insufficient points' => '积分不足', 'Administrator added %s points' => '管理员增加积分 %s', diff --git a/docs/H5-积分商城接口文档.md b/docs/H5-积分商城接口文档.md index 31ebcb1..f625872 100644 --- a/docs/H5-积分商城接口文档.md +++ b/docs/H5-积分商城接口文档.md @@ -35,16 +35,15 @@ ## 2. 身份与鉴权(重要) -以下接口都会通过服务端逻辑解析“当前资产主体”,优先级如下: +以下接口通过服务端解析「当前资产主体」,**仅**支持: 1. **`session_id`**(GET/POST):对应表 `mall_session`,未过期则可映射到资产主体 -2. **`token`**(GET/POST 或 Header):支持会员 token 或 `muser` token(H5 临时登录签发) -3. **`user_id`**(GET/POST): - - 纯数字:视为 `mall_user_asset.id` - - 非纯数字:按 `mall_user_asset.playx_user_id` 查找 +2. **`token`**(GET/POST 或 Header `token` / `ba-token`):会员 token 或 H5 临时登录签发的 **`muser`** token + +不再支持单独传 `user_id` 作为鉴权参数(避免越权)。 推荐做法: -- H5 统一只用 **Header `token`**(值为 `muser` token),避免 URL 泄露与参数歧义。 +- H5 统一使用 **Header `token`**(`muser` 或 playX 换 session 后的凭证),避免 URL 泄露。 --- @@ -77,7 +76,7 @@ curl "https://{域名}/api/v1/temLogin?username=test001" **GET** ` /api/v1/mall/assets ` -鉴权:携带 `token` 或 `session_id` 或 `user_id` +鉴权:携带 `token` 或 `session_id` 成功返回 `data`: - `locked_points`:待领取积分 @@ -94,7 +93,7 @@ curl "https://{域名}/api/v1/temLogin?username=test001" 参数: - `claim_request_id`:必填,幂等键(建议:`{业务前缀}_{assetId}_{毫秒时间戳}`) -- 身份参数:`token` / `session_id` / `user_id` 三选一(推荐 `token`) +- 身份参数:`token` / `session_id`(推荐 Header `token`) 说明: - 同一个 `claim_request_id` 重复提交会直接返回成功(不会重复入账) @@ -117,7 +116,7 @@ curl "https://{域名}/api/v1/temLogin?username=test001" 参数: - `item_id`:必填 -- 身份参数:`token` / `session_id` / `user_id` +- 身份参数:`token` / `session_id` 返回: - `data.order_id` @@ -132,7 +131,7 @@ curl "https://{域名}/api/v1/temLogin?username=test001" 参数: - `item_id`:必填 - `address_id`:必填,收货地址主键(`mall_address.id`,须为当前用户资产下地址) -- 身份参数:`token` / `session_id` / `user_id` +- 身份参数:`token` / `session_id` 说明:服务端会将该地址在下单时刻的 **收货人 / 电话 / 完整地址** 写入订单字段(快照),并写入 `mall_order.mall_address_id` 关联所选地址。 @@ -144,7 +143,7 @@ curl "https://{域名}/api/v1/temLogin?username=test001" 参数: - `item_id`:必填 -- 身份参数:`token` / `session_id` / `user_id` +- 身份参数:`token` / `session_id` --- @@ -152,7 +151,7 @@ curl "https://{域名}/api/v1/temLogin?username=test001" **GET** ` /api/v1/mall/orders ` -鉴权:`token` / `session_id` / `user_id` +鉴权:`token` / `session_id` 说明: - 返回最多 100 条 @@ -164,7 +163,7 @@ curl "https://{域名}/api/v1/temLogin?username=test001" **GET** ` /api/v1/mall/order ` -鉴权:`token` / `session_id` / `user_id`(同订单列表) +鉴权:`token` / `session_id`(同订单列表) 参数(Query): - `order_id`:必填,商城订单主键 `mall_order.id`(兼容参数名 `id`) @@ -191,7 +190,7 @@ curl -G "https://{域名}/api/v1/mall/order" \ **GET** ` /api/v1/mall/pointsLogs ` -鉴权:携带 `token` 或 `session_id` 或 `user_id` +鉴权:携带 `token` 或 `session_id` 参数(Query): - `limit`:可选,每页条数(默认 20,最大 100) diff --git a/docs/PlayX-接口文档.md b/docs/PlayX-接口文档.md index ce5d5f8..a849ad8 100644 --- a/docs/PlayX-接口文档.md +++ b/docs/PlayX-接口文档.md @@ -212,11 +212,8 @@ curl -X POST 'http://localhost:1818/api/v1/mall/dailyPush' \ * 若会话无效:兼容把 `session_id` 参数误当作 **商城 token** 再试一次(UUID 形态 token)。 2. **`token`**(`post` / `get` 或请求头 **`ba-token`** / **`token`**) * 校验 `token` 表:类型为会员 `user` 或商城临时 **`muser`**。未过期时,`user_id` 字段为 **`mall_user_asset.id`**(`muser`)或会员体系约定 ID(`user`)。 -3. **`user_id`**(`post` / `get` 兼容) - * **纯数字**:视为 **`mall_user_asset.id`**。 - * **非纯数字**:视为 **`playx_user_id`**,在 `mall_user_asset` 按该字段查找主键。 -> 注意:请求参数的取值方式是 `post()` 优先,`get()` 兼容(即同字段既可传 post 也可传 get)。 +> 注意:请求参数的取值方式是 `post()` 优先,`get()` 兼容。不再支持单独传 `user_id` 作为鉴权。 --- @@ -309,7 +306,7 @@ curl -X POST 'http://localhost:1818/api/v1/mall/verifyToken' \ ### 3.x 收货地址(`mall_address`) -> 下面接口用于 H5 维护收货地址。鉴权同本章其他接口:携带 `session_id` 或 `token` 或 `user_id`。 +> 下面接口用于 H5 维护收货地址。鉴权同本章其他接口:携带 `session_id` 或 `token`。 #### 3.x.1 地址列表 * 方法:`GET` @@ -353,7 +350,6 @@ Body:`id` 必填。若删除默认地址,服务端会自动挑选一条剩 * `session_id` * `token`(或请求头 `ba-token` / `token`) -* `user_id`(纯数字为 **`mall_user_asset.id`**,否则为 **`playx_user_id`**) #### 返回(成功 data) 若未找到资产:返回 0。 @@ -397,7 +393,7 @@ curl -G 'http://localhost:1818/api/v1/mall/assets' --data-urlencode 'token=上 * `claim_request_id`:幂等键(string,唯一) -鉴权:同 **3.1**(`session_id` / `token` / `user_id`) +鉴权:同 **3.1**(`session_id` / `token`) #### 返回(成功 data) 与 `用户资产` 返回字段一致(资产快照)。 @@ -497,7 +493,7 @@ curl -G 'http://localhost:1818/api/v1/mall/items' --data-urlencode 'type=WITHDRA #### 请求 Body 必填: * `item_id`:商品 ID(要求 `mall_item.type=BONUS` 且 `status=1`) -鉴权:同 **3.1**(`session_id` / `token` / `user_id`) +鉴权:同 **3.1**(`session_id` / `token`) #### 返回(成功) * `msg`:`Redeem submitted, please wait about 10 minutes` @@ -535,7 +531,7 @@ curl -X POST 'http://localhost:1818/api/v1/mall/bonusRedeem' \ 必填: * `item_id`:商品 ID(要求 `mall_item.type=PHYSICAL` 且 `status=1`) * `address_id`:收货地址 ID(`mall_address.id`,须属于当前用户资产;下单时写入 `mall_order.mall_address_id`,并将该地址快照写入 `receiver_name` / `receiver_phone` / `receiver_address`) -鉴权:同 **3.1**(`session_id` / `token` / `user_id`) +鉴权:同 **3.1**(`session_id` / `token`) #### 返回(成功) * `msg`:`Redeem success` @@ -569,7 +565,7 @@ curl -X POST 'http://localhost:1818/api/v1/mall/physicalRedeem' \ #### 请求 Body 必填: * `item_id`:商品 ID(要求 `mall_item.type=WITHDRAW` 且 `status=1`) -鉴权:同 **3.1**(`session_id` / `token` / `user_id`) +鉴权:同 **3.1**(`session_id` / `token`) #### 返回(成功) * `msg`:`Withdraw submitted, please wait about 10 minutes` @@ -605,7 +601,7 @@ curl -X POST 'http://localhost:1818/api/v1/mall/withdrawApply' \ #### 请求参数(鉴权) -同 **3.1**(`session_id` / `token` / `user_id`)。 +同 **3.1**(`session_id` / `token`)。 #### 返回(成功 data) @@ -654,7 +650,7 @@ curl -G 'http://localhost:1818/api/v1/mall/orders' --data-urlencode 'token=上 * 路径:`/api/v1/mall/pointsLogs` #### 请求参数(鉴权) -同 **3.1**(`session_id` / `token` / `user_id`)。 +同 **3.1**(`session_id` / `token`)。 #### Query 参数 | 字段 | 类型 | 必填 | 说明 |