# BaseUrl: https://cmp-api.xm-iot.cn

错误响应示例：
{
  "code": 1001,
  "msg": "参数验证失败",
  "data": {},
  "timestamp": "2026-03-20T10:00:00Z"
}

# 2. 认证

## 2.1 资产验证

URL：
POST /api/c/v1/auth/verify-asset

请求说明：
- 请求方式：POST
- 认证方式：无需认证
- Content-Type：application/json

请求体参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求示例：
{
  "identifier": "1234567890"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "asset_token": "asset_token_example",
    "expires_in": 300
  }
}

字段说明：
data：
- asset_token：资产令牌（5分钟有效）
- expires_in：过期时间（秒）



## 2.2 公众号登录接口

## 接口信息
- **路径**：`POST /api/c/v1/auth/wechat-login`
- **说明**：公众号登录（通过微信 OAuth code 登录）
- **认证**：无需登录

---

## 请求参数

### Body（application/json）

```json
{
  "asset_token": "string",
  "code": "string"
}
```

---

## 参数说明

| 字段 | 必填 | 说明 |
|------|------|------|
| asset_token | 是 | A1 返回的资产令牌 |
| code | 是 | 微信 OAuth 授权码 |  wxea8c599fe100ce8a 先临时用这个

---

## 返回结构

```json
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-04-01T10:00:00Z",
  "data": {
    "is_new_user": false,
    "need_bind_phone": false,
    "token": "jwt_token"
  }
}
```

---

## data 字段说明

| 字段 | 说明 |
|------|------|
| is_new_user | 是否新用户 |
| need_bind_phone | 是否需要绑定手机号 |
| token | 登录后的 JWT Token |

## 2.3 发送验证码 

URL：
POST /api/c/v1/auth/send-code

请求说明：
- 请求方式：POST
- 认证方式：无需认证
- Content-Type：application/json

请求体参数：
- phone（string，必填）- 手机号（11位）
- scene（string，必填）- 业务场景（bind_phone:绑定手机号, change_phone_old:换绑旧手机, change_phone_new:换绑新手机）

请求示例：
{
  "phone": "13800138000",
  "scene": "bind_phone"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "cooldown_seconds": 60
  }
}

字段说明：
data：
- cooldown_seconds：冷却秒数



## 2.4 绑定手机号 

URL：
POST /api/c/v1/auth/bind-phone

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- phone（string，必填）- 手机号（11位）
- code（string，必填）- 验证码（6位）

请求示例：
{
  "phone": "13800138000",
  "code": "123456"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "phone": "13800138000",
    "bound_at": "2026-03-20T10:00:00Z"
  }
}

字段说明：
data：
- phone：已绑定手机号
- bound_at：绑定时间




## 2.5 更换手机号

URL：
POST /api/c/v1/auth/change-phone

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- old_phone（string，必填）- 旧手机号（11位）
- old_code（string，必填）- 旧手机号验证码（6位）
- new_phone（string，必填）- 新手机号（11位）
- new_code（string，必填）- 新手机号验证码（6位）

请求示例：
{
  "old_phone": "13800138000",
  "old_code": "123456",
  "new_phone": "13900139000",
  "new_code": "654321"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "phone": "13900139000",
    "changed_at": "2026-03-20T10:00:00Z"
  }
}

字段说明：
data：
- phone：换绑后手机号
- changed_at：换绑时间



## 2.6 退出登录

URL：
POST /api/c/v1/auth/logout

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）

请求示例：
（无请求体）

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "success": true
  }
}

字段说明：
data：
- success：是否成功


