322 lines
8.9 KiB
Markdown
322 lines
8.9 KiB
Markdown
# 等级体系 Flutter 对接
|
||
|
||
## 地址
|
||
|
||
Base URL:`https://<gateway-host>`
|
||
|
||
| 功能 | Method | Path |
|
||
| --- | --- | --- |
|
||
| 我的等级总览 | `GET` | `/api/v1/levels/me/overview` |
|
||
| 单轨道等级详情 | `GET` | `/api/v1/levels/tracks/{track}` |
|
||
| 我的等级奖励记录 | `GET` | `/api/v1/levels/rewards` |
|
||
|
||
## 请求参数
|
||
|
||
Headers:
|
||
|
||
| Header | 必填 | 说明 |
|
||
| --- | --- | --- |
|
||
| `Authorization` | 是 | `Bearer <access_token>` |
|
||
| `X-App-Code` | 否 | App 编码,默认 `lalu` |
|
||
|
||
`track`:
|
||
|
||
| 值 | 说明 |
|
||
| --- | --- |
|
||
| `wealth` | 财富等级,送出礼物价值累计 |
|
||
| `game` | 游戏等级,游戏消耗累计 |
|
||
| `charm` | 魅力等级,收到礼物价值累计 |
|
||
|
||
### `GET /api/v1/levels/me/overview`
|
||
|
||
无 query。
|
||
|
||
### `GET /api/v1/levels/tracks/{track}`
|
||
|
||
Path:
|
||
|
||
| 字段 | 必填 | 说明 |
|
||
| --- | --- | --- |
|
||
| `track` | 是 | `wealth` / `game` / `charm` |
|
||
|
||
### `GET /api/v1/levels/rewards`
|
||
|
||
Query:
|
||
|
||
| 字段 | 必填 | 默认 | 说明 |
|
||
| --- | --- | --- | --- |
|
||
| `track` | 否 | 全部 | `wealth` / `game` / `charm` |
|
||
| `status` | 否 | 全部 | `pending` / `running` / `granted` / `failed` |
|
||
| `page` | 否 | `1` | 页码,从 1 开始 |
|
||
| `page_size` | 否 | `20` | 每页数量,最大 `100` |
|
||
|
||
## 返回值
|
||
|
||
统一 envelope:
|
||
|
||
```json
|
||
{
|
||
"code": "OK",
|
||
"message": "ok",
|
||
"request_id": "req_xxx",
|
||
"data": {}
|
||
}
|
||
```
|
||
|
||
### 我的等级总览
|
||
|
||
```json
|
||
{
|
||
"code": "OK",
|
||
"message": "ok",
|
||
"request_id": "req_xxx",
|
||
"data": {
|
||
"tracks": [
|
||
{
|
||
"track": "wealth",
|
||
"name": "财富等级",
|
||
"level": 12,
|
||
"tier_id": 2,
|
||
"total_value": 158000,
|
||
"current_level_required_value": 150000,
|
||
"next_level": 13,
|
||
"next_level_required_value": 180000,
|
||
"display_avatar_frame_resource_id": 7001,
|
||
"display_badge_resource_id": 7002,
|
||
"reward_pending_count": 1,
|
||
"sort_order": 10
|
||
}
|
||
],
|
||
"server_time_ms": 1710000000000
|
||
}
|
||
}
|
||
```
|
||
|
||
`tracks[]`:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
| --- | --- | --- |
|
||
| `track` | string | 等级轨道 |
|
||
| `name` | string | 轨道展示名 |
|
||
| `level` | int | 当前等级 |
|
||
| `tier_id` | int64 | 当前命中的等级层 ID,没有则为 `0` |
|
||
| `total_value` | int64 | 当前累计值 |
|
||
| `current_level_required_value` | int64 | 当前等级门槛值 |
|
||
| `next_level` | int | 下一等级,没有则为 `0` |
|
||
| `next_level_required_value` | int64 | 下一等级门槛值,没有则为 `0` |
|
||
| `display_avatar_frame_resource_id` | int64 | 当前等级层头像框资源 ID,没有则为 `0` |
|
||
| `display_badge_resource_id` | int64 | 当前等级层徽章资源 ID,没有则为 `0` |
|
||
| `reward_pending_count` | int64 | 待发放或发放中的等级奖励数量 |
|
||
| `sort_order` | int | 排序 |
|
||
|
||
### 单轨道等级详情
|
||
|
||
```json
|
||
{
|
||
"code": "OK",
|
||
"message": "ok",
|
||
"request_id": "req_xxx",
|
||
"data": {
|
||
"overview": {
|
||
"track": "wealth",
|
||
"name": "财富等级",
|
||
"level": 12,
|
||
"tier_id": 2,
|
||
"total_value": 158000,
|
||
"current_level_required_value": 150000,
|
||
"next_level": 13,
|
||
"next_level_required_value": 180000,
|
||
"display_avatar_frame_resource_id": 7001,
|
||
"display_badge_resource_id": 7002,
|
||
"reward_pending_count": 1,
|
||
"sort_order": 10
|
||
},
|
||
"rules": [
|
||
{
|
||
"track": "wealth",
|
||
"level": 13,
|
||
"required_value": 180000,
|
||
"name": "财富13级",
|
||
"status": "active",
|
||
"reward_resource_group_id": 9001,
|
||
"sort_order": 13,
|
||
"display_config_json": "{\"long_badge_resource_id\":7003}",
|
||
"created_by_admin_id": 1,
|
||
"updated_by_admin_id": 1,
|
||
"created_at_ms": 1710000000000,
|
||
"updated_at_ms": 1710000000000
|
||
}
|
||
],
|
||
"tiers": [
|
||
{
|
||
"tier_id": 2,
|
||
"track": "wealth",
|
||
"min_level": 11,
|
||
"max_level": 20,
|
||
"name": "财富11-20级",
|
||
"display_avatar_frame_resource_id": 7001,
|
||
"display_badge_resource_id": 7002,
|
||
"reward_resource_group_id": 9002,
|
||
"status": "active",
|
||
"display_config_json": "{}",
|
||
"created_by_admin_id": 1,
|
||
"updated_by_admin_id": 1,
|
||
"created_at_ms": 1710000000000,
|
||
"updated_at_ms": 1710000000000
|
||
}
|
||
],
|
||
"server_time_ms": 1710000000000
|
||
}
|
||
}
|
||
```
|
||
|
||
`rules[]`:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
| --- | --- | --- |
|
||
| `track` | string | 等级轨道 |
|
||
| `level` | int | 等级 |
|
||
| `required_value` | int64 | 达到该等级需要的累计值 |
|
||
| `name` | string | 等级展示名 |
|
||
| `status` | string | `active` / `disabled` |
|
||
| `reward_resource_group_id` | int64 | 达到该级发放的资源组 ID,没有则为 `0` |
|
||
| `sort_order` | int | 排序 |
|
||
| `display_config_json` | string | JSON 字符串;长徽章素材取 `long_badge_resource_id` |
|
||
| `created_at_ms` | int64 | 创建时间 |
|
||
| `updated_at_ms` | int64 | 更新时间 |
|
||
|
||
`tiers[]`:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
| --- | --- | --- |
|
||
| `tier_id` | int64 | 等级层 ID |
|
||
| `track` | string | 等级轨道 |
|
||
| `min_level` | int | 起始等级 |
|
||
| `max_level` | int | 结束等级 |
|
||
| `name` | string | 等级层展示名 |
|
||
| `display_avatar_frame_resource_id` | int64 | 该等级层头像框资源 ID,没有则为 `0` |
|
||
| `display_badge_resource_id` | int64 | 该等级层徽章资源 ID,没有则为 `0` |
|
||
| `reward_resource_group_id` | int64 | 进入该等级层发放的资源组 ID,没有则为 `0` |
|
||
| `status` | string | `active` / `disabled` |
|
||
| `display_config_json` | string | JSON 字符串 |
|
||
| `created_at_ms` | int64 | 创建时间 |
|
||
| `updated_at_ms` | int64 | 更新时间 |
|
||
|
||
### 我的等级奖励记录
|
||
|
||
```json
|
||
{
|
||
"code": "OK",
|
||
"message": "ok",
|
||
"request_id": "req_xxx",
|
||
"data": {
|
||
"rewards": [
|
||
{
|
||
"reward_job_id": "greward_xxx",
|
||
"user_id": 10001,
|
||
"track": "wealth",
|
||
"reward_source_type": "level",
|
||
"reward_source_id": "13",
|
||
"resource_group_id": 9001,
|
||
"wallet_command_id": "growth_level_reward:greward_xxx",
|
||
"wallet_grant_id": "grant_xxx",
|
||
"status": "granted",
|
||
"attempt_count": 1,
|
||
"failure_reason": "",
|
||
"created_at_ms": 1710000000000,
|
||
"updated_at_ms": 1710000001000
|
||
}
|
||
],
|
||
"total": 1,
|
||
"page": 1,
|
||
"page_size": 20
|
||
}
|
||
}
|
||
```
|
||
|
||
`rewards[]`:
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
| --- | --- | --- |
|
||
| `reward_job_id` | string | 奖励任务 ID |
|
||
| `user_id` | int64 | 当前用户 ID |
|
||
| `track` | string | 等级轨道 |
|
||
| `reward_source_type` | string | `level` 单级奖励;`tier` 等级层奖励 |
|
||
| `reward_source_id` | string | `level` 时为等级;`tier` 时为等级层 ID |
|
||
| `resource_group_id` | int64 | 发放资源组 ID |
|
||
| `wallet_command_id` | string | 钱包发放幂等命令 ID |
|
||
| `wallet_grant_id` | string | 钱包发放记录 ID;未成功时为空 |
|
||
| `status` | string | `pending` / `running` / `granted` / `failed` |
|
||
| `attempt_count` | int | 发放尝试次数 |
|
||
| `failure_reason` | string | 失败原因 |
|
||
| `created_at_ms` | int64 | 创建时间 |
|
||
| `updated_at_ms` | int64 | 更新时间 |
|
||
|
||
## 错误处理
|
||
|
||
错误 envelope:
|
||
|
||
```json
|
||
{
|
||
"code": "INVALID_ARGUMENT",
|
||
"message": "invalid argument",
|
||
"request_id": "req_xxx"
|
||
}
|
||
```
|
||
|
||
| HTTP | `code` | 场景 | Flutter 处理 |
|
||
| --- | --- | --- | --- |
|
||
| `400` | `INVALID_ARGUMENT` | `track` 非法、`page` / `page_size` 非正整数 | 不重试,修正参数 |
|
||
| `401` | `UNAUTHORIZED` | token 缺失、无效或过期 | 重新登录或刷新 token |
|
||
| `403` | `PROFILE_REQUIRED` | 当前用户资料未完成 | 跳转资料补全 |
|
||
| `404` | `NOT_FOUND` | 后端返回目标不存在 | 刷新页面或展示空态 |
|
||
| `409` | `CONFLICT` | 后端状态冲突 | 刷新后重试 |
|
||
| `502` | `UPSTREAM_ERROR` | activity-service / wallet-service 暂不可用 | 可提示稍后重试 |
|
||
| `500` | `INTERNAL_ERROR` | 服务端内部错误 | 记录 `request_id` |
|
||
|
||
只有 `code == "OK"` 时读取 `data`。
|
||
|
||
## IM 消息接收
|
||
|
||
当前无等级专属 `TIMCustomElem`。
|
||
|
||
等级奖励资源组内包含钱包资产时,可能收到钱包 C2C 自定义消息:
|
||
|
||
| 字段 | 值 |
|
||
| --- | --- |
|
||
| `MsgType` | `TIMCustomElem` |
|
||
| `Desc` | `WalletBalanceChanged` |
|
||
| `Ext` / `extension` | `wallet_notice` |
|
||
| `CloudCustomData` | 与 `TIMCustomElem.Data` 相同的 JSON 字符串 |
|
||
|
||
`TIMCustomElem.Data`:
|
||
|
||
```json
|
||
{
|
||
"event_type": "WalletBalanceChanged",
|
||
"event_id": "wev_xxx",
|
||
"app_code": "lalu",
|
||
"transaction_id": "tx_xxx",
|
||
"command_id": "resource_group_grant:growth_level_reward:greward_xxx:item:1:asset:COIN",
|
||
"user_id": "10001",
|
||
"asset_type": "COIN",
|
||
"available_delta": 100,
|
||
"frozen_delta": 0,
|
||
"available_after": 1000,
|
||
"frozen_after": 0,
|
||
"balance_version": 18,
|
||
"created_at_ms": 1710000000000,
|
||
"source_created_at_ms": 1710000000000,
|
||
"metadata": {}
|
||
}
|
||
```
|
||
|
||
处理:
|
||
|
||
| 条件 | 处理 |
|
||
| --- | --- |
|
||
| `event_type != "WalletBalanceChanged"` | 忽略 |
|
||
| `event_id` 已处理 | 忽略 |
|
||
| `asset_type == "COIN"` | 更新金币余额 |
|
||
| `command_id` 包含 `growth_level_reward` | 刷新 `/api/v1/levels/me/overview` 和 `/api/v1/levels/rewards` |
|