# 小程序接口与 WebView 版本一致性方案

## 目标
- 小程序获取接口地址与 WebView 地址。
- 判断版本一致性与可用性。
- 不可用时提示用户退出小程序重新打开。

## 总体思路
采用“配置中心 + 启动校验 + 缓存兜底 + 失效提示”的方案：
1. 小程序启动时请求配置中心接口获取最新配置。
2. 校验小程序版本、API版本、WebView版本一致性。
3. 校验失败则提示退出重启；通过则写入缓存并使用配置。
4. 配置接口不可用时使用缓存，缓存失效则提示退出重启。

## 配置中心接口
- 方法: `GET`
- 路径: `/api/open/app/config`

### 返回示例
```json
{
  "app": {
    "minVersion": "1.2.0",
    "latestVersion": "1.3.5",
    "forceUpdate": true
  },
  "api": {
    "baseUrl": "https://api.xxx.com",
    "version": "2026-03-16",
    "minClientVersion": "1.2.0"
  },
  "webview": {
    "baseUrl": "https://m.xxx.com",
    "version": "2026-03-16",
    "minClientVersion": "1.2.0"
  },
  "ttlSeconds": 3600,
  "disabled": false,
  "disableReason": ""
}
```

### 字段说明
- `app.minVersion`: 最低可用小程序版本。
- `app.latestVersion`: 最新版本号。
- `app.forceUpdate`: 是否强制更新。
- `api.baseUrl`: API 入口地址。
- `api.version`: API 版本号（用于一致性校验）。
- `api.minClientVersion`: API 允许的最小客户端版本。
- `webview.baseUrl`: WebView 入口地址。
- `webview.version`: WebView 版本号（用于一致性校验）。
- `webview.minClientVersion`: WebView 允许的最小客户端版本。
- `ttlSeconds`: 配置缓存有效期（秒）。
- `disabled`: 服务下线开关。
- `disableReason`: 下线原因。

## 小程序启动校验流程
1. 小程序 `App.onLaunch` 请求 `/api/open/app/config`。
2. 校验顺序：
   - `disabled == true` → 提示“服务暂不可用，请退出小程序重新打开”。
   - `当前版本 < app.minVersion` → 提示强更并阻断。
   - `api.version != webview.version` → 提示“版本不一致，请退出小程序重新打开”。
   - `当前版本 < api.minClientVersion` 或 `当前版本 < webview.minClientVersion` → 提示强更。
3. 校验通过：
   - 缓存配置（本地 `storage`）。
   - 全局设置 API baseUrl 与 WebView baseUrl。

## 缓存与兜底策略
- 配置接口失败：
  - 如果本地缓存存在且未过期 → 使用缓存。
  - 若缓存过期或不存在 → 提示“配置获取失败，请退出小程序重新打开”。

## 提示文案建议
- 版本不一致：
  - “当前版本不一致，请退出小程序并重新打开以获取最新配置。”
- 服务不可用：
  - “服务暂不可用，请退出小程序重新打开。”
- 配置获取失败：
  - “配置获取失败，请退出小程序重新打开。”

## WebView 入口处理
- WebView URL 必须由配置中心下发，避免在客户端写死。
- 进入 WebView 前再次校验缓存是否过期；过期则重新拉取。

## 前端需要完成的部分
1. 在 `App.onLaunch` 拉取 `/api/open/app/config`，并写入本地缓存。
2. 实现版本校验逻辑（`app.minVersion`、`api.version`、`webview.version`、`minClientVersion`）。
3. 校验失败时弹窗提示，并引导退出小程序重新打开。
4. 缓存过期或接口失败时，优先使用缓存；无缓存则提示退出。
5. WebView 入口统一从配置下发的 `webview.baseUrl` 拼接跳转。
6. 请求 API 时统一使用配置下发的 `api.baseUrl`。

## 可选扩展
- 灰度策略：按用户或设备下发不同配置。
- 公告字段：返回 `notice` 用于维护提示。