url: /api/c/v1/asset/info
请求地址的响应发生变化, 请根据变化来调整首页里面的数据 我有在响应后面加了注释
然后到期时间: 拿的是 资产套餐历史 列表里面的 "status_name": "生效中",expires_at
```json
{
  "code": 0,
  "data": {
    "asset_type": "device", // isDevice: true, 如果是device就是true
    "asset_id": 1,
    "identifier": "862639070804960", // 当前卡
    "virtual_no": "862639070804960",
    "status": 1, // 状态 到期时间右边那个 
    "real_name_status": 0, // 实名状态
    "carrier_name": "", // 运营商
    "generation": "1",
    "wallet_balance": 0,
    "current_package": "",
    "package_total_mb": 0,
    "package_used_mb": 0,
    "package_remain_mb": 0,
    "device_name": "WiFi1",
    "imei": "862639070804960",
    "device_model": "WM-2000",
    "device_type": "WiFi",
    "manufacturer": "华为",
    "max_sim_slots": 4,
    "bound_card_count": 1,
    "cards": [
      {
        "card_id": 5,
        "iccid": "89860441192590297661",
        "msisdn": "13800138000",
        "network_status": 0,
        "real_name_status": 0,
        "slot_position": 1,
        "is_current": false
      }
    ],
    "device_protect_status": "none",
    "device_realtime": {
      "gateway_msg": null,
      "online_status": 1, // 在线状态（1:在线, 2:离线）
      "battery_level": 100, // 设备电量
      "status": 0,
      "run_time": "527020",
      "connect_time": "239077",
      "rsrp": -78, // 根据这三个计算出网络信号
      "rsrq": -9, // 根据这三个计算出网络信号
      "rssi": "-47", // 根据这三个计算出网络信号
      "sinr": 12,
      "ssid": "MiFi-DA78", // WiFi名称
      "wifi_enabled": true,
      "wifi_password": "1234567890", // WiFi密码
      "wan_ip": "10.99.164.211",
      "lan_ip": "192.168.1.1", // 点击后台管理
      "mac_address": "60:83:e2:01:da:78",
      "daily_usage": "3321987788",
      "dl_stats": "0",
      "ul_stats": "0",
      "limit_speed": 0,
      "max_clients": 1, // 放到连接数里面 现在换成 client_number/max_clients
      "client_number": 1, // 已连接数 现在换成 client_number/max_clients
      "software_version": "LBF2AKAS01070_N20_8_ESIM_V001",
      "sync_interval": 120,
      "device_id": "862639070804960",
      "imei": "862639070804960",
      "imsi": "460068049567506"
    }
  },
  "msg": "success",
  "timestamp": "2026-03-30T09:21:25+08:00"
}
```


# 3. 资产

## 3.1 资产信息

URL：
GET /api/c/v1/asset/info

更新说明（2026-05-08）：
* 本月流量展示以该接口返回字段为准
* 总流量：`real_total_mb`
* 已使用：`enable_virtual_data=true` 时取 `virtual_used_mb`，否则取 `real_used_mb`
* 剩余：`real_total_mb - 已使用`
* 进度条：`已使用 / real_total_mb`

Query 参数：
identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
/api/c/v1/asset/info?identifier=1234567890

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "asset_id": 1,
    "asset_type": "device",
    "carrier_name": "中国移动",
    "generation": "4G",
    "identifier": "1234567890",
    "real_name_status": 1,
    "status": 1,
    "virtual_no": "17000000000",
    "wallet_balance": 1000
  }
}

字段说明：
data：
- asset_id：资产ID
- asset_type：资产类型（card:卡, device:设备）
- carrier_name：运营商名称
- generation：制式
- identifier：资产标识符
- real_name_status：实名状态（0:未实名, 1:已实名）
- status：状态（0:禁用, 1:启用）
- virtual_no：虚拟号
- wallet_balance：钱包余额（分）


## 3.2 资产套餐历史

URL：
GET /api/c/v1/asset/package-history

更新说明（2026-05-08）：
* 涉及“本月流量”展示时，以 `/api/c/v1/asset/info` 的规则为准
* 旧说明中“启用虚流量时总流量/剩余切换为虚流量”的规则已废弃
* 当前规则：总流量固定取 `real_total_mb`，已使用按 `enable_virtual_data` 在 `virtual_used_mb` / `real_used_mb` 间切换，剩余和进度条按该结果计算

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- page（integer，必填）- 页码
- page_size（integer，必填）- 每页数量
- package_type（string，可选）- 套餐类型 (formal:正式套餐, addon:加油包)
- status（integer，必填）- 套餐状态 (0:待生效, 1:生效中, 2:已用完, 3:已过期, 4:已失效)

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/asset/package-history?identifier=1234567890&page=1&page_size=10

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "items": [
      {
        "activated_at": "2026-03-01T00:00:00Z",
        "created_at": "2026-03-01T00:00:00Z",
        "data_limit_mb": 10240,
        "data_usage_mb": 2048,
        "expires_at": "2026-03-31T23:59:59Z",
        "master_usage_id": null,
        "package_id": 1001,
        "package_name": "10GB月套餐",
        "package_type": "formal",
        "package_usage_id": 5001,
        "priority": 1,
        "status": 1,
		"enable_virtual_data": true,
        "status_name": "生效中",
        "usage_type": "single_card",
        "virtual_limit_mb": 20480,
        "virtual_ratio": 0.5,
        "virtual_remain_mb": 16384,
        "virtual_used_mb": 4096
      }
    ],
    "page": 1,
    "page_size": 10,
    "total": 1
  }
}

