# 版本强更接口 App 对接

## 接口地址

`GET /api/v1/app/version`

公开接口，不需要 `Authorization`。

## Header

| Header | 必填 | 说明 |
| --- | --- | --- |
| `X-App-Code` | 否 | App 编码，默认 `lalu`。 |
| `X-App-Package` | 否 | App 包名；当前 `com.org.laluparty` 可解析为 `lalu`。 |
| `X-App-Platform` | 条件必填 | `android` 或 `ios`；query `platform` 为空时读取该 header。 |
| `X-App-Build-Number` | 条件必填 | 当前客户端编译版本号；query `build_number` 为空时读取该 header。 |
| `X-App-Version` | 否 | 当前客户端展示版本号，只用于日志排查。 |

## Query 参数

| 参数 | 必填 | 类型 | 说明 |
| --- | --- | --- | --- |
| `platform` | 条件必填 | string | `android` 或 `ios`；优先级高于 `X-App-Platform`。 |
| `build_number` | 条件必填 | int64 | 当前客户端编译版本号；优先级高于 `X-App-Build-Number`。 |

`platform` 必须通过 query 或 header 传入。`build_number` 对 App 端必须传；服务端缺省时按 `0` 处理，会导致已配置版本都被判定为有更新。

请求示例：

```http
GET /api/v1/app/version?platform=android&build_number=100
X-App-Code: lalu
X-App-Platform: android
X-App-Build-Number: 100
X-App-Version: 1.1.0
```

## 成功返回

```json
{
  "code": "OK",
  "message": "ok",
  "request_id": "req_abc",
  "data": {
    "app_code": "lalu",
    "platform": "android",
    "version": "1.2.0",
    "build_number": 120,
    "force_update": true,
    "download_url": "https://example.com/lalu.apk",
    "description": "修复已知问题",
    "has_update": true,
    "current_build_number": 100,
    "updated_at_ms": 1710000000000,
    "server_time_ms": 1710000001234
  }
}
```

返回字段：

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `app_code` | string | 服务端解析后的 App 编码。 |
| `platform` | string | `android` 或 `ios`。 |
| `version` | string | 后台配置的最新展示版本号，只用于展示。 |
| `build_number` | int64 | 后台当前最高编译版本号。 |
| `current_build_number` | int64 | 服务端收到的客户端编译版本号。 |
| `has_update` | bool | `build_number > current_build_number` 时为 `true`。 |
| `force_update` | bool | 当前客户端落后且后台最新版本标记强更时为 `true`。 |
| `download_url` | string | 更新跳转地址；Android 通常是 APK 下载页，iOS 通常是 App Store 链接。 |
| `description` | string | 更新说明，可为空。 |
| `updated_at_ms` | int64 | 后台版本配置更新时间，Unix epoch milliseconds。 |
| `server_time_ms` | int64 | gateway 返回时间，Unix epoch milliseconds。 |

## 错误码

| HTTP 状态码 | `code` | 触发条件 |
| --- | --- | --- |
| `400` | `INVALID_ARGUMENT` | `platform` 为空或不是 `android` / `ios`。 |
| `502` | `UPSTREAM_ERROR` | gateway 读取后台版本配置失败。 |

错误返回仍使用统一 envelope：

```json
{
  "code": "INVALID_ARGUMENT",
  "message": "platform is invalid",
  "request_id": "req_abc"
}
```
