配置已保存

天城智控 OpenAPI 测试工具

完整的 API 测试工具和 SDK 示例代码

# 接口详情 本文档说明 OpenAPI 当前开放的接口。除心跳接口外,请求都需要携带通用签名参数。 ## 通用请求参数 | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `access_key` | string | 是 | 访问密钥 | `ak_test123` | | `timestamp` | string | 是 | Unix 时间戳,单位秒 | `1730619000` | | `nonce` | string | 是 | 随机字符串,建议每次请求唯一 | `test123` | | `signature` | string | 是 | HMAC-SHA256 签名 | `abc123def456` | GET 接口使用 Query String 传参。POST 接口支持 `application/json` 和 `application/x-www-form-urlencoded`。 ## 通用响应结构 成功响应: ```json { "code": "OK", "msg": "ok", "data": {}, "ok": true } ``` 失败响应: ```json { "code": "InvalidParams", "msg": "提交的参数不符合要求", "ok": false } ``` 常见错误码: | code | HTTP 状态码 | 描述 | | --- | --- | --- | | `InvalidParams` | 400 | 参数缺失、格式错误或资源编号不存在 | | `BadRequest` | 400 | 业务规则不满足,例如需要先充值后实名 | | `AlreadyVerified` | 400 | 已完成实名认证 | | `PermissionDenied` | 403 | 没有操作权限 | | `Forbidden` | 403 | 无法访问当前资源 | | `InternalError` | 500 | 系统内部错误或上游接口异常 | --- ## 1. 心跳检测 检测服务是否正常运行,返回服务器当前时间。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `GET` | | 路径 | `/api/v1/heartbeat` | | 参数 | 通用签名参数 | **请求示例** ```bash GET /api/v1/heartbeat?access_key=ak_test123&timestamp=1730619000&nonce=test123&signature=abc123def456 Host: your-domain.com ``` **响应示例** ```text 2026-05-03T16:30:00+08:00 ``` --- ## 2. 获取可对接套餐列表 查询当前 API 账号可对接的套餐列表。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `GET` | | 路径 | `/api/v1/packages` | | 参数格式 | Query String | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `package_code` | string | 否 | 套餐编码,支持模糊筛选 | `pkg_d4k9...` | **请求示例** ```bash GET /api/v1/packages?package_code=pkg_d4k9...&access_key=ak_test123&timestamp=1730619000&nonce=test123&signature=abc123def456 Host: your-domain.com ``` **响应示例** ```json { "code": "OK", "msg": "ok", "data": [ { "id": 100, "upstream_package_code": "PKG001", "package_code": "pkg_d4k9...", "name": "联通月包10G", "description": "月租套餐", "launched": true, "operators": ["CUCC"], "weight": 100, "price": 19.9, "cost": 15, "low_price": 0, "high_price": 99, "total_flow": 10240, "can_buy_next_month": true, "type": "0", "buy_limit": 0, "day": 2, "cycle": 1, "unlimited": false, "daytime": 1, "add_time": 2, "flow_slicing_strategy": 0, "flow_slicing_count": 0, "series_name": "联通标准系列" } ], "ok": true } ``` **说明** - 仅返回当前 API 账号有权限对接的已上架套餐。 - `total_flow` 返回展示流量。 - `series_name` 只返回系列名称,不返回完整系列配置。 - `package_code` 为空时返回全部可对接套餐。 **data 数组字段说明** | 字段 | 类型 | 说明 | | --- | --- | --- | | `id` | number | 套餐 ID。该值是当前系统内套餐的唯一标识,仅用于展示或排查,不作为下单参数。 | | `upstream_package_code` | string | 上游套餐编码。仅用于识别上游套餐,不作为下单参数。 | | `package_code` | string | 套餐编码。下单时传 `package_code`。 | | `name` | string | 套餐名称。用于展示给用户。 | | `description` | string | 套餐描述或套餐备注。可能为空字符串。 | | `launched` | bool | 是否已上架。`true` 表示当前套餐可对接、可下单。 | | `operators` | string[] | 套餐支持的运营商列表。返回的是运营商编码数组。 | | `weight` | number | 套餐权重。通常用于前端排序,值越大通常越靠前。 | | `price` | number | 套餐销售价。单位为元。 | | `cost` | number | 套餐成本价。单位为元。 | | `low_price` | number | 套餐允许的最低售价。单位为元。 | | `high_price` | number | 套餐允许的最高售价。单位为元。 | | `total_flow` | number | 套餐总流量,单位为 MB。 | | `can_buy_next_month` | bool | 是否支持购买“次月生效”套餐。`true` 表示下单时可传 `strategy=2`。 | | `type` | string | 套餐类型。`"0"` 表示基础套餐,`"1"` 表示加油包。 | | `buy_limit` | number | 购买次数限制。`0` 一般表示不限制;大于 `0` 表示单个对象只能购买指定次数。 | | `day` | number | 套餐结算周期类型。`1`=按天,`2`=按月,`3`=每月 26 号结算。 | | `cycle` | number | 套餐周期数量。需要结合 `day` 一起理解。比如 `day=2` 且 `cycle=1` 表示 1 个月。 | | `unlimited` | bool | 是否为无限流量套餐。`true` 表示无限流量,`false` 表示非无限流量。 | | `daytime` | number | 套餐结算时间规则。`1`=在结算日当天结束时失效,`2`=在结算日的订购时间点失效。 | | `add_time` | number | 套餐时间叠加规则。`1`=无限叠加时间,`2`=立即生效,`3`=前一个套餐失效。 | | `flow_slicing_strategy` | number | 流量切片策略。`0`=不切片,`1`=按结算日自动切片,`2`=按平均值自动切片。 | | `flow_slicing_count` | number | 流量切片数量。仅当 `flow_slicing_strategy=2` 时有实际意义;其它情况通常为 `0`。 | | `series_name` | string | 套餐所属系列名称。当前开放接口只返回名称,不返回系列完整配置。 | **operators 字段取值说明** | 值 | 说明 | | --- | --- | | `CMCC` | 中国移动 | | `CUCC` | 中国联通 | | `CTCC` | 中国电信 | | `CBNC` | 中国广电 | **补充示例** - `day=2`、`cycle=1`:表示 1 个月套餐。 - `day=1`、`cycle=30`:表示 30 天套餐。 - `can_buy_next_month=true`:下游下单时可以传 `strategy=2` 表示次月生效。 - `buy_limit=3`:表示同一个卡板或设备最多购买 3 次该套餐。 --- ## 3. 卡板信息查询 查询指定卡板的流量、余额、状态和实名状态。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `GET` | | 路径 | `/api/v1/info` | | 参数格式 | Query String | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `card_no` | string | 是 | 卡板编号 | `CARD123456789` | **请求示例** ```bash GET /api/v1/info?card_no=CARD123456789&access_key=ak_test123&timestamp=1730619000&nonce=test123&signature=abc123def456 Host: your-domain.com ``` **响应示例** ```json { "code": "OK", "msg": "ok", "data": { "card_no": "CARD123456789", "total_flow": 10240, "used_flow": 5120, "status": 2, "official_real_name_verified": true, "balance": "100.50", "delete_on": "2026-06-01T00:00:00+08:00" }, "ok": true } ``` **data 字段说明** | 字段 | 类型 | 描述 | | --- | --- | --- | | `card_no` | string | 卡板编号 | | `total_flow` | number | 可用总流量,单位 MB | | `used_flow` | number | 已使用流量,单位 MB | | `status` | int | 卡板状态码 | | `official_real_name_verified` | bool | 是否官方实名 | | `balance` | number | 余额 | | `delete_on` | string | 当前在用套餐到期时间,可选 | --- ## 4. 获取卡板实名链接 获取指定卡板的官方实名链接。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `GET` | | 路径 | `/api/v1/real-name-url` | | 参数格式 | Query String | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `card_no` | string | 是 | 卡板编号 | `CARD123456789` | **请求示例** ```bash GET /api/v1/real-name-url?card_no=CARD123456789&access_key=ak_test123&timestamp=1730619000&nonce=test123&signature=abc123def456 Host: your-domain.com ``` **成功响应** ```json { "code": "OK", "msg": "ok", "data": "https://example.com/real-name?card_no=CARD123456789", "ok": true } ``` **业务规则** | 场景 | 返回 | | --- | --- | | 卡板已官方实名 | `AlreadyVerified`,`msg` 为 `当前卡板已完成实名认证` | | 套餐系列配置为先充值后实名,且卡板没有已支付订单 | `BadRequest`,`msg` 为 `卡板需要先充值后实名` | | 套餐系列不存在 | `DataMissing` | | 上游获取实名链接失败 | `InternalError`,`msg` 带具体失败原因 | --- ## 5. 刷新卡板流量 主动刷新指定卡板的最新流量信息,成功后仅返回成功状态。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `POST` | | 路径 | `/api/v1/refresh-flow` | | 参数格式 | JSON 或 Form | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `card_no` | string | 是 | 卡板编号 | `CARD123456789` | **请求示例** ```json { "card_no": "CARD123456789", "access_key": "ak_test123", "timestamp": "1730619000", "nonce": "test123", "signature": "abc123def456" } ``` **成功响应** ```json { "code": "OK", "msg": "ok", "ok": true } ``` --- ## 6. 卡板复机 对指定卡板执行复机操作。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `POST` | | 路径 | `/api/v1/start` | | 参数格式 | JSON 或 Form | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `card_no` | string | 是 | 卡板编号 | `CARD123456789` | **权限要求** API 账号必须具有停复机权限。 **成功响应** ```json { "code": "OK", "msg": "ok", "data": true, "ok": true } ``` --- ## 7. 卡板停机 对指定卡板执行停机操作。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `POST` | | 路径 | `/api/v1/stop` | | 参数格式 | JSON 或 Form | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `card_no` | string | 是 | 卡板编号 | `CARD123456789` | **权限要求** API 账号必须具有停复机权限。 **成功响应** ```json { "code": "OK", "msg": "ok", "data": true, "ok": true } ``` --- ## 8. 卡板套餐订购 为指定卡板订购套餐。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `POST` | | 路径 | `/api/v1/orders` | | 参数格式 | JSON 或 Form | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `card_no` | string | 是 | 卡板编号 | `CARD123456789` | | `package_code` | string | 是 | 套餐编码 | `pkg_d4k9...` | | `strategy` | uint8 | 是 | 生效策略,`1`=本月生效,`2`=次月生效 | `1` | **请求示例** ```json { "card_no": "CARD123456789", "package_code": "pkg_d4k9...", "strategy": 1, "access_key": "ak_test123", "timestamp": "1730619000", "nonce": "test123", "signature": "abc123def456" } ``` **成功响应** ```json { "code": "OK", "msg": "ok", "data": { "order_no": "ORD202605030001" }, "ok": true } ``` **业务规则** - 当前使用余额支付。 - 余额不足、套餐不可用、卡板状态不满足时会返回失败。 - `strategy=1` 表示本月生效,`strategy=2` 表示次月生效。 --- ## 9. 获取移动 Token 根据渠道 ID 获取移动下游实时 token。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `POST` | | 路径 | `/api/v1/token` | | 参数格式 | JSON 或 Form | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `channel_id` | uint | 是 | 渠道 ID,仅支持移动渠道 | `1` | **请求示例** ```json { "channel_id": 1, "access_key": "ak_test123", "timestamp": "1730619000", "nonce": "test123", "signature": "abc123def456" } ``` **成功响应** ```json { "code": "OK", "msg": "ok", "data": { "channel_id": 1, "token": "3d7d94df3cf1e7942efe408ee141cca6" }, "ok": true } ``` **业务规则** - 仅支持移动渠道。 - token 为实时获取结果,下游不应长期缓存。 - 渠道未配置移动 token 时会返回参数错误。 --- ## 10. 设备信息查询 查询指定设备信息,包括设备基础信息、流量信息和卡槽信息。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `GET` | | 路径 | `/api/v1/device/info` | | 参数格式 | Query String | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `device_no` | string | 是 | 设备编号 | `DEVICE123456789` | **请求示例** ```bash GET /api/v1/device/info?device_no=DEVICE123456789&access_key=ak_test123&timestamp=1730619000&nonce=test123&signature=abc123def456 Host: your-domain.com ``` **响应示例** ```json { "code": "OK", "msg": "ok", "data": { "device_no": "DEVICE123456789", "balance": "50.00", "signal": "4", "electricity": "85", "device_conn_num": 3, "wifi_status": 1, "hide_wifi": false, "wifi_name": "TCZK-5G", "used_flow": 1024.5, "total_flow": 20480, "delete_on": "2026-06-01T00:00:00+08:00", "card_slots": [ { "slot_code": "1", "card_no": "8986001234567890123", "official_real_name_verified": true, "card_status": 2, "is_main_slot": true, "is_current_slot": true } ] }, "ok": true } ``` **data 字段说明** | 字段 | 类型 | 描述 | | --- | --- | --- | | `device_no` | string | 设备编号 | | `balance` | number | 设备余额 | | `signal` | string | 信号强度 | | `electricity` | string | 电量 | | `device_conn_num` | int | 当前设备连接数 | | `wifi_status` | int | WiFi 状态 | | `hide_wifi` | bool | 是否隐藏 WiFi | | `wifi_name` | string | WiFi 名称 | | `used_flow` | number | 设备虚拟已用流量,单位 MB | | `total_flow` | number | 设备虚拟可用总流量,单位 MB | | `delete_on` | string | 当前在用套餐到期时间,可选 | | `card_slots` | array | 卡槽列表 | **card_slots 字段说明** | 字段 | 类型 | 描述 | | --- | --- | --- | | `slot_code` | string | 卡槽编号 | | `card_no` | string | 卡号 | | `official_real_name_verified` | bool | 当前卡槽卡板是否官方实名 | | `card_status` | int | 卡板状态码 | | `is_main_slot` | bool | 是否主卡槽 | | `is_current_slot` | bool | 是否当前在用卡槽 | --- ## 11. 获取设备实名链接 获取指定设备所有卡槽的官方实名链接列表。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `GET` | | 路径 | `/api/v1/device/real-name-url` | | 参数格式 | Query String | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `device_no` | string | 是 | 设备编号 | `DEVICE123456789` | **请求示例** ```bash GET /api/v1/device/real-name-url?device_no=DEVICE123456789&access_key=ak_test123&timestamp=1730619000&nonce=test123&signature=abc123def456 Host: your-domain.com ``` **成功响应** ```json { "code": "OK", "msg": "ok", "data": [ { "slot_code": "1", "card_no": "8986001234567890123", "official_real_name_verified": false, "is_main_slot": true, "is_current_slot": true, "url": "https://example.com/real-name?device_no=DEVICE123456789&slot=1" }, { "slot_code": "2", "card_no": "8986001234567890124", "official_real_name_verified": true, "is_main_slot": false, "is_current_slot": false, "url": "" } ], "ok": true } ``` **data 子字段说明** | 字段 | 类型 | 描述 | | --- | --- | --- | | `slot_code` | string | 卡槽编号,按卡槽编号排序返回 | | `card_no` | string | 卡号 | | `official_real_name_verified` | bool | 当前卡槽卡板是否已官方实名 | | `is_main_slot` | bool | 是否主卡槽 | | `is_current_slot` | bool | 是否当前在用卡槽 | | `url` | string | 实名链接;已实名或当前卡槽不可实名时为空字符串 | | `msg` | string | 当前卡槽不可实名的原因,可选 | **业务规则** | 场景 | 返回 | | --- | --- | | 当前卡槽已官方实名 | 该卡槽 `official_real_name_verified=true`,`url=""` | | 套餐系列要求先充值后实名,且设备或卡槽没有已支付订单 | 该卡槽 `url=""`,`msg` 为 `设备需要先充值后实名` | | 当前设备生效套餐为单网套餐,副卡槽不可实名 | 副卡槽 `url=""`,`msg` 为 `当前是单网套餐,不允许实名副卡槽` | | 设备卡板或卡槽配置异常 | `InternalError` | **说明** - 单网套餐只允许主卡槽实名。 - 如果卡槽配置为上游实名链接,系统会优先通过设备号获取上游设备实名链接;取不到时回退到卡板实名链接逻辑。 - 调用方只需要传 `device_no`,不需要传 `slot_code`。 --- ## 12. 设备套餐订购 为指定设备订购套餐。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `POST` | | 路径 | `/api/v1/device/orders` | | 参数格式 | JSON 或 Form | **业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `device_no` | string | 是 | 设备编号 | `DEVICE123456789` | | `package_code` | string | 是 | 套餐编码 | `pkg_d4k9...` | | `strategy` | uint8 | 是 | 生效策略,`1`=本月生效,`2`=次月生效 | `1` | **请求示例** ```json { "device_no": "DEVICE123456789", "package_code": "pkg_d4k9...", "strategy": 1, "access_key": "ak_test123", "timestamp": "1730619000", "nonce": "test123", "signature": "abc123def456" } ``` **成功响应** ```json { "code": "OK", "msg": "ok", "data": { "order_no": "ORD202605030002" }, "ok": true } ``` **业务规则** - 当前使用余额支付。 - 余额不足、套餐不可用、设备状态不满足时会返回失败。 - `strategy=1` 表示本月生效,`strategy=2` 表示次月生效。 --- ## 13. 设备操作指令 统一执行设备相关指令。 **请求信息** | 项 | 值 | | --- | --- | | 方法 | `POST` | | 路径 | `/api/v1/device/command` | | 参数格式 | JSON 或 Form | **基础业务参数** | 参数名 | 类型 | 必需 | 描述 | 示例 | | --- | --- | --- | --- | --- | | `device_no` | string | 是 | 设备编号 | `DEVICE123456789` | | `command` | string | 是 | 指令名称 | `restart` | **command 明细** | command | 描述 | 额外参数 | | --- | --- | --- | | `restart` | 设备启用/复机 | 无 | | `shutdown` | 设备禁用/停机 | 无 | | `restart_device` | 重启设备 | 无 | | `factory_reset` | 恢复出厂设置 | 无 | | `switch_network` | 切换设备在用卡槽 | `slot_code` 必填 | | `set_wifi_visible` | 设置 WiFi 是否隐藏 | `hidden` 必填,bool,`true`=隐藏,`false`=显示 | | `update_wifi` | 修改 WiFi 名称和密码 | `wifi_name`、`wifi_password` 必填 | **请求示例:设备复机** ```json { "device_no": "DEVICE123456789", "command": "restart", "access_key": "ak_test123", "timestamp": "1730619000", "nonce": "test123", "signature": "abc123def456" } ``` **请求示例:切网** ```json { "device_no": "DEVICE123456789", "command": "switch_network", "slot_code": "1", "access_key": "ak_test123", "timestamp": "1730619000", "nonce": "test123", "signature": "abc123def456" } ``` **请求示例:修改 WiFi** ```json { "device_no": "DEVICE123456789", "command": "update_wifi", "wifi_name": "TCZK-5G", "wifi_password": "12345678", "access_key": "ak_test123", "timestamp": "1730619000", "nonce": "test123", "signature": "abc123def456" } ``` **成功响应** ```json { "code": "OK", "msg": "ok", "data": true, "ok": true } ``` **业务规则** - `restart`、`shutdown` 需要 API 账号具有停复机权限。 - `switch_network` 的 `slot_code` 必须存在于设备所属渠道的卡槽配置中。 - `set_wifi_visible` 必须传 `hidden`。 - `update_wifi` 必须同时传 `wifi_name` 和 `wifi_password`。