字段说明：
data：
- items：套餐历史列表
- page：页码
- page_size：每页数量
- total：总数

data.items[]：
- activated_at：激活时间（待生效套餐为空）
- created_at：创建时间
- data_limit_mb：套餐真流量总量(MB)
- data_usage_mb：已用真流量(MB)
- expires_at：到期时间（待生效套餐为空）
- master_usage_id：主套餐ID（加油包时有值）
- package_id：套餐ID
- package_name：套餐名称
- package_type：套餐类型（formal 普通类型 / addon 加油包）
- package_usage_id：套餐使用记录ID
- priority：优先级
- status：状态（0待生效 1生效中 2已用完 3已过期 4已失效）
- status_name：状态名称
- usage_type：使用类型（single_card/device）
- virtual_limit_mb：套餐虚流量总量(MB)，按virtual_ratio换算
- virtual_ratio：虚流量比例(real/virtual)
- virtual_remain_mb：剩余虚流量(MB)，按virtual_ratio换算
- virtual_used_mb：已用虚流量(MB)，按virtual_ratio换算
- enable_virtual_data：是否启用虚流量 
* 如果启用了虚流量那么 本月流量展示的就是 套餐虚流量总量 剩余虚流量 已用虚流量 只是值用这些,已使用,总流量,剩余不要改
* 如果没有启用那就是 套餐真流量总量 已用真流量 剩余真流量(自己计算) 然后如果大于或者等于1024MB 转换成 GB
* 本月流量哪里需要调用这个接口,带上参数status: 1:生效中 只会有一个生效的
* 
## 3.3 资产可购套餐列表

URL：
GET /api/c/v1/asset/packages

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/asset/packages?identifier=1234567890

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "packages": [
      {
        "cost_price": 1000,
        "data_allowance": 10240,
        "data_unit": "MB",
        "description": "适用于日常上网使用",
        "is_addon": false,
        "package_id": 1001,
        "package_name": "10GB月套餐",
        "package_type": "formal",
        "retail_price": 1500,
        "validity_days": 30
      }
    ]
  }
}

字段说明：
data：
- packages：套餐列表

data.packages[]：
- cost_price：成本价（分）
- data_allowance：流量额度
- data_unit：流量单位
- description：套餐说明
- is_addon：是否加油包
- package_id：套餐ID
- package_name：套餐名称
- package_type：套餐类型（formal:正式套餐, addon:加油包）
- retail_price：零售价（分）
- validity_days：有效天数


## 3.4 资产刷新

URL：
POST /api/c/v1/asset/refresh

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求示例：
{
  "identifier": "1234567890"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "accepted": true,
    "cooldown_seconds": 60,
    "refresh_type": "device"
  }
}

字段说明：
data：
- accepted：是否已受理
- cooldown_seconds：冷却秒数
- refresh_type：刷新类型（card:卡, device:设备）


# 4. 设备

## 4.1 获取设备卡列表

URL：
GET /api/c/v1/device/cards

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/device/cards?identifier=1234567890

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "cards": [
      {
        "card_id": 1,
        "carrier_name": "中国移动",
        "iccid": "89860012345678901234",
        "is_active": true,
        "msisdn": "17000000000",
        "network_status": "online",
        "real_name_status": 1,
        "slot_position": 1
      }
    ]
  }
}

字段说明：
data：
- cards：设备卡列表

data.cards[]：
- card_id：卡ID
- carrier_name：运营商名称
- iccid：物联网卡ICCID
- is_active：是否当前激活卡
- msisdn：手机号
- network_status：网络状态
- real_name_status：实名状态（0:未实名, 1:已实名）
- slot_position：插槽位置

## 4.2 恢复出厂设置
URL：
POST /api/c/v1/device/factory-reset

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求示例：
{
  "identifier": "1234567890"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "accepted": true,
    "request_id": "req_123456789"
  }
}

字段说明：
data：
- accepted：是否已受理
- request_id：请求ID

## 4.3 设备重启

URL：
POST /api/c/v1/device/reboot

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求示例：
{
  "identifier": "1234567890"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "accepted": true,
    "request_id": "req_123456789"
  }
}

字段说明：
data：
- accepted：是否已受理
- request_id：请求ID

