# OpenAPI 接口 - 会员登录

> 模块标识：openapi  |  接口数量：66

## 接口说明
**方法**：	POST

**路径**：				/openapi/memberships/login

**功能说明**：
同时支持企业账号与散客账号的登录校验，并返回加密的登录令牌。如果用户有多个可用站点，会返回站点信息。散客账号登录时必须包含同意协议字段。

### 请求参数
```json
{
  "headers": [
    {
      "name": "Authorization",
      "type": "string",
      "required": true,
      "description": "登录令牌，包含手机号、密码和同意协议信息（散客账号必填），格式为 Bearer TOKEN。令牌 payload 应包含：phone（手机号）、password（密码）、agreeTerms（同意协议，散客账号必填且必须为 true）"
    },
    {
      "name": "X-System-Code",
      "type": "string",
      "required": true,
      "description": "系统编码。用于指定当前登录的业务系统（例如 AUTH_MANAGEMENT、CONTENT_MANAGEMENT）。当系统不支持时将返回“登录用户不支持当前系统，可联系管理员处理”。"
    }
  ]
}
```

### 响应示例

#### 有个人站点

```json
{
  "code": "0000",
  "message": "登录成功",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "user": {
      "id": "BAKj1wKp7etrmSAT",
      "code": "USER000001",
      "username": "企业管理员",
      "phone": "13800138000",
      "email": "admin@example.com",
      "individualism": true,
      "status": 1,
      "createTime": "2025-01-21T10:00:00.000Z",
      "accountType": "user",
      "type": "普通用户"
    },
    "companyName": "靖苒数字",
    "site": {
      "id": "MNFIOHH6QOA3kg0z",
      "key": "A1B2C3D4-E5F6-7890-ABCD-EF1234567890-ABCDEF12",
      "name": "个人站点",
      "createTime": "2025-01-21T10:00:00.000Z"
    }
  }
}
```

#### 无个人站点

```json
{
  "code": "0000",
  "message": "登录成功",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIs...",
    "user": {
      "id": "BAKj1wKp7etrmSAT",
      "code": "USER000001",
      "username": "企业管理员",
      "phone": "13800138000",
      "email": "admin@example.com",
      "individualism": false,
      "status": 1,
      "createTime": "2025-01-21T10:00:00.000Z",
      "accountType": "user",
      "type": "普通用户"
    },
    "companyName": "靖苒数字",
    "site": null
  }
}
```

### 注意事项
- 优先尝试企业账号登录，失败后自动回退到散客账号校验。
- 散客账号登录时，登录令牌的 payload 中必须包含 agreeTerms 字段且值为 true，否则返回错误码 1303（请同意隐私等协议）。
- 企业账号登录时，agreeTerms 字段可选，不影响登录流程。
- 成功时 data.token 与响应 Header X-OpenAPI-Result 均为加密令牌。
- 响应中的 site 字段说明：
-   - site 字段只返回个人站点信息（如果用户有个人站点），不会返回所属站点信息
-   - 有个人站点时：site 字段包含个人站点的完整信息（id、key、name、createTime）
-   - 无个人站点时：site 字段为 null（无论用户是否有所属站点）
-   - 判断逻辑：只需判断 site 是否为 null 即可知道用户是否有个人站点
-   - 注意：用户可能既有所属站点（通过 user.siteKey 访问），也有个人站点（通过 site 字段访问）
- 后续请求可通过 X-Site header 切换站点，切换后使用对应站点的数据库。