## 4.4 设备切卡

URL：
POST /api/c/v1/device/switch-card

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- target_iccid（string，必填）- 目标ICCID

请求示例：
{
  "identifier": "1234567890",
  "target_iccid": "89860012345678901234"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "accepted": true,
    "target_iccid": "89860012345678901234"
  }
}

字段说明：
data：
- accepted：是否已受理
- target_iccid：目标ICCID


## 4.5 设备WiFi配置 

URL：
POST /api/c/v1/device/wifi

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- enabled（boolean，必填）- 是否启用WiFi
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- password（string，必填）- WiFi密码
- ssid（string，必填）- WiFi名称

请求示例：
{
  "enabled": true,
  "identifier": "1234567890",
  "password": "12345678",
  "ssid": "MyWiFi"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "accepted": true,
    "request_id": "req_123456789"
  }
}

字段说明：
data：
- accepted：是否已受理
- request_id：请求ID


# 5. 换货

## 5.1 提交收货信息

URL：
POST /api/c/v1/exchange/{id}/shipping-info

Path 参数：
- id（integer，必填）- 换货单ID

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- recipient_address（string，必填）- 收货地址
- recipient_name（string，必填）- 收件人姓名
- recipient_phone（string，必填）- 收件人电话

请求示例：
{
  "recipient_address": "广东省深圳市南山区科技园1号",
  "recipient_name": "张三",
  "recipient_phone": "13800138000"
}

成功响应示例：
（接口文档未定义成功响应示例，通常为 200/204，可根据后端实际返回补充）

字段说明：
请求体：
- recipient_address：收货地址
- recipient_name：收件人姓名
- recipient_phone：收件人电话

## 5.2 查询待处理换货单

URL：
GET /api/c/v1/exchange/pending

Query 参数：
- identifier（string，必填）- 资产标识符（ICCID/虚拟号/IMEI/SN）

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/exchange/pending?identifier=1234567890

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "id": 1,
    "exchange_no": "EX202603200001",
    "exchange_reason": "设备故障",
    "status": 1,
    "status_text": "待填写信息",
    "created_at": "2026-03-20T10:00:00Z"
  }
}

字段说明：
data：
- id：换货单ID
- exchange_no：换货单号
- exchange_reason：换货原因
- status：换货状态（1:待填写信息, 2:待发货, 3:已发货待确认, 4:已完成, 5:已取消）
- status_text：换货状态文本
- created_at：创建时间


# 6. 订单

## 6.1 订单列表

URL：
GET /api/c/v1/orders

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- payment_status（integer，选填）- 支付状态（0:待支付, 1:已支付, 2:已取消）
- page（integer，必填）- 页码
- page_size（integer，必填）- 每页数量

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/orders?identifier=1234567890&payment_status=1&page=1&page_size=10

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "items": [
      {
        "created_at": "2026-03-20T10:00:00Z",
        "order_id": 1,
        "order_no": "ORD202603200001",
        "package_names": [
          "10GB月套餐",
          "5GB加油包"
        ],
        "payment_status": 1,
        "total_amount": 2500
      }
    ],
    "page": 1,
    "page_size": 10,
    "total": 1
  }
}

字段说明：
data：
- items：订单列表
- page：页码
- page_size：每页数量
- total：总数

data.items[]：
- created_at：创建时间
- order_id：订单ID
- order_no：订单号
- package_names：套餐名称列表
- payment_status：支付状态（0:待支付, 1:已支付, 2:已取消）
- total_amount：订单总金额（分）

## 6.2 订单详情

URL：
GET /api/c/v1/orders/{id}

Path 参数：
- id（integer，必填）- 订单ID

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/orders/1

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "completed_at": "2026-03-20T10:30:00Z",
    "created_at": "2026-03-20T10:00:00Z",
    "order_id": 1,
    "order_no": "ORD202603200001",
    "packages": [
      {
        "package_id": 1001,
        "package_name": "10GB月套餐",
        "package_type": "formal",
        "price": 1500,
        "quantity": 1
      },
      {
        "package_id": 1002,
        "package_name": "5GB加油包",
        "package_type": "addon",
        "price": 1000,
        "quantity": 1
      }
    ],
    "paid_at": "2026-03-20T10:05:00Z",
    "payment_method": "wechat",
    "payment_status": 1,
    "total_amount": 2500
  }
}

字段说明：
data：
- completed_at：完成时间
- created_at：创建时间
- order_id：订单ID
- order_no：订单号
- packages：订单套餐列表
- paid_at：支付时间
- payment_method：支付方式
- payment_status：支付状态（0:待支付, 1:已支付, 2:已取消）
- total_amount：订单总金额（分）

data.packages[]：
- package_id：套餐ID
- package_name：套餐名称
- package_type：套餐类型（formal:正式套餐, addon:加油包）
- price：单价（分）
- quantity：数量

## 6.3 创建订单

URL：
POST /api/c/v1/orders/create

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- app_type（string，必填）- 应用类型（official_account:公众号, miniapp:小程序）
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- package_ids（array<integer>，必填）- 套餐ID列表

请求示例：
{
  "app_type": "miniapp",
  "identifier": "1234567890",
  "package_ids": [1001, 1002]
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "linked_package_info": {
      "force_recharge_amount": 500,
      "package_names": [
        "10GB月套餐",
        "5GB加油包"
      ],
      "total_package_amount": 2500,
      "wallet_credit": 300
    },
    "order": {
      "created_at": "2026-03-20T10:00:00Z",
      "order_id": 1,
      "order_no": "ORD202603200001",
      "payment_status": 0,
      "total_amount": 2200
    },
    "order_type": "package",
    "pay_config": {
      "app_id": "wx1234567890",
      "nonce_str": "randomstring",
      "package": "prepay_id=wx201410272009395522657a690389285100",
      "pay_sign": "SIGNATURE",
      "sign_type": "RSA",
      "timestamp": "1710928800"
    },
    "recharge": {
      "amount": 500,
      "auto_purchase_status": "enabled",
      "recharge_id": 10,
      "recharge_no": "RC202603200001",
      "status": 0
    }
  }
}

字段说明：
data：
- linked_package_info：关联套餐信息
- order：订单信息
- order_type：订单类型（package:套餐订单, recharge:充值订单）
- pay_config：支付配置
- recharge：充值信息

data.linked_package_info：
- force_recharge_amount：强制充值金额（分）
- package_names：套餐名称列表
- total_package_amount：套餐总金额（分）
- wallet_credit：钱包抵扣金额（分）

data.order：
- created_at：创建时间
- order_id：订单ID
- order_no：订单号
- payment_status：支付状态（0:待支付, 1:已支付, 2:已取消）
- total_amount：订单总金额（分）

data.pay_config：
- app_id：应用ID
- nonce_str：随机字符串
- package：预支付参数
- pay_sign：支付签名
- sign_type：签名类型
- timestamp：时间戳

data.recharge：
- amount：充值金额（分）
- auto_purchase_status：自动购包状态
- recharge_id：充值ID
- recharge_no：充值单号
- status：状态（0:待支付, 1:已支付, 2:已关闭）


# 7. 实名

## 7.1 获取实名认证链接

URL：
GET /api/c/v1/realname/link

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- iccid（string，选填）- 物联网卡ICCID

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/realname/link?identifier=1234567890&iccid=89860012345678901234

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "card_info": {
      "iccid": "89860012345678901234",
      "msisdn": "17000000000",
      "virtual_no": "17100000000"
    },
    "expire_at": "2026-03-20T10:30:00Z",
    "realname_mode": "gateway",
    "realname_url": "https://example.com/realname/verify"
  }
}

字段说明：
data：
- card_info：卡片简要信息
- expire_at：过期时间
- realname_mode：实名模式（none:无需实名, template:模板实名, gateway:网关实名）
- realname_url：实名链接

data.card_info：
- iccid：物联网卡ICCID
- msisdn：手机号
- virtual_no：虚拟号


# 8. 钱包

## 8.1 钱包详情

URL：
GET /api/c/v1/wallet/detail

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/wallet/detail?identifier=1234567890

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "balance": 10000,
    "frozen_balance": 500,
    "resource_id": 1,
    "resource_type": "device",
    "updated_at": "2026-03-20T10:00:00Z",
    "wallet_id": 101
  }
}

字段说明：
data：
- balance：可用余额（分）
- frozen_balance：冻结余额（分）
- resource_id：资源ID
- resource_type：资源类型（iot_card:物联网卡, device:设备）
- updated_at：更新时间
- wallet_id：钱包ID

## 8.2 创建充值订单

URL：
POST /api/c/v1/wallet/recharge

请求说明：
- 请求方式：POST
- 认证方式：Bearer Token（JWT）
- Content-Type：application/json

请求体参数：
- amount（integer，必填）- 充值金额（分）
- app_type（string，必填）- 应用类型（official_account:公众号, miniapp:小程序）
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- payment_method（string，必填）- 支付方式（wechat:微信支付）

请求示例：
{
  "amount": 1000,
  "app_type": "miniapp",
  "identifier": "1234567890",
  "payment_method": "wechat"
}

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "pay_config": {
      "app_id": "wx1234567890",
      "nonce_str": "randomstring",
      "package": "prepay_id=wx201410272009395522657a690389285100",
      "pay_sign": "SIGNATURE",
      "sign_type": "RSA",
      "timestamp": "1710928800"
    },
    "recharge": {
      "amount": 1000,
      "recharge_id": 1,
      "recharge_no": "RC202603200001",
      "status": 0
    }
  }
}

字段说明：
data：
- pay_config：支付配置
- recharge：充值信息

data.pay_config：
- app_id：应用ID
- nonce_str：随机字符串
- package：预支付参数
- pay_sign：支付签名
- sign_type：签名类型
- timestamp：时间戳

data.recharge：
- amount：充值金额（分）
- recharge_id：充值ID
- recharge_no：充值单号
- status：状态（0:待支付, 1:已支付, 2:已关闭）


## 8.3 充值前校验

URL：
GET /api/c/v1/wallet/recharge-check

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/wallet/recharge-check?identifier=1234567890

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "force_recharge_amount": 1000,
    "max_amount": 100000,
    "message": "当前资产需先充值后再进行相关操作",
    "min_amount": 100,
    "need_force_recharge": true,
    "trigger_type": "low_balance"
  }
}

字段说明：
data：
- force_recharge_amount：强制充值金额（分）
- max_amount：最大充值金额（分）
- message：提示信息
- min_amount：最小充值金额（分）
- need_force_recharge：是否需要强制充值
- trigger_type：触发类型

## 8.4 充值记录列表

URL：
GET /api/c/v1/wallet/recharges

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- status（integer，选填）- 充值状态（0:待支付, 1:已支付, 2:已关闭）
- page（integer，必填）- 页码
- page_size（integer，必填）- 每页数量

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/wallet/recharges?identifier=1234567890&status=1&page=1&page_size=10

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "items": [
      {
        "amount": 1000,
        "auto_purchase_status": "enabled",
        "created_at": "2026-03-20T10:00:00Z",
        "payment_method": "wechat",
        "recharge_id": 1,
        "recharge_no": "RC202603200001",
        "status": 1
      }
    ],
    "page": 1,
    "page_size": 10,
    "total": 1
  }
}

字段说明：
data：
- items：充值记录列表
- page：页码
- page_size：每页数量
- total：总数

data.items[]：
- amount：充值金额（分）
- auto_purchase_status：自动购包状态
- created_at：创建时间
- payment_method：支付方式
- recharge_id：充值ID
- recharge_no：充值单号
- status：状态（0:待支付, 1:已支付, 2:已关闭）


## 8.5 钱包流水列表

URL：
GET /api/c/v1/wallet/transactions

Query 参数：
- identifier（string，必填）- 资产标识符（SN/IMEI/虚拟号/ICCID/MSISDN）
- transaction_type（string，选填）- 流水类型
- start_time（string，选填）- 开始时间
- end_time（string，选填）- 结束时间
- page（integer，必填）- 页码
- page_size（integer，必填）- 每页数量

请求说明：
- 请求方式：GET
- 认证方式：Bearer Token（JWT）

请求示例：
GET /api/c/v1/wallet/transactions?identifier=1234567890&transaction_type=recharge&start_time=2026-03-01T00:00:00Z&end_time=2026-03-20T23:59:59Z&page=1&page_size=10

成功响应示例：
{
  "code": 0,
  "msg": "success",
  "timestamp": "2026-03-20T10:00:00Z",
  "data": {
    "items": [
      {
        "amount": 1000,
        "balance_after": 5000,
        "created_at": "2026-03-20T10:00:00Z",
        "remark": "钱包充值",
        "transaction_id": 1,
        "type": "recharge"
      }
    ],
    "page": 1,
    "page_size": 10,
    "total": 1
  }
}

字段说明：
data：
- items：流水列表
- page：页码
- page_size：每页数量
- total：总数

data.items[]：
- amount：变动金额（分）
- balance_after：变动后余额（分）
- created_at：创建时间
- remark：备注
- transaction_id：流水ID
- type：流水类型
