chore: 初始开源发布

This commit is contained in:
MiFaZhan
2026-10-22 15:16:43 +08:00
commit 92f239fcc4
114 changed files with 8018 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
node_modules
.vitepress/cache
.vitepress/dist
.vitepress/.temp
dist
*.zip
*.tar
*.war
*.log
.DS_Store
.playwright-mcp/
.kilo/
.git/
.gitignore
Dockerfile
README.md
npm-debug.log*
+16
View File
@@ -0,0 +1,16 @@
node_modules
.vitepress/cache
.vitepress/dist
.vitepress/.temp
dist
*.zip
*.tar
*.war
*.log
.DS_Store
.playwright-mcp/
.kilo/
.playwright-cli/
# 开源版附加排除
.apitest-output/
+1
View File
@@ -0,0 +1 @@
registry=https://registry.npmmirror.com/
+122
View File
@@ -0,0 +1,122 @@
import { defineConfig } from 'vitepress'
const webManualItems = [
{ text: '快速开始', link: '/manual/web/' },
{ text: '首页与通用操作', link: '/manual/web/home' },
{ text: '卡信息', link: '/manual/web/card-info' },
{ text: '智能诊断', link: '/manual/web/intelligent-diagnosis' },
{ text: '业务受理与达量断网', link: '/manual/web/business-operations' },
{ text: '企业、用户与角色', link: '/manual/web/enterprise-management' },
{ text: '工单管理', link: '/manual/web/work-orders' },
{ text: 'API 凭证与执行日志', link: '/manual/web/api-and-logs' },
{ text: '常见问题', link: '/manual/web/faq' },
]
const miniProgramManualItems = [
{ text: '快速开始', link: '/manual/mini-program/' },
{ text: '首页公开查卡', link: '/manual/mini-program/home' },
{ text: '公开卡片详情', link: '/manual/mini-program/devices' },
{ text: '卡片排查', link: '/manual/mini-program/diagnosis' },
{ text: '常见问题', link: '/manual/mini-program/faq' },
]
function manualSidebar(_active: 'web' | 'mini' | 'both' = 'both') {
return [
{
text: 'Web端',
collapsed: false,
items: webManualItems,
},
{
text: '小程序端',
collapsed: false,
items: miniProgramManualItems,
},
]
}
export default defineConfig({
srcDir: './docs',
base: '/docs/',
title: 'iotLCM',
description: 'iotLCM documentation center',
lang: 'zh-CN',
cleanUrls: true,
lastUpdated: false,
head: [
['link', { rel: 'icon', type: 'image/png', href: '/docs/favicon.png' }]
],
vite: {
plugins: [
{
name: 'serve-root-favicon-in-dev',
configureServer(server) {
server.middlewares.use('/favicon.ico', (_request, response) => {
response.writeHead(302, { Location: '/docs/favicon.png' })
response.end()
})
}
}
]
},
themeConfig: {
logo: undefined,
nav: [
{ text: '文档首页', link: '/' },
{ text: '使用手册', link: '/manual/' },
{ text: 'OpenAPI', link: '/openapi/' },
{ text: '共享 Token 接口', link: '/openapi/operator/shared-token/' }
],
sidebar: {
'/manual/': manualSidebar(),
'/manual/web/': manualSidebar('web'),
'/manual/mini-program/': manualSidebar('mini'),
'/openapi/operator/': [
{
text: '共享 Token 接口',
collapsed: false,
items: [
{ text: '概览', link: '/openapi/operator/' },
{ text: '共享 Token 接口', link: '/openapi/operator/shared-token/' },
{ text: '白名单转发', link: '/openapi/operator/mobile-v5/' },
]
},
],
'/openapi/': [
{
text: 'V3 接口',
collapsed: false,
items: [
{ text: '概览与鉴权', link: '/openapi/v3/' },
{ text: '获取调用凭证', link: '/openapi/v3/token' },
{ text: '查询类', link: '/openapi/v3/query' },
{ text: '业务类', link: '/openapi/v3/common' },
]
},
{
text: '旧版兼容接口',
collapsed: false,
items: [
{ text: '概览与鉴权', link: '/openapi/legacy/' },
{ text: '查询类', link: '/openapi/legacy/query' },
]
},
]
},
outline: {
level: [2, 3],
label: '本页目录'
},
docFooter: {
prev: '上一页',
next: '下一页'
},
search: {
provider: 'local'
},
footer: {
message: 'iotLCM 文档中心',
copyright: ''
}
}
})
+198
View File
@@ -0,0 +1,198 @@
/* 截图点击放大(medium-zoom)—— 全站生效,范围由 .vitepress/theme/index.ts 的 ZOOM_SELECTOR 定义 */
/* 叠加层必须盖住导航和侧边栏:默认主题 --vp-z-index-nav 为 30、
--vp-z-index-sidebar 为 60,所以取 100。 */
.medium-zoom-overlay {
z-index: 100;
}
.medium-zoom-image--opened {
z-index: 101;
}
/* JS 尚未挂载 medium-zoom 时也提前给出「可点击」的鼠标提示 */
.vp-doc img:not(a img):not(.no-zoom) {
cursor: zoom-in;
}
/* 单张图片保持原始尺寸,并在正文区域水平居中。 */
.vp-doc img {
display: block;
margin: 24px auto;
}
/* 单行只有一张图片时缩放到内容区域的 40%。 */
.vp-doc p > img:only-child,
.vp-doc li > img:only-child {
width: 40%;
max-width: 40%;
height: auto;
}
/* Web 端手册截图恢复为内容区域全宽展示。 */
.vp-doc img[src*="/images/manual/"]:not([src*="mini-program"]) {
width: 100%;
max-width: 100%;
height: auto;
}
/* 同一行包含两张图片时,整行缩放到内容区域的 40%。 */
.vp-doc p:has(> img:nth-child(2):last-child) {
display: flex;
width: 80%;
max-width: 80%;
height: auto;
line-height: 0;
margin: 32px auto;
align-items: center;
justify-content: center;
gap: 8px;
}
.vp-doc p:has(> img:nth-child(2):last-child) > img {
width: calc(50% - 4px);
max-width: calc(50% - 4px);
height: auto;
margin: 0;
}
/* Markdown 内嵌的双图网格统一缩放到内容区域的 80%。 */
.vp-doc div[style*="repeat(2"] {
width: 80% !important;
max-width: 80% !important;
margin: 32px auto !important;
}
.vp-doc div[style*="repeat(2"] img {
width: 100% !important;
max-width: 100% !important;
height: auto;
margin: 0 !important;
}
.vp-doc div[style*="repeat(3"] img {
margin: 0 !important;
}
.vp-doc div[style*="repeat(2"] figcaption,
.vp-doc div[style*="repeat(3"] figcaption {
margin-top: 6px;
color: var(--vp-c-brand-1);
font-size: 16px;
font-weight: 600;
line-height: 1.4;
}
.vp-doc[class*="_docs_openapi_"] table {
display: table;
width: 100%;
max-width: 100%;
table-layout: auto;
}
.openapi-page .custom-block.warning,
.openapi-page .custom-block.danger {
background-color: var(--vp-code-block-bg);
}
.openapi-page .custom-block.warning code,
.openapi-page .custom-block.danger code {
background-color: var(--vp-code-bg);
}
@media (max-width: 767px) {
.vp-doc[class*="_docs_openapi_"] table {
display: block;
overflow-x: auto;
}
}
.manual-entry-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
margin: 28px 0 36px;
}
.manual-entry-card {
display: flex;
min-height: 190px;
padding: 24px;
flex-direction: column;
border: 1px solid var(--vp-c-divider);
border-radius: 10px;
background: var(--vp-c-bg-soft);
color: inherit;
text-decoration: none;
transition: border-color 0.2s, box-shadow 0.2s, transform 0.2s;
}
.manual-entry-card:hover {
border-color: var(--vp-c-brand-1);
box-shadow: 0 8px 24px rgb(60 90 180 / 12%);
transform: translateY(-2px);
}
.manual-entry-title {
color: var(--vp-c-brand-1);
font-size: 22px;
font-weight: 700;
}
.manual-entry-desc {
margin-top: 12px;
color: var(--vp-c-text-2);
font-size: 14px;
line-height: 1.7;
}
.manual-entry-link {
margin-top: auto;
padding-top: 18px;
color: var(--vp-c-brand-1);
font-size: 14px;
font-weight: 600;
}
.mini-program-entry {
display: flex;
width: min(100%, 520px);
margin: 28px auto 12px;
flex-direction: column;
align-items: center;
text-align: center;
}
.vp-doc .mini-program-entry + h2 {
margin-top: 12px;
}
.mini-program-entry__qr {
margin: 0;
}
.mini-program-entry__qr img {
width: 196px;
max-width: 58vw;
margin: 0 auto;
}
.mini-program-entry__qr figcaption {
margin-top: 12px;
color: var(--vp-c-brand-1);
font-size: 15px;
font-weight: 600;
}
.mini-program-entry__hint {
margin: 14px 0 0;
color: var(--vp-c-text-2);
font-size: 14px;
line-height: 1.7;
}
@media (max-width: 640px) {
.manual-entry-grid {
grid-template-columns: 1fr;
}
}
+78
View File
@@ -0,0 +1,78 @@
import DefaultTheme from 'vitepress/theme'
import mediumZoom from 'medium-zoom'
import { onContentUpdated } from 'vitepress'
import { onMounted } from 'vue'
import type { Theme } from 'vitepress'
import './custom.css'
/**
* 参与「点击放大」的图片范围。
*
* `.vp-doc` 是 VitePress 默认主题给正文容器加的类名,使用手册 9 页与接口文档
* 全部页面共用这一套布局,所以在这里定义一次即对全站生效。
*
* 排除项:
* a img 图片本身是链接(如带外链的截图),点击应跳转而不是放大
* .no-zoom 需要单独关闭放大的图片,示例:
* `<img src="/images/manual/xx.png" class="no-zoom" alt="xx">`
*/
const ZOOM_SELECTOR = '.vp-doc img:not(a img):not(.no-zoom)'
/**
* 全站只保留一个 medium-zoom 实例,但【必须惰性创建】。
*
* 两个坑叠在一起,才得到这个写法:
*
* 1. 不能在模块顶层创建实例。medium-zoom 1.1.0 的工厂函数第一件事就是读
* `window.Promise`(dist/medium-zoom.min.js 里即 `var Promise = window.Promise || ...`),
* 而主题模块在 `vitepress build` 时会被 Node 端 SSR 打包并执行 —— 没有 window,
* 直接 `ReferenceError: window is not defined` 构建失败。
* 所以实例只能在浏览器生命周期回调里创建。
*
* 2. 也不能每次路由切换都 `mediumZoom(...)` 新建。每个实例都会在 document 上注册
* click / keyup / scroll、在 window 上注册 resize 监听器,且没有卸载入口
* (见 dist/medium-zoom.esm.js:576-581)。翻 N 个页面就会留下 N 组永不释放的
* 全局监听器。正确做法是复用实例,路由切换时只做 attach —— attach 内部会跳过
* 已挂载的图片(dist/medium-zoom.esm.js:199-204),因此重复调用是幂等的。
*/
let zoom: ReturnType<typeof mediumZoom> | null = null
const attachZoom = () => {
if (typeof window === 'undefined') return
if (!zoom) {
zoom = mediumZoom({
background: 'var(--vp-c-bg)',
margin: 24,
})
}
zoom.attach(ZOOM_SELECTOR)
}
const closeZoomOnClick = (event: MouseEvent) => {
const target = event.target as Element | null
if (!zoom || !target) return
if (target.closest('.medium-zoom-image--opened, .medium-zoom-overlay')) {
void zoom.close()
}
}
const theme: Theme = {
extends: DefaultTheme,
setup() {
// onContentUpdated 由 VitePress 在「新页面内容挂载完成后」触发,覆盖首次进入
// 与 SPA 客户端路由切换。它挂在路由组件的 onVnodeMounted 上
// (见 vitepress/dist/client/app/components/Content.js:13-20),
// 比 watch(route.path) + nextTick 更可靠 —— 后者可能在异步页面组件挂载前就执行,
// 导致某些页面图片没挂上监听、点击放大静默失效。
onContentUpdated(attachZoom)
// 兜底:主题 setup 时内容已就绪(不经过 onVnodeMounted 的极端情况)也能挂上
onMounted(attachZoom)
if (typeof document !== 'undefined') {
document.addEventListener('click', closeZoomOnClick, true)
}
},
}
export default theme
+17
View File
@@ -0,0 +1,17 @@
FROM node:22-alpine AS builder
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --no-cache git
WORKDIR /app
COPY package*.json .npmrc ./
RUN npm ci
COPY . .
RUN npm run docs:build
FROM nginx:1.27-alpine
COPY --from=builder /app/.vitepress/dist /usr/share/nginx/html
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
+201
View File
@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+80
View File
@@ -0,0 +1,80 @@
# iotlcm-docs
iotLCM 物联网卡全生命周期管理平台的**使用手册与 OpenAPI 合同**。
- **使用手册**:Web 管理端(企业客户视角)与小程序端的操作说明,含截图
- **OpenAPI 合同**:V3 接口、旧版兼容接口、运营商能力代理(白名单转发 / 共享 Token)的鉴权方式、请求参数与响应结构
## 技术栈
VitePress 1.6 + Vue 3,产物为纯静态站点。
## 目录结构
```text
iotlcm-docs/
├── docs/ # 文档源(VitePress srcDir)
│ ├── index.md # 文档首页
│ ├── manual/ # 使用手册
│ │ ├── web/ # Web 管理端
│ │ └── mini-program/ # 小程序端
│ ├── openapi/ # OpenAPI 合同
│ │ ├── v3/ # V3 接口
│ │ ├── legacy/ # 旧版兼容接口
│ │ └── operator/ # 运营商能力代理
│ └── public/ # 静态资源(favicon、截图)
├── .vitepress/ # VitePress 配置与主题定制
├── docker/ # nginx 配置
├── Dockerfile
└── docker-compose.yml
```
## 本地开发
```bash
npm ci
npm run dev # http://127.0.0.1:5173/
```
构建与预览:
```bash
npm run build # 产物在 .vitepress/dist
npm run preview
```
站点部署在子路径 `/docs/`(见 `.vitepress/config.mts` 的 `base`)。本地开发时根路径会自动重定向 favicon。
## 容器化部署
```bash
docker build -t iotlcm-docs .
docker run -d -p 8080:80 iotlcm-docs
```
多阶段构建:Node 阶段执行 `vitepress build`,最终镜像只含 nginx 与静态产物。
`docker-compose.yml` 里的镜像名需替换成你自己的镜像仓库地址;对外署时请用不可变标签(commit sha)而不是 `latest`。
## 文档里的占位符
文档中的服务地址、凭据等均为占位示例:
| 占位 | 含义 |
| --- | --- |
| `iotlcm.example.com` | Web 管理端地址 |
| `api.iotlcm.example.com` | OpenAPI 服务地址 |
| `YOUR_APP_ID` / `YOUR_APP_SECRET` | 平台分配的应用凭据 |
| `YOUR_ACCESS_TOKEN` / `YOUR_TRANSID` | 调用方凭据与流水号 |
| `141****5152` | 示例手机号 |
替换成你自己的环境即可。
## 相关项目
- [iotlcm-openapi](https://git.5iot.com/iotlcm-public/iotlcm-openapi) —— OpenAPI 服务实现
- [iotlcm-admin-svr](https://git.5iot.com/iotlcm-public/iotlcm-admin-svr) —— Web 管理端后端
## License
[Apache License 2.0](./LICENSE)
+12
View File
@@ -0,0 +1,12 @@
services:
docs:
image: your-registry/iotlcm/iotlcm-docs:latest
container_name: iotlcm-docs
restart: unless-stopped
networks:
- iotlcm-network
networks:
iotlcm-network:
external: true
name: iotlcm-network
+11
View File
@@ -0,0 +1,11 @@
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri.html $uri/ =404;
}
}
+26
View File
@@ -0,0 +1,26 @@
---
layout: home
hero:
name: iotLCM
text: 文档中心
tagline: iotLCM 平台文档与接口规范。
actions:
- theme: brand
text: 使用手册
link: /manual/
- theme: alt
text: OpenAPI 接口文档
link: /openapi/
- theme: alt
text: 共享 Token 接口文档
link: /openapi/operator/
features:
- title: 使用手册
details: 按使用端提供 Web 管理平台与小程序端手册,覆盖查卡、诊断、业务管理和账号服务。
- title: OpenAPI 接口文档
details: 客户开放接口的鉴权方式、请求参数、响应结构、调用示例与兼容接口说明。
- title: 共享 Token 接口文档
details: 共享 Token 获取与白名单转发说明。
---
+23
View File
@@ -0,0 +1,23 @@
---
layout: home
hero:
name: iotLCM 使用手册
text: 操作指南
tagline: 按使用端查看卡片查询、业务管理与移动服务说明。
actions:
- theme: brand
text: Web端手册
link: /manual/web/
- theme: alt
text: 小程序端手册
link: /manual/mini-program/
features:
- title: 版本选型指引
details: 使用浏览器登录企业管理后台,请阅读 Web 端手册;使用 IOTLCM 物联卡用户服务小程序,请阅读小程序端手册。不同端的功能入口、权限和页面结构有所区别。
- title: Web端
details: 面向企业管理员和业务人员,覆盖首页、卡信息、智能诊断、业务受理、企业管理、工单、API 凭证与执行日志。
- title: 小程序端
details: 对应 iotlcm-app v1.0.1,覆盖首页公开查卡、扫码与拍照识别、卡片详情、卡片排查和账号密码登录;办理、绑定、微信登录及注册等功能暂未开放。
---
+39
View File
@@ -0,0 +1,39 @@
# 卡片详情
从首页查询结果点击“详情”后进入卡片详情页。首页会以公开来源打开详情,因此未登录或公开来源都会使用受限展示模式。
## 公开详情展示内容
公开模式包含两组信息:
- 基础信息:卡号、卡状态、在线状态;
- 流量信息:已用流量。
![卡片详情中的基础信息和流量信息](/images/manual/mini-program/card-details-traffic.png)
卡号可能已经脱敏,页面显示什么就以什么为准。点击或长按卡号行可以复制当前显示值。
公开模式不会展示完整 IMSI、IMEI、备注、总流量、剩余流量、会话信息、APN、IPv4、IPv6 和服务状态,也不会提供重启、开通数据、停用数据等操作按钮。
## 登录后详情
登录并通过权限校验后,设备列表和卡片详情可以展示更完整的账号范围数据,例如 MSISDN、ICCID、IMSI、设备 IMEI、套餐流量和同步时间。字段是否出现取决于接口返回值和账号权限。
<div style="display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; align-items: start;">
<figure style="margin: 0;">
<img src="/images/manual/mini-program/devices-list-account-data-v2.jpg" alt="登录后的设备列表和账号范围数据" style="display: block; width: 100%; height: auto;">
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/devices-search-account-data-v2.jpg" alt="全部设备中的账号范围数据" style="display: block; width: 100%; height: auto;">
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/card-details-account-data-v2.jpg" alt="登录后的卡片详情账号范围数据" style="display: block; width: 100%; height: auto;">
</figure>
</div>
## 查不到详情时
- 确认查询号码没有空格或遗漏字符;
- 从首页重新查询后再点击“详情”;
- 若页面提示当前账号没有权限,请使用公开查询,或联系账号管理员确认数据范围。
+61
View File
@@ -0,0 +1,61 @@
# 卡片排查
卡片排查用于根据卡片状态、在线状态、流量和设备信息整理处理方向。
## 进入排查
可以从以下位置进入:
1. 首页点击“卡片排查”,手动输入卡号;
2. 首页查询成功后点击“卡片排查”,系统会带入当前查询值;
![首页查询结果中的卡片排查入口](/images/manual/mini-program/diagnosis-entry-from-query-v2.png)
3. 直接打开卡片排查页,在输入框填写 `ICCID`、`MSISDN` 或 `IMSI`。
<div style="display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-items: start;">
<figure style="margin: 0;">
<img src="/images/manual/mini-program/diagnosis-entry-from-home.png" alt="从首页常用入口进入卡片排查" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">首页卡片排查入口</figcaption>
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/diagnosis-manual-input.jpg" alt="卡片排查页手动输入卡号" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">输入卡号开始排查</figcaption>
</figure>
</div>
点击“开始排查”提交。排查过程中不要连续重复点击。
## 结果摘要
普通用户或未登录用户通常可以看到:
- 卡片状态;
- 在线状态;
- 已用流量或流量状态;
管理员账号可能看到更多卡片、数据服务、停机冻结和限制策略信息。页面会按实际接口返回值隐藏没有数据的字段。
## 流量使用分析
当前页面提供“近1个月、近3个月、近6个月”三个周期。**`v1.0.1` 默认只对顶层管理员显示流量趋势模块;其他账号即使登录,也不保证看到该模块。**
有数据时会显示周期总用量、日均或月均用量、单期峰值和趋势图;没有数据时显示“暂无历史流量数据”。趋势只用于辅助排查,不等同于实时计费结果。
## 排查结果的处理方向
| 结果 | 建议核对 |
| --- | --- |
| 在线 | 继续核对设备业务表现和应用侧请求 |
| 离线 | 检查设备供电、开机状态、信号、天线和 APN |
| 未查询到会话 | 稍后重试,并确认设备是否产生数据会话;不等同于卡已销户 |
| 流量不足或用量异常 | 核对套餐流量、设备上报和业务使用情况 |
| 机卡分离 | 核对卡片与设备的使用关系 |
| 区域受限 | 核对业务限制区域、订购状态和触发状态 |
| 停机或冻结 | 根据页面提示联系业务管理员确认 |
## 当前版本限制
排查页的“重启卡”“开通数据服务”“停用数据服务”按钮只有在登录且账号拥有对应权限时才会出现。业务办理路由、套餐、预警、订单和工单在 `v1.0.1` 中暂未开放。
排查接口或流量接口提示请求过于频繁时,请等待一段时间后再试,不要连续提交。
+45
View File
@@ -0,0 +1,45 @@
# 常见问题
## v1.0.1 有哪些可用功能?
无需登录即可在首页手动输入、扫码或拍照识别卡号,并查看公开详情和卡片排查结果。已有账号可以使用账号密码登录,查看权限范围内的设备数据。
## 为什么底部没有“办理”Tab?
`v1.0.1` 关闭了办理 Tab。套餐续费、加油包、套餐变更、停复机、预警、订单、工单和客户管理等路由也暂未开放,直接访问会提示当前版本暂未开放此功能。
## 为什么设备页看不到卡片?
设备页读取登录账号的卡片范围。未登录时请回到首页使用公开查卡;登录后仍为空时,请确认账号已分配卡片或具备相应权限。
## 支持哪些查卡方式?
首页支持输入 `ICCID`、`MSISDN`、`IMSI` 或 `IMEI`,也支持扫码读取内容和从相机或相册拍照识别 ICCID。
## 拍照识别失败怎么办?
请拍摄单张、平整、完整、无反光的卡片,并确保 ICCID 清晰。识别超时或频繁请求时等待后重试;也可以改用扫码或手动输入。
## 公开详情为什么字段少?
公开模式只展示卡号、卡状态、在线状态和已用流量。完整 IMSI、IMEI、会话、APN、IP、服务状态等字段属于受限数据。
## 为什么不能绑定卡片或执行重启?
卡片绑定和“更多操作”在 `v1.0.1` 中统一关闭。即使登录,当前版本也不会提供绑定、套餐办理、停复机、数据服务变更和预警配置入口。
## 为什么看不到流量趋势?
流量趋势模块当前只对顶层管理员开放,且接口必须返回有效历史数据。其他账号或没有历史数据时不会显示趋势图。
## 为什么排查显示离线或未查询到会话?
先检查设备供电、开机状态、信号、天线和 APN,再稍后重新排查。“未查询到会话”只表示当前没有查到数据会话,不等同于卡片已销户。
## 账号密码登录有什么限制?
当前版本只开放已有账号的账号密码登录;微信登录和注册账号未开放。忘记密码页面会提示短信服务接入后开放,请联系管理员或客服处理账号问题。
## 排查结果是否是最终结论?
不是。排查结果仅用于辅助判断,最终以运营商和业务系统状态为准。请勿在查询、排查和反馈内容中提交身份证号、银行卡号或其他无关敏感信息。
+67
View File
@@ -0,0 +1,67 @@
# 首页查卡
首页是当前版本的主要使用入口。查询不要求登录,支持手动输入、微信小程序扫码和图片识别三种录入方式。
## 登录入口
首页和登录页都保留“未登录也可查卡”入口。需要查看账号名下设备时,再通过账号密码登录;微信登录和注册账号暂未开放。
## 手动查询
1. 在“卡片查询”输入框输入完整的 `ICCID`、`MSISDN`、`IMSI` 或 `IMEI`。
2. 点击“查询”,等待查询完成。
![点击查询并等待查询完成](/images/manual/mini-program/query-complete.png)
3. 查询成功后,结果区域显示卡号、使用流量和在线状态。
4. 点击“详情”查看公开卡片详情,或点击“卡片排查”查看状态摘要。
<div style="display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; align-items: start;">
<figure style="margin: 0;">
<img src="/images/manual/mini-program/query-actions-v2.jpg" alt="查询结果中的详情和卡片排查入口" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">详情与卡片排查入口</figcaption>
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/card-details-v2.jpg" alt="卡片详情页展示的公开字段" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">卡片详情</figcaption>
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/card-diagnosis-v2.jpg" alt="卡片排查页展示的状态摘要" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">卡片排查</figcaption>
</figure>
</div>
输入内容请去除前后空格并核对末位字符。查询失败时先检查输入值,再重新提交。
## 扫码查询
1. 点击“扫码”。
![首页扫码入口](/images/manual/mini-program/scan-entry-highlight.png)
2. 将卡片条码或二维码放入扫描区域。
3. 扫描成功后,识别出的内容会自动填入输入框并立即发起查询。
光线不足、反光或距离不合适时可能扫描失败;此时请调整卡片位置,或改用手动输入。
## 拍照识别 ICCID
1. 点击“拍照”。
![首页拍照入口](/images/manual/mini-program/photo-entry.png)
2. 从相机或相册选择一张卡片图片。
3. 确保图片中只有一张卡片,并且 ICCID 完整、清晰、无反光。
4. 识别成功后,系统会将 ICCID 填入输入框并继续查询。
常见提示及处理方式:
| 提示 | 处理方式 |
| --- | --- |
| 图片中存在多个可能的 ICCID | 重新拍摄单张卡片 |
| 未能识别清晰的 ICCID | 保持卡片平整、对焦清楚后重拍 |
| 图片识别超时或请求过于频繁 | 等待后重试,或使用扫码、手动输入 |
## 首页结果
首页结果中的“剩余流量”按“剩余 / 套餐总量”展示;在线状态可能为在线、离线、未知或未查询到会话。结果区域的查询和排查说明均提示:内容仅供参考,以业务系统结果为准。
+99
View File
@@ -0,0 +1,99 @@
---
title: 小程序端使用手册
---
# 小程序端使用手册
本文介绍 iotLCM 平台当前已开放的页面及操作功能,具体可用内容以账号实际权限为准。当前版本以**公开查卡和状态排查**为主,业务办理入口暂未开放。
<div class="mini-program-entry">
<figure class="mini-program-entry__qr">
<img src="/images/manual/mini-program/mini-program-code.jpg" alt="扫码进入 iotLCM 小程序">
<figcaption>扫码进入 iotLCM 小程序</figcaption>
</figure>
<p class="mini-program-entry__hint">使用微信扫一扫即可打开小程序,体验公开查卡和卡片状态排查功能。</p>
</div>
## 版本范围
| 页面或功能 | 当前状态 | 说明 |
| --- | --- | --- |
| 首页 | 已开放 | 手动输入、扫码、拍照识别并查询卡片 |
| 卡片详情 | 已开放 | 公开查询只展示卡号、卡状态、在线状态和已用流量 |
| 卡片排查 | 已开放 | 输入卡号查看状态摘要;流量趋势仅对管理员账号显示 |
| 账号密码登录 | 已开放 | 企业、代理商和终端用户使用已有账号登录 |
| 设备列表 | 登录后使用 | 显示当前账号权限范围内的卡片;未登录不要用此页进行公开查卡 |
| 办理、订单、工单、预警、开停数据等 | 暂未开放 | 入口或路由会提示“当前版本暂未开放此功能” |
| 微信登录、注册、绑定卡片、卡片更多操作 | 暂未开放 | 本版本不提供这些入口 |
## 推荐流程
1. 打开小程序首页,在“卡片查询”中输入 ICCID、MSISDN、IMSI 或 IMEI。
![小程序首页卡片查询输入框](/images/manual/mini-program/home-card-query.png)
2. 也可以点击“扫码”读取卡片条码,或点击“拍照”识别卡片上的 ICCID。
![首页扫码和拍照入口](/images/manual/mini-program-scan-photo-entry.png)
3. 点击“查询”,查看卡号、卡状态、使用流量和在线状态。
![点击查询查看卡号、卡状态、使用流量和在线状态](/images/manual/mini-program/query-result.png)
4. 需要查看公开字段时点击“详情”;需要判断异常原因时点击“卡片排查”。
<div style="display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; align-items: start;">
<figure style="margin: 0;">
<img src="/images/manual/mini-program/query-actions-v2.jpg" alt="首页查询结果中的详情和卡片排查入口" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">首页入口</figcaption>
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/card-details-v2.jpg" alt="卡片详情页展示的公开字段" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">卡片详情</figcaption>
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/card-diagnosis-v2.jpg" alt="卡片排查页展示的状态摘要" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">卡片排查</figcaption>
</figure>
</div>
5. 如果需要停复机、开通数据服务、套餐办理、预警或工单,请等待后续版本开放。
## 账号密码登录
1. 在需要账号数据的页面进入登录页,或在首页点击登录入口。
<div style="display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; align-items: start;">
<figure style="margin: 0;">
<img src="/images/manual/mini-program/login-entry-home.jpg" alt="从首页底部的我的入口进入登录" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">首页“我的”入口</figcaption>
</figure>
<figure style="margin: 0;">
<img src="/images/manual/mini-program/login-page-entry.jpg" alt="登录页中的账号密码登录入口" style="display: block; width: 100%; height: auto;">
<figcaption style="text-align: center;">账号密码登录</figcaption>
</figure>
</div>
2. 输入已有账号和密码,完成页面要求的安全验证后点击“登录”。
![账号密码登录表单](/images/manual/mini-program/account-password-login.png)
3. 如果同一账号匹配多个登录身份,按页面提示选择本次要进入的账号。
4. 登录成功后返回原页面;设备页会按账号权限加载卡片数据。
![登录后设备页按账号权限加载卡片数据](/images/manual/mini-program/devices-page.png)
当前版本不开放注册和微信登录。“忘记密码”页面会提示短信服务接入后开放,无法登录时请联系账号管理员或客服。
## 使用边界
- 公开查询和排查结果仅供辅助判断,最终以运营商和业务系统状态为准。
- 未登录查询不会展示完整 IMSI、IMEI、APN、IP、套餐内部信息等受限字段。
- 请勿在查询、排查或反馈内容中提交身份证号、银行卡号等无关敏感信息;密码只应填写在登录表单中。
## 阅读指引
- [首页查卡、扫码与拍照](./home)
- [卡片详情](./devices)
- [卡片排查](./diagnosis)
- [常见问题](./faq)
+53
View File
@@ -0,0 +1,53 @@
# API 凭证与执行日志
## 我的 API 凭证
**入口:** 左侧菜单 → **我的 API 凭证**。
![我的 API 凭证页面](/images/manual/api-credentials-entry.png)
页面显示本企业的企业 ID、企业名称、`appKey`(API 账号标识)和 `appSecret`(API 密钥),并提供复制按钮。接口鉴权和请求格式请配合 [OpenAPI 接口文档](/openapi/) 使用。
::: warning appKey ≠ appId
- **`appKey`** 和 **`appSecret`** 仅用于调用 `/openapi/v3/query/token` 换取 token
- **`appId`**(客户组织编码,如 `CUS-202601-0001`)由 token 接口返回,调用其他接口时在请求体中传入
- 不要把 `appKey` 当作 `appId` 使用,两者是不同的概念
:::
### 安全要求
- `appSecret` 等同接口密码,只能提供给获准的开发和运维人员。
- 不要把凭证写入前端代码、公开仓库、工单正文、聊天截图或日志。
- 服务端应通过环境变量或密钥管理服务保存凭证。
- 不同环境不要共用同一份配置文件。
- 怀疑泄露时立即停止相关调用并联系平台支持更换凭证。
复制后粘贴到配置前,检查是否带入多余空格或换行。接口返回鉴权失败时,先核对企业对应的 appId 与 appSecret 是否配套,再检查签名、时间戳和请求地址。
## 执行日志(暂未开放)
**入口:** 左侧菜单 → **执行日志**。
批量续费、套餐变更、加油包、重启、停复机、划拨、达量断网等任务提交后,均应通过执行日志确认最终结果。
### 查询批次
可按关键字、批次编号、批次类型、异步处理状态和创建时间查询。列表显示:
- 批次编号和批次类型。
- 来源方式,如 Excel 或批量输入。
- 运行结果和异步状态。
- 总数量、开始时间和结束时间。
点击批次编号可查看逐卡明细,包括行号、ICCID、MSISDN、IMSI、明细状态和异常原因。点击“查看”可查看批次概要、失败原因、源文件、结果文件和处理时间。
### 处理失败任务
1. 用提交时记录的批次号查询。
2. 确认批次已结束,避免把“处理中”误判为失败。
3. 点击批次号查看失败卡及异常原因。
4. 下载结果文件,修正卡号、状态、套餐或模板数据。
5. 只重提失败且可修正的卡,不要整批重复提交。
6. 无法处理的上游错误通过工单反馈,并附批次号和失败原因。
常见失败原因包括卡号不属于当前企业、卡状态不允许办理、套餐不匹配、余额不足、模板字段错误、上游超时或重复业务仍在处理中。
+99
View File
@@ -0,0 +1,99 @@
# 业务受理与达量断网
## 业务受理入口
左侧菜单 → **通讯管理 → 业务受理**。
![业务受理入口](/images/manual/business-acceptance-entry.png)
页面按“套餐及数据”“生命周期”“预警中心”展示业务入口。每个入口都有独立按钮权限,未授权的入口不会显示。
可能出现的业务包括:
| 分类 | 业务 | 用途 |
| --- | --- | --- |
| 套餐及数据 | 续费套餐 | 延长当前套餐或购买可续费套餐 |
| 套餐及数据 | 变更套餐 | 将卡切换到其他可购套餐 |
| 套餐及数据 | 加油包订购 | 为单卡或流量池购买叠加包 |
| 套餐及数据 | 开停数据 | 开启或关闭数据通信服务 |
| 套餐及数据 | 达量断网 | 设置达到指定流量后断网 |
| 生命周期 | 重启 | 向运营商提交卡重启 |
| 生命周期 | 自主停机/自主复机 | 暂停或恢复卡服务 |
| 生命周期 | 转销户 | 将卡转为销户状态 |
| 生命周期 | 划拨 | 将卡划拨给目标下级企业 |
| 生命周期 | 退订 | 退订符合条件的套餐或业务 |
| 预警中心 | 流量预警配置 | 配置单卡流量阈值预警 |
| 预警中心 | 流量池预警配置 | 配置流量池阈值预警 |
## 通用办理方式(部分开放)
不同业务会提供以下一种或多种数据来源:
- **Excel:** 先下载页面提供的最新模板,按模板填写后上传 `.xls` 或 `.xlsx` 文件。不要修改表头或合并单元格。
- **批量输入:** 通常每行一个 ICCID;部分业务支持每行填写 `ICCID MSISDN IMSI`。
- **连续号段:** 填写 ICCID、MSISDN 或 IMSI 的起始值和结束值,适合连续卡段。
标准操作流程:
1. 选择业务入口和数据来源。
2. 上传文件或输入卡号,提交预处理。
3. 记录系统返回的批次号。
4. 核对有效数量、失败数量、目标套餐、购买时长、生效方式、金额和余额等信息。
5. 确认无误后提交正式任务。
6. 前往“执行日志”查询批次最终状态和失败原因。
::: warning 提交前确认
批量任务可能影响通信、套餐、费用或卡生命周期。提交前应抽查卡号、目标企业、套餐编码、阈值、生效方式和付款方式。不要重复提交仍在处理中的批次。
:::
## 续费、变更与加油包(暂未开放)
### 续费套餐
支持 Excel 或批量输入。预处理后选择可续费套餐、续费年限、续费日期和付款方式。余额支付时必须确认余额充足;线下支付时按页面要求完成线下确认。
### 变更套餐
支持 Excel、批量输入和连续号段。预处理后选择新套餐、购买时长、赠送时长和“立即生效/次月生效”。变更前重点确认生效方式,避免影响当前套餐剩余资源。
### 加油包订购
可选择“单卡加油包”或“流量池加油包”。单卡 Excel 需填写 ICCID 和加油包套餐编码;流量池 Excel 需填写流量池编码和套餐编码。预处理后核对数量、单价、总金额、付款账户和余额。
## 生命周期和数据服务(部分开放)
重启、自主停机、自主复机、开停数据、转销户和退订通常支持 Excel 或批量输入。生命周期任务提交后不会立即在列表全部完成,应通过批次号在执行日志中跟踪。
- 重启适合设备长时间不在线且卡状态正常的场景。
- 自主停机和关闭数据会中断通信,恢复前请确认业务窗口。
- 转销户通常不可逆或需要人工处理,提交前必须复核卡号。
- 划拨前确认目标企业,任务完成后卡的数据归属和可见范围会变化。
## 达量断网批量配置(部分开放)
在“业务受理”点击“达量断网”,可通过 Excel、批量输入或连续号段批量配置:
1. 选择开启或关闭。
2. 开启时填写阈值,单位为 MB,阈值必须大于 0,最多保留 3 位小数。
3. 填写卡号或上传模板后提交。
4. 记录批次号并在执行日志中检查结果。
关闭配置表示不再按该阈值触发断网,不等同于立即恢复所有因其他原因停机的卡。
## 达量断网页面(部分开放)
**入口:** 左侧菜单 → **通讯管理 → 达量断网**。
![达量断网入口](/images/manual/data-usage-cutoff-entry.png)
该页面用于查看和维护已有配置:
- 可按 MSISDN、ICCID、IMSI、IMEI 或配置状态查询。
- 列表显示通道、所属公司、当前套餐、配置状态和阈值。
- 有编辑权限时,可修改开启/关闭状态及阈值。
- 有删除权限时,可删除该卡的达量断网配置。
- 有导出权限时,可按当前条件导出配置。
批量新增或修改建议从“业务受理 → 达量断网”完成;单卡核对和调整可在本页面完成。
![业务受理中的达量断网批量输入](/images/manual/business-operations-batch-threshold.png)
+84
View File
@@ -0,0 +1,84 @@
# 卡信息
## 页面入口
左侧菜单 → **通讯管理 → 卡信息**。
该页面是日常查卡的主要入口,可查询卡的身份标识、运营商状态、套餐、流量、归属企业、通道和到期情况。
![日常查卡页面入口](/images/manual/card-info-main-entry.png)
## 查询卡片
常用查询条件如下:
| 条件 | 用法 |
| --- | --- |
| 卡号 | 输入 MSISDN、ICCID 或 IMSI 任一标识 |
| 卡状态 | 按运营商卡状态筛选 |
| IMEI | 按终端设备号查询 |
| 所属通道 | 按运营商或接入通道筛选,支持搜索 |
| 时间类型、时间范围 | 按所选业务时间区间筛选 |
| 查询条件、起始号段、结束号段 | 选择号段类型,并按起止号段范围筛选卡片 |
| 备注信息 | 按备注内容筛选 |
| 维度、维度状态、维度值 | 按指定业务维度进行组合筛选 |
| 排序值、排序类型 | 指定排序字段及升降序 |
查询不到卡时,先确认使用的是完整卡号,再清空状态、时间和通道等附加条件重试。
## 列表信息
| 字段 | 说明 |
| --- | --- |
| ICCID | SIM 卡芯片的唯一识别码,业务办理和故障定位最常用 |
| MSISDN | 运营商分配的移动号码,也常称卡号 |
| IMSI | SIM 卡在移动网络中的用户识别码 |
| 卡状态 | 运营商侧当前生命周期状态 |
| 类型 | “单卡”表示独立计量,“池卡”表示参与流量池共享 |
| 通道 | 卡接入的运营商或上游通道 |
| 所属公司 | 当前卡归属的企业 |
| 套餐 | 当前主套餐名称 |
| 总流量、已用流量、剩余流量 | 当前套餐流量,单位为 MB |
| 到期时间 | 当前套餐预计到期日期 |
| 出库时间 | 卡片分配出库日期 |
| 备注信息 | 企业维护的业务备注 |
列表中的流量不是实时会话流量。需要最新结果时,执行“同步用量”后再刷新。
## 查看卡详情
点击目标卡右侧“查看”。详情上方展示:MSISDN、ICCID、IMSI、IMEI、卡状态、网络类型、流量同步时间、套餐总流量、到期时间、出库时间、当前套餐、已用流量、剩余流量、所属企业、所属通道、达量断网配置状态、限额、备注。
![在卡信息列表点击“查看”打开卡详情](/images/manual/card-info-view-entry.png)
详情下方包含以下页签:
- **会话信息:** APN、IPv4、IPv6、接入方式、在线状态、会话建立时间、实时 IMEI、开关机状态等。点击“刷新”重新查询;“未查询到会话”通常表示设备当前未建立数据会话,并不等同于卡已销户。
- **归属信息:** 当前套餐编号、套餐名称、所属企业和所属通道(所属通道不予展示)。
- **主套餐:** 订单编号、套餐名称、套餐类型、订购状态、生效时间和到期时间。
- **叠加套餐:** 加油包名称、总流量、支付方式和交易时间。
- **变更历史:** 变更前后套餐、订购状态和办理时间。
![卡详情页签](/images/manual/card-detail-tabs.png)
## 常用操作
页面上的操作按钮以账号权限为准。
- **备注:** 编辑本企业对卡片的业务备注,便于按项目、设备或使用场景检索。
- **同步用量:** 向上游请求最新用量。同步成功后查看“流量同步时间”是否更新。
- **同步状态:** 向上游请求最新运营商卡状态。
- **导出:** 按当前筛选条件导出卡信息。
- **诊断:** 在卡详情点击“诊断”,系统会携带当前 ICCID 跳转到智能诊断并自动查询。
“批量操作”当前仍显示为待接入功能。
![卡信息列表更多操作菜单](/images/manual/card-info-more-actions.png)
## 查看数据异常时
1. 先核对卡号和所属企业。
2. 查看卡状态、套餐到期时间及流量同步时间。
3. 分别执行“同步状态”和“同步用量”。
4. 打开详情刷新会话信息。
5. 进入[智能诊断](./intelligent-diagnosis)做完整排查。
6. 仍有异常时创建工单,并提供 ICCID、异常时间和已完成的操作。
+102
View File
@@ -0,0 +1,102 @@
# 企业、用户与角色
## 企业信息
**入口:** 左侧菜单 → **企业管理 → 企业信息**。
![企业信息页面入口](/images/manual/enterprise-information-entry.png)
该页面用于维护当前企业资料,分为单位信息和实名认证信息。
单位信息通常包括联系电话、邮箱、统一社会信用代码、组织所在地和详细地址。实名认证信息包括单位全称、行业、法人姓名、法人身份证号、单位类型、成立时间、开户行名称和开户行账号。
单位信息如需修改请联系管理员。
## 角色管理
**入口:** 左侧菜单 → **企业管理 → 角色管理**。
![角色管理页面入口](/images/manual/role-management-entry.png)
角色用于把菜单和按钮权限批量授予用户。列表可按角色名称、权限字符和状态查询。
### 创建角色
1. 点击“新增”。
![创建角色时点击新增](/images/manual/role-create-add-button.png)
2. 填写角色名称和角色权限字符。
3. 设置角色状态。
4. 在“菜单权限”中勾选该角色需要使用的页面和操作。
5. 需要传递给直属下级企业时,按业务要求设置“下发给下一级”。
![设置下发给下一级](/images/manual/role-management-distribute-to-child.png)
6. 保存后回到“用户管理”,将角色分配给用户。
![在用户管理中分配角色](/images/manual/assign-role-to-user.png)
本级机构绑定的默认角色不能修改或删除。新增自定义角色时遵循最小权限原则,不要为普通查询人员授予企业删除、用户删除、角色修改或批量业务提交权限。
## 企业客户
**入口:** 左侧菜单 → **企业管理 → 企业客户**。
![企业客户页面入口](/images/manual/enterprise-customer-entry.jpg)
该页面面向获准管理下级企业的客户。可按企业名称和状态查询,列表显示企业名称、登录账号、负责人、联系电话、邮箱、组织所在地、详细地址、创建时间和状态。
根据按钮权限,可执行:
- **新增:** 创建直属企业客户之前,需在角色管理界面创建该企业客户同名角色,之后返回新增页面设置登录账号、初始密码、联系方式和企业地址等信息。
![角色管理中创建企业客户同名角色](/images/manual/enterprise-customer-role-match.png)
![新增企业客户页面](/images/manual/enterprise-customer-create-form.jpg)
- **修改:** 调整企业名称、登录账号、负责人。
![修改企业客户信息](/images/manual/enterprise-customer-edit.png)
- **重置密码:** 为该企业主账号设置新密码,密码长度为 5 至 20 位。
![企业客户重置密码](/images/manual/enterprise-customer-reset-password.png)
- **企业管理:** 分两步维护单位信息和实名认证信息。
![维护企业单位信息](/images/manual/enterprise-customer-manage.png)
- **删除:** 删除前确认该企业没有仍在使用的卡、用户和业务数据。删除属于高风险操作。
![企业客户删除确认](/images/manual/enterprise-customer-delete-confirm.png)
新增企业后,应及时通知对方修改初始密码,并按需要创建角色和用户。
## 用户管理
**入口:** 左侧菜单 → **企业管理 → 用户管理**。
![用户管理入口](/images/manual/user-management-entry.png)
可按用户名称、昵称、联系电话、状态和创建时间查询。列表显示用户名称、昵称、角色、联系电话、邮箱、状态和创建时间。
### 新增用户
1. 点击“新增”。
2. 填写用户名称、初始密码、昵称、联系电话、邮箱、性别和备注。
3. 设置账号状态。
4. 至少选择一个角色后保存。
初始密码长度为 5 至 20 位。建议使用更长且不重复的密码,并要求用户首次登录后修改。
![新增用户页面](/images/manual/user-create-form.png)
### 维护用户
- “修改”可调整资料、状态和角色。
- “重置密码”可设置新密码。
- “删除”会使用户失去登录和数据访问能力,操作前确认账号不再使用。
![维护用户信息](/images/manual/user-management-maintain-user.png)
## 建议的角色划分
| 角色 | 建议权限 |
| --- | --- |
| 查询人员 | 卡信息查看、智能诊断,只读查看执行日志 |
| 业务操作员 | 查询权限,以及已批准的业务受理按钮 |
| 工单人员 | 我的工单、沟通、工单记录 |
| 接口开发 | 我的 API 凭证,只读卡信息;凭证按需单独授权 |
| 企业管理员 | 用户、角色和企业资料管理;高风险权限严格控制 |
+58
View File
@@ -0,0 +1,58 @@
# 常见问题
## 登录后看不到某个菜单
平台按角色显示菜单。先联系本企业管理员检查用户是否绑定正确角色、角色是否正常以及菜单权限是否勾选。若整个企业都没有该功能,需要联系平台支持开通。
## 同事有按钮,我没有
页面权限和按钮权限分别控制。即使都能进入同一页面,新增、编辑、导出、同步、删除或业务提交按钮也可能不同。由企业管理员对比双方角色权限。
## 卡信息查询不到卡
1. 清空其他筛选条件。
2. 使用完整 MSISDN、ICCID 或 IMSI 查询。
3. 检查是否有前后空格或字符缺失。
4. 确认该卡已划拨到当前企业,且账号有相应数据范围。
5. 仍无结果时创建工单并提供卡号。
## 卡状态或流量没有更新
在“卡信息”中分别执行“同步状态”和“同步用量”,完成后刷新列表,并查看同步时间是否变化。运营商接口可能有延迟;短时间内不要反复同步。
## 智能诊断显示未查询到会话
表示当前没有查到数据会话,不一定是卡异常。检查设备供电、信号、APN 和天线,确认数据服务已开启后重启设备,再稍后诊断。
## 诊断提示运营商不支持
当前卡所属通道未提供该项实时查询能力。结合卡信息、同步时间、设备侧日志和其他诊断模块判断;需要运营商侧核实时提交工单。
## 批量业务提交后一直没有结果
记录批次号,进入“执行日志”查看异步状态。仍在处理中时请等待;已失败时查看批次明细和失败原因。不要在结果未明确前重复提交同一批卡。
## Excel 上传失败
- 使用页面当次下载的最新模板。
- 文件格式必须为 `.xls` 或 `.xlsx`,且不超过页面限制。
- 不修改表头、不合并单元格、不增加公式。
- 卡号列按文本格式保存,避免科学计数法或末位被修改。
- 根据失败提示修正后,仅重提失败数据。
## 达量断网开启后没有立即断网
确认阈值单位为 MB、配置任务已成功、卡用量已同步且确实达到阈值。运营商侧执行可能有延迟;同时检查卡是否受其他套餐或通道策略影响。
## 如何提交高质量工单
提供完整 ICCID、MSISDN、故障开始时间、影响数量、设备位置、复现步骤、诊断结果、执行日志批次号和必要截图。描述中避免使用“卡有问题”这类无法定位的表述,也不要发送密码或 API 凭证。
## 使用安全建议
- 为每位操作人员创建独立账号,不共享管理员账号。
- 查询人员、业务操作员和管理员使用不同角色。
- 定期停用离职或不再使用的账号。
- 高风险批量任务实行复核,保留批次号和结果文件。
- 导出的卡信息、企业资料和 API 凭证按敏感数据管理。
+52
View File
@@ -0,0 +1,52 @@
# 首页与通用操作
## 首页(暂未开放)
**入口:** 登录后默认进入“首页”;如已授权,也可点击左侧“首页”。
首页用于快速掌握企业卡业务概况,通常包括:
- SIM 卡总数、本月新增、本月数据用量、本月短信用量和 SIM 卡月活跃度。
- 生命周期分布、流量池、物联卡位置分布等图表。
- 欠费停机、主动停机、机卡分离停机、强制停机等业务预警。
- 流量用尽关停、限额管控关停、封顶关停和套餐余量提醒等流量预警。
- 卡信息、智能诊断等快捷入口。
首页数据用于概览和发现异常。处理单张卡时,应进入“卡信息”查看最新详情;预警统计与明细可能存在同步时间差。
## 列表页通用操作
### 查询与重置
1. 在查询区填写一个或多个条件。
2. 点击“查询”;部分页面修改条件后会自动查询。
3. 条件过多导致无结果时,点击“重置”后只保留卡号、批次号等关键条件重试。
卡号输入框通常支持 MSISDN、ICCID、IMSI。输入前后不要带空格;批量输入时一般每行一张卡。
![卡号查询](/images/manual/card-info-query-single.jpg)
![按号段批量查询](/images/manual/card-info-query-batch.jpg)
### 表格工具
列表右上角可能提供刷新、列设置、密度或全屏等工具。横向字段较多时可左右滚动,固定在右侧的“操作”列用于查看或办理业务。
![表格工具](/images/manual/table-tools.png)
### 导出(暂未开放)
“导出”通常按当前查询条件导出,而不是只导出当前页。建议先缩小查询范围再导出,并妥善保管包含卡号、设备号和企业信息的文件。
### 状态与数据时间
卡状态、流量、会话和执行结果来自不同上游接口,更新时间可能不同。判断数据是否最新时,优先查看“同步时间”“开始时间”“结束时间”等时间字段,不要只看页面打开时间。
## 权限与数据范围
- 菜单权限决定页面是否显示。
- 按钮权限决定是否能新增、编辑、导出、同步或删除。
- 数据权限决定能看到本企业、下级企业还是仅本人数据。
- 同一企业内不同用户看到的菜单和数据可能不同。
企业管理员可通过“企业管理 → 用户管理”和“角色管理”调整本企业用户权限。涉及平台未向企业开放的功能时,需要联系平台支持。
+90
View File
@@ -0,0 +1,90 @@
# Web 端使用手册
本手册面向 iotLCM Web 管理平台的企业客户,说明登录平台后各页面的入口、信息含义和常用操作。
::: info 权限说明
平台按企业、角色和用户分配权限。左侧菜单、页面按钮可能因企业实际授权不同而不同;看不到某项功能时,先联系本企业管理员确认角色权限。按钮以页面实际显示为准。
:::
## 登录平台
![iotLCM 管理平台登录页面](/images/manual/login-page.png)
1. 访问 [iotLCM 管理平台](https://iotlcm.example.com/)。
2. 输入平台分配的账号和密码登录。
3. 首次登录后建议立即修改初始密码,并确认绑定的手机号、邮箱是否正确。
4. 登录后通过左侧菜单进入业务页面;顶部标签可在已打开页面间切换。
若提示账号停用、密码错误或无可用菜单,请联系本企业管理员;企业管理员无法处理时,可通过工单联系平台支持。
## 功能地图(部分开放)
| 菜单 | 页面 | 主要用途 |
| --- | --- | --- |
| 顶级菜单 | 首页 | 查看卡量、用量、生命周期和预警概览 |
| 通讯管理 | 业务受理 | 批量办理套餐、数据服务、生命周期和预警业务 |
| 通讯管理 | 卡信息 | 查询卡、查看套餐和会话、同步状态与用量 |
| 通讯管理 | 达量断网 | 查询、编辑和导出单卡达量断网配置 |
| 通讯管理 | 智能诊断 | 按 MSISDN、ICCID 或 IMSI 一键排查卡和网络状态 |
| 企业管理 | 企业信息 | 维护本企业基础资料和实名认证资料 |
| 企业管理 | 用户管理 | 管理本企业用户及其角色 |
| 企业管理 | 角色管理 | 配置角色菜单权限和状态 |
| 企业管理 | 企业客户 | 管理直属企业客户、登录账号和企业资料 |
| 工单管理 | 我的工单 | 创建工单、沟通、跟踪处理和评价 |
| 工单管理 | 工单记录 | 查询工单的状态变更与操作轨迹 |
| 顶级菜单 | 我的 API 凭证 | 查看并复制本企业接口凭证 |
| 顶级菜单 | 执行日志 | 跟踪批量任务结果及逐卡失败原因 |
“工单问题沟通”是从“我的工单”进入的详情页面,不在左侧单独显示。
## 推荐使用流程
### 日常查卡
1. 进入“通讯管理 → 卡信息”。
2. 用 MSISDN、ICCID、IMSI 或 IMEI 查询目标卡。
3. 打开“查看”,核对卡状态、套餐、用量、到期时间和同步时间。
4. 数据较旧时使用“同步用量”或“同步状态”,再刷新查看。
![卡信息同步操作示意图](/images/manual/card-info-sync-actions.png)
### 排查不能联网
1. 从卡详情点击“诊断”,或进入“通讯管理 → 智能诊断”。
![从卡详情进入智能诊断](/images/manual/card-detail-diagnosis-entry-new.png)
![从通讯管理进入智能诊断](/images/manual/intelligent-diagnosis-entry-new.jpg)
2. 输入卡号并执行“一键诊断”。
![输入卡号并执行一键诊断](/images/manual/intelligent-diagnosis-submit.jpg)
3. 依次查看 SIM 卡状态、通信服务、实时流量、策略限制和网络连接。
![智能诊断结果页面](/images/manual/intelligent-diagnosis-result.png)
4. 仍无法定位时创建工单,并附上卡号、故障时间、诊断结果和终端现象。
![进入我的工单并创建工单](/images/manual/work-order-create-entry-new.jpg)
![填写创建工单信息](/images/manual/work-order-create-form-new.jpg)
### 办理批量业务(暂未开放)
1. 进入“通讯管理 → 业务受理”,选择已授权的业务。
2. 下载最新 Excel 模板,或使用批量输入、连续号段方式提交卡号。
3. 对需要预处理的业务先核对有效数量、失败项、套餐、价格和生效方式。
4. 确认提交后记录批次号。
5. 进入“执行日志”按批次号查看最终结果。
## 阅读指引
- [首页与通用操作](./home):了解查询、重置、导出和数据刷新规则。
- [卡信息](./card-info):了解卡列表字段、卡详情和会话信息。
- [智能诊断](./intelligent-diagnosis):了解入口、诊断步骤和结果判断。
- [业务受理与达量断网](./business-operations):了解批量业务及达量断网配置。
- [企业、用户与角色](./enterprise-management):了解组织和账号权限管理。
- [工单管理](./work-orders):了解问题提交、沟通、关闭和评价。
- [API 凭证与执行日志](./api-and-logs):了解凭证保管和批次追踪。
- [常见问题](./faq):快速排查菜单、数据、任务和诊断问题。
+71
View File
@@ -0,0 +1,71 @@
# 智能诊断
## 入口
有两种进入方式:
1. 左侧菜单 → **通讯管理 → 智能诊断**。
![从左侧菜单进入智能诊断](/images/manual/intelligent-diagnosis-menu.png)
2. 左侧菜单 → **通讯管理 → 卡信息** → 找到目标卡 → “查看” → “诊断”。第二种方式会自动带入 ICCID 并开始查询。
![从卡详情进入智能诊断](/images/manual/card-detail-diagnosis-entry-attachment.png)
## 开始诊断
1. 输入 MSISDN、ICCID 或 IMSI 任一完整标识。
2. 点击“一键诊断”。
3. 等待页面提示“诊断完成”。不同上游能力返回速度可能不同,请勿连续重复点击。
4. 展开各诊断模块查看状态、详细字段和提示。
诊断完成后,页面顶部显示 MSISDN、ICCID、IMSI 和实时 IMEI;下方同时查询近 7 天、近 30 天和近 6 个月的流量趋势。
![智能诊断输入卡号并执行一键诊断](/images/manual/intelligent-diagnosis-submit-button.png)
## 诊断结果
![智能诊断结果总览](/images/manual/intelligent-diagnosis-result-attachment.png)
### SIM 卡状态
关注卡状态、停机原因、是否冻结、冻结原因和冻结操作时间。若卡处于停机、冻结、待激活或销户状态,应先处理卡生命周期问题,再排查终端网络。
### 通信服务
关注 APN、IPv4、IPv6、通信服务状态、在线状态、会话状态、会话建立时间、接入方式和实时 IMEI。
- 通信服务关闭时,需先办理开通或复机。
- 没有会话时,检查设备是否开机、天线和信号是否正常、APN 是否正确。
- 实时 IMEI 与预期设备不一致时,确认是否换机、换卡或发生机卡分离。
### 实时流量
展示已用流量、剩余流量和同步时间。历史趋势用于判断设备是否持续上报、是否出现突增或长时间无流量。
### 策略限制
展示区域限制订购、触发状态、限制区域和人联网访问限制等。卡和设备均正常但仍无法联网时,应重点检查此模块。
### 网络连接
展示开关机状态、设备状态和机卡绑定状态。出现关机、设备异常或机卡分离时,优先在终端侧核查供电、信号、插卡和绑定关系。
## 推荐排查顺序
1. **卡是否可用:** 卡状态、冻结和停机原因。
2. **服务是否开启:** 数据通信服务和套餐是否有效。
3. **流量是否充足:** 剩余流量、达量限制和到期时间。
4. **策略是否限制:** 区域、人联网及其他策略。
5. **设备是否在线:** 开关机、设备状态、会话和实时 IMEI。
6. **趋势是否异常:** 对比近 7 天、30 天、6 个月流量。
## 结果提示说明
- **查询成功但未返回数值:** 上游已响应,但本次没有可展示的数据;结合同步时间和其他模块判断。
- **未查询到会话:** 当前没有在线数据会话,可稍后重试并检查终端。
- **运营商暂不支持/不支持查询:** 当前通道没有对应实时查询能力,不代表卡一定异常。
- **查询暂时未完成:** 可能是上游忙、缓存或接口超时,稍后重试。
- **系统无记录:** 先检查卡号是否完整以及卡是否归属当前企业。
需要提交工单时,建议附上诊断时间、完整 ICCID、异常模块、终端所在地、设备指示灯或日志,以及问题首次出现时间。
+61
View File
@@ -0,0 +1,61 @@
# 工单管理
## 我的工单
**入口:** 左侧菜单 → **工单管理 → 我的工单**。
![我的工单页面入口](/images/manual/work-orders-entry.png)
可按工单编号、工单类型和当前处理状态查询。列表显示工单编号、类型、标题、关联业务号、创建人、当前状态、首次响应时间和创建时间。
常见状态包括已分派、处理中、已解决和已完结;取消后的工单也会保留记录。
## 创建工单
1. 点击“创建工单”。
2. 选择工单类型,如卡问题、套餐问题、订单问题、系统问题或其他问题。
3. 填写关联业务 ID。卡问题建议填写完整 ICCID,并在问题描述中补充 MSISDN。
4. 填写清晰的工单标题和问题描述。
5. 按需上传截图、日志或结果文件。
6. 核对创建人信息后提交。
问题描述建议包含:发生时间、影响范围、卡号、设备所在地、预期结果、实际现象、已执行的同步或诊断操作。不要在附件中上传 API 密钥、账号密码等敏感信息。
![创建工单表单](/images/manual/work-order-create-form-attachment.png)
## 沟通与处理
点击工单右侧“沟通”;工单已结束时按钮显示为“查看”。工单问题沟通页会显示历史消息、附件、工单信息和处理轨迹。
![工单沟通入口](/images/manual/work-order-communication-entry.png)
- 在输入区填写回复内容,或按权限上传附件后发送。
- 平台回复后可继续补充信息,尽量在同一工单中保持上下文完整。
- 有转单权限时,可把工单转交其他处理方。
- 问题确认解决后可执行“解决”;不再需要处理时可“取消”。
- 工单完成后可“关闭”,并按 1 至 5 分提交满意度和评价内容。
![工单沟通与处理操作](/images/manual/work-orders-communication.png)
![已关闭工单的服务评价入口](/images/manual/work-orders-closed-evaluation.png)
按钮是否出现取决于工单当前状态和用户权限。已完结或已取消的工单通常只能查看。
## 工单记录
**入口:** 左侧菜单 → **工单管理 → 工单记录**。
![工单记录页面入口](/images/manual/work-orders-records-entry.png)
该页面用于审计工单流转,可按工单编号和操作类型查询。主要字段包括操作类型、操作机构、操作用户、目标部门、目标用户、变更前状态和变更后状态。
常见操作类型为创建、分派、处理、完成、关单和取消。需要核对“谁在何时改变了工单状态”时,以此页面记录为准;如已授权,可查看详情或导出当前查询结果。
## 何时新建工单
- 同一张卡完成状态同步和智能诊断后仍无法联网。
- 批量任务在执行日志中失败,错误原因无法自行处理。
- 套餐、费用或归属与实际业务不符。
- 页面持续报错,且刷新或重新登录后仍可复现。
同一问题不要重复创建多个工单。补充信息应在原工单的沟通页继续发送。
+23
View File
@@ -0,0 +1,23 @@
---
layout: home
hero:
name: iotLCM OpenAPI
text: 接口文档
tagline: 对接说明:鉴权方式、请求参数、响应结构与示例。
actions:
- theme: brand
text: V3 接口(推荐)
link: /openapi/v3/
- theme: alt
text: 旧版兼容接口
link: /openapi/legacy/
features:
- title: 版本选型指引
details: 新接入推荐使用 V3。V3 接口位于 /openapi/v3/query,通过 X-Access-Token 鉴权,调用时需在请求体中传入 token 接口返回的 appId(⚠️ 注意区分:appKey 用于获取 token,appId 由 token 接口返回并在后续调用中传入),数据权限按账号所属客户隔离;旧版兼容接口位于 /route/open,通过请求 body verify 入参鉴权,仅作为存量客户兼容保留。
- title: V3 接口
details: 鉴权、获取客户调用凭证、查询 SIM 卡信息、查询 SIM 流量限制、查询 SIM IMEI(单卡 / 批量)、查询 SIM 流量用量。
- title: 旧版兼容接口
details: 查询 SIM 详情、查询 SIM 账期用量、查询 SIM 历史月用量、查询 SIM 状态、查询 SIM 在线会话、查询卡列表信息。
---
+133
View File
@@ -0,0 +1,133 @@
---
title: 概览与鉴权
description: iotLCM 旧版兼容接口概览与鉴权说明
outline: deep
---
# 概览与鉴权
本文档收录历史 `/route/open/*` 路径下仍在维护的兼容接口。鉴权通过请求体 `verify` 中的 `appId`、`password` 和 `timeStamp` 完成;`sign` 为历史兼容字段,当前服务不校验。
这些接口由 iotLCM OpenAPI 服务实现并提供,与 V3 接口同域(`api.iotlcm.example.com`),仅请求路径与鉴权方式不同。
## 服务地址
```text
https://api.iotlcm.example.com
```
完整请求 URL:
```text
https://api.iotlcm.example.com/route/open/{接口名}
```
## 统一鉴权
以下各接口的“请求示例”均为完整 JSON 请求体,调用时请设置 `Content-Type: application/json`;`verify.sign` 可传空字符串 `""`。
所有接口通过请求体 `verify` 字段鉴权:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| appId | string | 用于唯一标识请求 |
| password | string | 密码 |
| timeStamp | string | 时间戳,`"" + System.currentTimeMillis()` |
| sign | string | 当前服务不校验,可传空字符串 `""`。 |
### 历史签名规则(仅供参考)
当前服务不要求计算签名,也无需提供 `accessKey`。以下为历史客户端示例中的签名算法,仅供维护已有签名逻辑时参考。
```text
appId={appId}&password={password}&timeStamp={timeStamp}&key={accessKey}
```
对拼接后的字符串计算 MD5,并将结果转为大写,即为 `sign`。`sign` 不参与签名计算;`accessKey` 仅用于签名,不放入请求体的 `verify` 字段。
## 统一返回结构
```json
{
"status": 0,
"message": "",
"result": {}
}
```
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| status | number | 业务状态码,成功为 `0` |
| message | string | 错误或提示信息 |
| result | any | 业务数据 |
## 公共字典
卡状态编码(适用于 `cardInfo`、`simStatus`、`queryCardInfoList` 响应中的 `statusId` / `statusCode` / `status`):
| 编码 | 说明 |
| --- | --- |
| 1 | 库存 |
| 2 | 可测试 |
| 3 | 待激活 |
| 4 | 已激活 |
| 5 | 已停机 |
| 6 | 预销户 |
| 7 | 已销户 |
| 8 | 未知 |
## 请求案例
以下为历史 Java 示例,保留原有 `verify` 块与 `sign` 的生成方式供参考。调用当前服务时,可直接设置 `verify.sign` 为 `""`,省略签名计算。
```java
// 服务器请求地址
protected static String server_Ip = "https://api.iotlcm.example.com/route/open";
// appId
public static String appId = null;
// 密钥密码
public static String password = null;
/**
* Sign 加密类
*/
public static String getSign(Map<String, Object> map, String key) {
List<String> list = new ArrayList<>(map.keySet());
Collections.sort(list);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < list.size(); i++) {
String k = list.get(i);
String v = (String) map.get(k);
sb.append(k).append("=").append(v).append("&");
}
String signstr = sb.append("key=").append(key).toString();
String sign = MD5Util.MD5Encode(signstr).toUpperCase();
return sign;
}
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
Map<String, Object> parmap = new HashMap<>();
Map<String, Object> verify = new HashMap<>();
String appId = "test";
String password = "uhbhkh223123";
String accessKey = "1234567896132";
String timeStamp = "" + System.currentTimeMillis();
verify.put("password", password);
verify.put("appId", appId);
verify.put("timeStamp", timeStamp);
verify.put("sign", getSign(verify, accessKey));
parmap.put("type", "iccid");
parmap.put("cardno", "89860423123123132135");
map.put("verify", verify);
map.put("Param", parmap);
server_Ip += "/cardInfo";
String result = HttpUtil.post(server_Ip, JSON.toJSONString(map));
System.out.println(result);
}
```
+389
View File
@@ -0,0 +1,389 @@
---
title: 查询类
description: iotLCM 旧版兼容查询类接口
outline: deep
---
# 查询类
## 查询 SIM 详情
```http
POST /route/open/cardInfo
```
简要描述:查询物联卡基础信息。
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| type | string | 查询类型:`msisdn` / `iccid` / `imsi` / `vid` |
| cardno | string | 对应的查询值 |
请求示例:
```json
{
"Param": {
"type": "iccid",
"cardno": "898604F4152391115474"
},
"verify": {
"timeStamp": "1784097284347",
"password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc",
"appId": "YOUR_APP_ID",
"sign": ""
}
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| vid | string | 本地卡记录 ID |
| msisdn | string | MSISDN |
| iccid | string | ICCID |
| imsi | string | IMSI |
| imei | string | IMEI |
| deptName | string | 当前归属组织名称 |
| statusId | number | 状态编码,参考公共字典 |
| packageId | string | 当前套餐编码 |
| packageName | string | 当前套餐名称 |
| used | number | 当前周期已用流量,单位 MB |
| remaining | number | 当前周期剩余流量,单位 MB |
| type | string | 卡类型名称 |
| packetArr | array | 资费计划,未配置时返回 `null` |
| remark | string | 备注 |
| grouping | string | 分组,未配置时为空字符串 |
| deliverDate | string | 发货日期,未配置时为空字符串 |
| activateDate | string | 激活日期 |
| expireTime | string | 到期时间 |
响应示例:
```json
{
"status": 0,
"message": "",
"result": {
"vid": "3933",
"msisdn": "1441543605474",
"iccid": "898604F4152391115474",
"imsi": "460087436015474",
"imei": "",
"deptName": "示例企业",
"statusId": 4,
"packageId": "yd-100m-3y",
"packageName": "每月100m3年",
"used": 0.875,
"remaining": 99.125,
"type": "",
"packetArr": null,
"remark": "测试卡",
"grouping": "",
"deliverDate": "",
"activateDate": "2026-06-01",
"expireTime": "2029-01-31 23:59:59"
}
}
```
## 查询 SIM 账期用量
```http
POST /route/open/simDataUsage
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| iccid | string | ICCID |
请求示例:
```json
{
"Param": {
"iccid": "898604F4152391115474"
},
"verify": {
"timeStamp": "1784097284347",
"password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc",
"appId": "YOUR_APP_ID",
"sign": ""
}
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| useUnit | string | 单位,当前为 `MB` |
| useAmount | number | 当前周期已用流量 |
响应示例:
```json
{
"status": 0,
"message": "",
"result": {
"useUnit": "MB",
"useAmount": 0.875
}
}
```
## 查询 SIM 历史月用量
```http
POST /route/open/simDataUsageMonthly
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| iccid | string | ICCID |
| dateTime | string | 查询月份,格式 `yyyyMM`(示例:`202509`) |
请求示例:
```json
{
"Param": {
"iccid": "898604F4152391115474",
"dateTime": "202509"
},
"verify": {
"timeStamp": "1784097284347",
"password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc",
"appId": "YOUR_APP_ID",
"sign": ""
}
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| useUnit | string | 单位,当前为 `MB` |
| useAmount | number | 指定月份用量 |
响应示例:
```json
{
"status": 0,
"message": "",
"result": {
"useUnit": "MB",
"useAmount": 0
}
}
```
## 查询 SIM 状态
```http
POST /route/open/simStatus
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| iccid | string | ICCID |
请求示例:
```json
{
"Param": {
"iccid": "898604F4152391115474"
},
"verify": {
"timeStamp": "1784097284347",
"password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc",
"appId": "YOUR_APP_ID",
"sign": ""
}
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| statusMessage | string | 状态描述 |
| statusCode | number | 状态编码,参考公共字典 |
响应示例:
```json
{
"status": 0,
"message": "",
"result": {
"statusMessage": "已激活",
"statusCode": 4
}
}
```
## 查询 SIM 在线会话
```http
POST /route/open/simSession
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| iccid | string | ICCID |
请求示例:
```json
{
"Param": {
"iccid": "898604F4152391115474"
},
"verify": {
"timeStamp": "1784097284347",
"password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc",
"appId": "YOUR_APP_ID",
"sign": ""
}
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| typeName | string | 运营商系统类型,未上报时为空字符串 |
| imei | string | IMEI,未上报时为空字符串 |
| statusMessage | string | 状态描述,未上报时为空字符串 |
| statusCode | number | 状态码,未上报时为 `0` |
| data | object | 会话详情 |
`data` 字段:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| apnId | string | APN ID |
| rat | string | 接入方式 |
| ipv6 | string | IPv6 地址 |
| ip | string | IPv4 地址 |
| ipv6Prefix | string | IPv6 前缀 |
| status | string | 在线状态 |
| createDate | string | 会话创建时间 |
响应示例:
```json
{
"status": 0,
"message": "",
"result": {
"typeName": "",
"imei": "",
"statusMessage": "",
"statusCode": 0,
"data": {
"apnId": "",
"rat": "",
"ipv6": "",
"ip": "",
"ipv6Prefix": "",
"status": "",
"createDate": ""
}
}
}
```
## 查询卡列表信息
```http
POST /route/open/queryCardInfoList
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| iccid | `array<string>` | ICCID 列表,最多支持 100 个 |
请求示例:
```json
{
"Param": {
"iccid": [
"898604F4152391115473",
"898604F4152391115474"
]
},
"verify": {
"timeStamp": "1784097284347",
"password": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc",
"appId": "YOUR_APP_ID",
"sign": ""
}
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| iccid | string | ICCID |
| activateDate | string | 激活日期 |
| dueExpireTime | string | 到期时间 |
| imei | string | IMEI |
| imsi | string | IMSI |
| msisdn | string | MSISDN |
| type | string | 卡类型 |
| remarks | string | 备注 |
| status | number | 状态编码,参考公共字典 |
响应示例:
```json
{
"status": 0,
"message": "",
"result": [
{
"iccid": "898604F4152391115473",
"activateDate": "2023-05-11",
"dueExpireTime": "",
"imei": "",
"imsi": "460087436015473",
"msisdn": "1441543605473",
"type": "",
"remarks": "测试卡",
"status": 4
},
{
"iccid": "898604F4152391115474",
"activateDate": "2026-06-01",
"dueExpireTime": "2029-01-31 23:59:59",
"imei": "",
"imsi": "460087436015474",
"msisdn": "1441543605474",
"type": "",
"remarks": "测试卡",
"status": 4
}
]
}
```
+14
View File
@@ -0,0 +1,14 @@
---
title: 共享 Token 接口概览
description: 共享 Token 接口与白名单转发说明
outline: deep
---
# 共享 Token 接口概览
本目录包含共享 Token 获取接口和白名单转发说明。
## 接口文档
- [共享 Token 接口](./shared-token/)
- [白名单转发](./mobile-v5/)
+138
View File
@@ -0,0 +1,138 @@
---
title: 白名单转发
description: 通过 api.iotlcm.example.com 访问中国移动物联网能力开放平台 V5 接口
outline: deep
---
# 白名单转发
本目录说明如何通过 `api.iotlcm.example.com` 访问中国移动物联网能力开放平台 V5 接口。平台仅提供安全代理转发,不改变中国移动 V5 接口的请求方法、请求参数、响应结构和业务语义。
## 服务地址
客户侧统一使用:
```text
https://api.iotlcm.example.com
```
V5 接口的请求路径保持与中国移动官方接口一致,将官方域名替换为平台域名即可:
```text
https://api.iotlcm.example.com/v5/{官方接口路径}
```
例如,官方接口路径为 `/v5/ec/query/sim-basic-info` 时,客户侧请求路径为:
```http
POST https://api.iotlcm.example.com/v5/ec/query/sim-basic-info
```
平台会将该请求转发至:
```text
https://api.iot.10086.cn/v5/ec/query/sim-basic-info
```
> [!IMPORTANT] 使用 POST 时务必携带 JSON 请求体
> 中国移动 V5 接口对 `POST` 只接受 JSON 格式。通过代理请求时必须设置
> `Content-Type: application/json`,并在请求体中传入参数;
> 未带该请求头或使用表单编码(`application/x-www-form-urlencoded`)会返回
> `{"status":"11012","message":"POST请求仅支持JSON格式","result":[]}`。
>
> 若使用 `GET`,则以 Query 参数传参,无需设置 `Content-Type`。
## 调用前准备
调用 V5 业务接口前,需要先从平台取得以下信息:
| 参数 | 说明 |
| --- | --- |
| `appid` | 第三方应用唯一标识 |
| `password` | 应用密钥 |
| `transid` | 按官方规则生成的事务编码 |
| `token` | 通过共享 Token 接口获取的运营商令牌 |
其中 `transid` 由客户生成,通常遵循 `appid + YYYYMMDDHHMISS + 8位数字序列`;中国移动通常不校验此事务编号。具体规则及字段约束以中国移动当前发布的接口文档为准。
## 业务接口示例
以下接口字段摘自中国移动 V5 接口清单,用于说明代理路径的写法。完整接口、字段、错误码和版本变更请以官方文档为准。
### 单卡基本信息查询
```http
POST https://api.iotlcm.example.com/v5/ec/query/sim-basic-info
```
请求参数:
| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `transid` | string | 事务编码 |
| `token` | string | V5 Token |
| `msisdn` | string | 物联卡号码 |
| `iccid` | string | ICCID;与 `msisdn`、`imsi` 按官方规则选择 |
| `imsi` | string | IMSI |
请求示例:
```json
{
"transid": "YOUR_TRANSID",
"token": "YOUR_ACCESS_TOKENf3515b3bdaeca904dd2e904061b65e8153",
"iccid": "898608501624D0000009"
}
```
响应主要字段:
| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `status` | string | `0` 表示成功,非 `0` 表示失败 |
| `message` | string | 错误或提示信息 |
| `result` | array | 查询结果 |
| `result[].msisdn` | string | 物联卡号码 |
| `result[].iccid` | string | ICCID |
| `result[].imsi` | string | IMSI |
| `result[].activeDate` | string | 首次激活日期 |
| `result[].openDate` | string | 开卡时间 |
响应示例:
```json
{
"status": "0",
"message": "正确",
"result": [
{
"msisdn": "1442206200009",
"imsi": "460240406200009",
"iccid": "898608501624D0000009",
"activeDate": "2025-03-26 15:49:50",
"openDate": "2025-03-13 16:52:10",
"remark": ""
}
]
}
```
## 请求与响应约定
- V5 接口支持的请求方法、参数位置(Query 或 Form)、参数格式和字段大小写均以中国移动官方文档为准。
- `GET` 与 `POST` 均可通过本代理访问。使用 `POST` 时**必须**设置 `Content-Type: application/json` 并携带 JSON 请求体,否则返回 `11012`;使用表单编码亦不被接受。
- 代理会以平台固定出口地址访问中国移动,因此客户端侧的来源 IP 无需加入中国移动白名单;请勿在请求中自行添加 `X-Forwarded-For`、`X-Real-IP` 等来源标识请求头,中国移动会依据其判定 IP 鉴权,携带非白名单地址将返回 `12003`。
- 平台不将 V5 响应包装成 iotLCM V3 的 `code/message/data` 结构,客户应直接按照中国移动 V5 响应结构解析。
- 运营商 Token 具有有效期,收到 Token 失效类错误后应重新获取,不建议长期缓存。
## 官方资料
接口完整清单、参数定义、返回示例、错误码和 SDK 示例请参阅:
[中国移动物联网能力开放平台 V5 接口文档下载页面](https://api.iot.10086.cn/api/index.html#/resourceCenter/docDownload)
平台代理入口仅替换访问域名,不替代中国移动官方接口规范。
@@ -0,0 +1,87 @@
---
title: 共享 Token 接口
description: 共享 Token 接口说明
outline: deep
---
# 共享 Token 接口
本接口用于获取平台已开放共享权限的移动运营商访问 Token。客户无需直接维护运营商应用密钥,平台根据客户已授权的通道配置完成校验并向运营商申请 Token。
## 服务地址
```text
https://api.iotlcm.example.com
```
HTTP(`http://api.iotlcm.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
## 接口信息
```http
POST /openapi/v3/query/operator-token
```
请求头:`Content-Type: application/json`。
请求体:
| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 平台分配的客户应用标识 |
| `chanKey` | string | 已开通共享 Token 权限的通道标识 |
请求示例:
```json
{
"appId": "7s9g2p5n8z1d4m6r",
"chanKey": "channel_010"
}
```
响应中的 `data.accessToken` 用于调用移动运营商 V5 接口。Token 的有效期以 `data.tokenExpire` 为准,请勿将 Token 写入代码仓库或日志。
响应示例:
失败时,接口返回的 `data` 为 `{}`,不是 `null`;例如 `code=50` 表示平台侧获取运营商 Token 失败。
```json
{
"code": 0,
"message": "",
"data": {
"chanAlias": "中国移动物联网",
"chanKey": "channel_010",
"accessToken": "YOUR_ACCESS_TOKENf3515b3bdaeca904dd2e904061b65e8153",
"tokenExpire": "2026-09-09 16:00:00"
},
"error": null
}
```
## 字段说明
| 参数 | 类型 | 说明 |
| --- | --- | --- |
| `code` | number | 平台业务状态码,`0` 表示成功;`50` 表示平台侧获取运营商 Token 失败 |
| `message` | string | 错误或提示信息 |
| `data` | object | 成功时返回 Token 信息;失败时返回空对象 `{}`,不是 `null` |
| `data.chanAlias` | string | 通道名称 |
| `data.chanKey` | string | 通道标识 |
| `data.accessToken` | string | 移动运营商接口访问 Token |
| `data.tokenExpire` | string | Token 过期时间 |
| `error` | any | 错误详情;无错误时通常为 `null` |
## 调用示例
```bash
curl --request POST \
--url https://api.iotlcm.example.com/openapi/v3/query/operator-token \
--header 'Content-Type: application/json' \
--data '{
"appId": "7s9g2p5n8z1d4m6r",
"chanKey": "channel_010"
}'
```
共享 Token 仅适用于已开通共享权限的通道。若通道未授权、客户应用标识与通道不匹配,或运营商 Token 获取失败,接口将返回失败信息。
+10
View File
@@ -0,0 +1,10 @@
---
title: 共享 Token 接口
description: 共享 Token 接口文档兼容入口
sidebar: false
search: false
---
# 共享 Token 接口
文档已归档到运营商接口模块,请访问[共享 Token 接口](./operator/shared-token/)。
+344
View File
@@ -0,0 +1,344 @@
---
title: 业务类
description: iotLCM V3 业务类接口
outline: deep
---
# 业务类
## 服务地址
```text
https://api.iotlcm.example.com
```
HTTP(`http://api.iotlcm.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
## 鉴权
先调用 `/openapi/v3/query/token` 获取访问令牌,再在请求头中传入 `X-Access-Token`。请求体中的 `appId` 必须与凭证所属客户一致。
## 统一返回结构
```json
{
"code": 0,
"message": "",
"data": {},
"error": null
}
```
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | number | 业务状态码,成功为 `0` |
| `message` | string | 错误或提示信息 |
| `data` | object | 业务数据 |
| `error` | any | 错误详情 |
## 单卡套餐续费
```http
POST /openapi/v3/change/sim-subscribe
```
单卡续费按串行方式执行,接口等待本卡处理完成后直接返回结果。
请求参数:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 客户组织编码 |
| `iccid` | string | ICCID |
| `msisdn` | string | MSISDN/卡号 |
| `imsi` | string | IMSI |
| `packageId` | string | 目标套餐编码 |
| `validity` | integer | 续费时长,单位为年,最小值为 `1` |
| `remark` | string | 续费备注 |
> `iccid`、`msisdn`、`imsi` 至少传一个。
请求示例:
```json
{
"appId": "CUS-202608-0001",
"iccid": "89860401785462635152",
"packageId": "001",
"validity": 1,
"remark": "客户单卡续费"
}
```
响应字段:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `orderId` | string | 订单 ID |
| `orderSn` | string | 订单号 |
| `iccid` | string | 续费卡 ICCID |
| `planName` | string | 续费套餐名称 |
| `effectiveType` | string | 生效类型 |
| `effectiveDate` | string | 套餐生效日期 |
| `expireDate` | string | 套餐到期日期 |
| `amount` | number | 续费金额 |
| `status` | string | 续费状态,成功为 `success`,失败为 `failed` |
| `errorCode` | string | 失败时返回的错误编码 |
| `errorMessage` | string | 失败时返回的错误说明 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"orderId": "54",
"orderSn": "REN20260910153546001000001",
"iccid": "89860401785462635152",
"planName": "中移-1G",
"effectiveType": "immediate",
"effectiveDate": "2026-09-10 15:35:46",
"expireDate": "2027-09-10 15:35:46",
"amount": 0,
"status": "success"
},
"error": null
}
```
失败时仍按统一返回结构返回 `data`,并通过 `status=failed` 和 `errorMessage` 说明失败原因。
```json
{
"code": 0,
"message": "",
"data": {
"orderId": "0",
"orderSn": "",
"iccid": "89860401785462635152",
"planName": "",
"effectiveType": "",
"effectiveDate": "",
"expireDate": "",
"amount": 0,
"status": "failed",
"errorCode": "RENEW_FAILED",
"errorMessage": "卡片不存在或无权限"
},
"error": null
}
```
## 单卡限额变更
```http
POST /openapi/v3/change/sim-traffic-cutoff
```
单卡配置按串行方式执行,接口等待本卡处理完成后直接返回配置结果。
请求参数:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 客户组织编码 |
| `iccid` | string | ICCID |
| `msisdn` | string | MSISDN/卡号 |
| `imsi` | string | IMSI |
| `trafficCutoffStatus` | integer | `0` 删除,`1` 开启,`2` 关闭 |
| `trafficCutoffThreshold` | number | 达量阈值,单位为 MB;开启时必须大于 `0` |
| `remark` | string | 配置备注 |
> `iccid`、`msisdn`、`imsi` 三码至少传一个。trafficCutoffStatus=0 表示取消达量断网配置。
请求示例:
```json
{
"appId": "CUS-202608-0001",
"iccid": "89860401785462635152",
"trafficCutoffStatus": 1,
"trafficCutoffThreshold": 1024,
"remark": "客户开启达量断网"
}
```
响应字段:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `success` | boolean | 是否配置成功 |
| `iccid` | string | 平台卡 ICCID |
| `msisdn` | string | MSISDN |
| `imsi` | string | IMSI |
| `trafficCutoffStatus` | integer | `0` 删除,`1` 已开启,`2` 已关闭 |
| `trafficCutoffThreshold` | number | 达量阈值,单位为 MB |
| `trafficCutoffThresholdUnit` | string | 阈值单位,固定为 `MB` |
| `message` | string | 处理结果说明 |
| `errorCode` | string | 失败时的错误编码 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"success": true,
"iccid": "89860401785462635152",
"msisdn": "141****5152",
"imsi": "460045462635152",
"trafficCutoffStatus": 1,
"trafficCutoffThreshold": 1024,
"trafficCutoffThresholdUnit": "MB",
"message": "traffic cutoff configuration succeeded"
},
"error": null
}
```
失败时仍返回同一响应结构,`success=false`,`message` 为失败原因。
```json
{
"code": 0,
"message": "",
"data": {
"success": false,
"iccid": "89860401785462635152",
"trafficCutoffStatus": 1,
"trafficCutoffThreshold": 1024,
"trafficCutoffThresholdUnit": "MB",
"message": "卡片不存在或无权限",
"errorCode": "TRAFFIC_CUTOFF_FAILED"
},
"error": null
}
```
## 物联网卡批量套餐续费
```http
POST /openapi/v3/change/batch-sim-subscribe
```
批量续费只创建异步批次,不等待所有卡执行完成。请保存响应中的 `batchNo`,再通过批次查询接口跟踪处理结果。
批量接口提交成功后只返回批次信息;卡片执行成功或失败请通过批次查询接口获取。
请求参数:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 客户组织编码 |
| `cards` | array | 续费卡列表 |
| `cards[].iccid` | string | ICCID |
| `cards[].msisdn` | string | MSISDN/卡号 |
| `cards[].imsi` | string | IMSI |
| `packageId` | string | 目标套餐编码 |
| `validity` | integer | 续费时长,单位为年 |
| `remark` | string | 续费备注 |
> 每个 `cards[]` 明细中的`iccid`、`msisdn`、`imsi` 三码至少传一个。
请求示例:
```json
{
"appId": "CUS-202608-0001",
"cards": [
{
"iccid": "89860401785462635152"
}
],
"packageId": "001",
"validity": 1,
"remark": "客户批量续费"
}
```
响应字段:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `batchNo` | string | 系统生成的续费批次号 |
| `batchType` | integer | 批次类型,续费为 `101` |
| `total` | integer | 提交的卡数量 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"batchNo": "REN20260910153546001000002",
"batchType": 101,
"total": 1
},
"error": null
}
```
## 物联网卡批量限额变更
```http
POST /openapi/v3/change/batch-sim-traffic-cutoff
```
批量配置只创建异步批次,不等待所有卡执行完成。请保存响应中的 `batchNo`,再通过批次查询接口跟踪处理结果。
批量接口提交成功后只返回批次信息;卡片执行成功或失败请通过批次查询接口获取。
请求参数:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 客户组织编码 |
| `cards` | array | 配置卡列表,单次最多 1000 张 |
| `cards[].iccid` | string | ICCID |
| `cards[].msisdn` | string | MSISDN/卡号 |
| `cards[].imsi` | string | IMSI |
| `trafficCutoffStatus` | integer | `0` 删除,`1` 开启,`2` 关闭 |
| `trafficCutoffThreshold` | number | 达量阈值,单位为 MB;开启时必须大于 `0` |
| `remark` | string | 配置批次备注 |
> 每个 `cards[]` 明细中的`iccid`、`msisdn`、`imsi` 三码至少传一个。`trafficCutoffStatus=0`时表示取消达量断网配置。
请求示例:
```json
{
"appId": "CUS-202608-0001",
"cards": [
{
"iccid": "89860401785462635152"
}
],
"trafficCutoffStatus": 1,
"trafficCutoffThreshold": 1024,
"remark": "客户批量开启达量断网"
}
```
响应字段:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `batchNo` | string | 系统生成的达量断网配置批次号 |
| `batchType` | integer | 批次类型,达量断网配置为 `41` |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"batchNo": "TCC20260910153546001000001",
"batchType": 41
},
"error": null
}
```
+79
View File
@@ -0,0 +1,79 @@
---
title: 概览与鉴权
description: iotLCM V3 接口概览与鉴权说明
outline: deep
---
# 概览与鉴权
## 服务地址
```text
https://api.iotlcm.example.com
```
HTTP(`http://api.iotlcm.example.com`)仅为存量兼容保留,不做自动跳转,新接入请使用 HTTPS。
## 统一返回结构
V3 返回格式:
```json
{
"code": 0,
"message": "",
"data": {},
"error": null
}
```
字段说明:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| code | number | 业务状态码,成功为 `0` |
| message | string | 错误或提示信息 |
| data | object | 业务数据 |
| error | any | 错误信息字段 |
## 公共字典
卡状态编码
| 编码 | 说明 |
| :-: | :-: |
| 0 | 未知 |
| 1 | 待激活 |
| 2 | 已激活 |
| 4 | 停机 |
| 6 | 可测试 |
| 7 | 库存 |
| 8 | 预销户 |
| 9 | 已销户 |
## V3 鉴权
V3 路由前缀:
```text
/openapi/v3/query
/openapi/v3/change
```
文档中的“请求示例”仅展示请求 body;调用 V3 POST 接口时,请设置 `Content-Type: application/json` 并将示例 JSON 作为请求体发送。请求路径和鉴权请求头见各接口说明。
除获取 token 接口外,其他 V3 接口需要请求头:
```http
X-Access-Token: {accessToken}
```
也支持传入带 `Bearer ` 前缀的值,服务端会去掉前缀。
::: info 重要:请求体中的 appId 必须正确
先调用 `/openapi/v3/query/token` 获取 token,接口响应中会返回 `data.appId`(客户组织编码,格式如 `CUS-202601-0001`)。**后续调用所有 V3 接口时,请求体都必须传入这个 `appId` 值**,且要与 token 所属的客户组织匹配,否则返回 `code: 61 "登录已过期"`。
⚠️ **不要把 `appKey`(API 账号标识)当成 `appId` 使用。** `appKey` 只用于获取 token。
:::
权限控制:调用接口需具备对应接口资源的访问权限,权限与 API 账号所属权限组关联。未配置资源时,按当前开放策略放行。
+783
View File
@@ -0,0 +1,783 @@
---
title: 查询类
description: iotLCM V3 查询类接口
outline: deep
---
# 查询类
## 单卡基本信息查询
```http
POST /openapi/v3/query/sim-info
```
请求头:
```http
X-Access-Token: {accessToken}
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| appId | string | 客户组织编码 |
| iccid | string | ICCID,`iccid`、`msisdn`、`imsi` 至少传一个 |
| msisdn | string | MSISDN |
| imsi | string | IMSI |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"iccid": "898604F4152391115474"
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `data.iccid` | string | ICCID |
| `data.msisdn` | string | MSISDN |
| `data.imsi` | string | IMSI |
| `data.imei` | string | IMEI |
| `data.username` | string | 当前归属客户/组织名称 |
| `data.location` | string | 归属地 |
| `data.planCategory` | string | 套餐分类 |
| `data.currentPlanName` | string | 当前套餐名称 |
| `data.plangroup` | string | 套餐分组,未配置时为空字符串 |
| `data.planid` | string | 当前套餐编码 |
| `data.appid` | string | 归属客户组织编码 |
| `data.allowPlanChange` | number | 是否允许改套餐,未启用时返回 `0` |
| `data.lastSyncTime` | string | 状态最后同步时间 |
| `data.accessType` | string | 接入方式 |
| `data.cardStatus` | string | 卡状态 |
| `data.cardType` | any | 卡类型 |
| `data.networkType` | any | 网络类型 |
| `data.activationDate` | string | 出库/激活相关日期 |
| `data.activeDate` | string | 当前套餐生效日期 |
| `data.validityPeriod` | number | 有效期,按月份计算 |
| `data.expiryDate` | string | 当前套餐到期日期 |
| `data.testPeriod` | number | 测试期,未启用时返回 `0` |
| `data.testPeriodExpiryDate` | any | 测试期到期时间,未启用时返回 `null` |
| `data.silentPeriod` | number | 沉默期,未启用时返回 `0` |
| `data.silentPeriodExpiryDate` | any | 沉默期到期时间,未启用时返回 `null` |
| `data.dataService` | number | 数据服务状态,`1` 启用,`0` 禁用 |
| `data.planData` | number | 套餐总流量,单位 MB |
| `data.usedData` | number | 已用流量,单位 MB |
| `data.remainingData` | string | 剩余流量,单位 MB |
| `data.smsService` | number | 短信服务状态 |
| `data.planSMS` | number | 套餐短信总量 |
| `data.usedSMS` | number | 已用短信数 |
| `data.remainingSMS` | string | 剩余短信数 |
| `data.voiceService` | number | 语音服务状态 |
| `data.planMinutes` | number | 套餐语音分钟数 |
| `data.usedMinutes` | number | 已用语音分钟数 |
| `data.remainingMinutes` | string | 剩余语音分钟数 |
| `data.internationalRoamingService` | number | 国际漫游服务状态 |
| `data.planInternationalData` | number | 国际漫游套餐流量 |
| `data.usedInternationalData` | number | 已用国际漫游流量 |
| `data.remainingInternationalData` | string | 剩余国际漫游流量 |
| `data.description` | any | 备注描述,未填写时返回 `null` |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"iccid": "898604F4152391115474",
"imei": "",
"username": "示例企业",
"location": "370100000000",
"planCategory": "移动小流量",
"currentPlanName": "每月100m3年",
"plangroup": "",
"planid": "yd-100m-3y",
"appid": "CUS-202601-0001",
"allowPlanChange": 0,
"lastSyncTime": "2026-06-24 00:03:19",
"accessType": "",
"cardStatus": "已激活",
"cardType": "",
"networkType": "",
"activationDate": "2026-06-01",
"activeDate": "2026-06-01",
"validityPeriod": 32,
"expiryDate": "2029-01-31",
"testPeriod": 0,
"testPeriodExpiryDate": null,
"silentPeriod": 0,
"silentPeriodExpiryDate": null,
"dataService": 1,
"planData": 100,
"usedData": 0.875,
"remainingData": "99.1",
"smsService": 1,
"planSMS": 0,
"usedSMS": 0,
"remainingSMS": "0",
"voiceService": 1,
"planMinutes": 0,
"usedMinutes": 0,
"remainingMinutes": "0",
"internationalRoamingService": 0,
"planInternationalData": 0,
"usedInternationalData": 0,
"remainingInternationalData": "0.0",
"description": null
},
"error": null
}
```
## 单卡状态信息查询
```http
POST /openapi/v3/query/sim-status
```
请求头:
```http
X-Access-Token: {accessToken}
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | token 返回的客户组织编码 |
| `iccid` | string | ICCID;与 `msisdn`、`imsi` 至少传一个 |
| `msisdn` | string | MSISDN |
| `imsi` | string | IMSI |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"iccid": "898604F4152391115474"
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | number | 业务状态码,成功为 `0` |
| `message` | string | 错误或提示信息 |
| `data.iccid` | string | ICCID,查询命中时返回 |
| `data.lifeCycle` | number | 卡生命周期状态编码 |
| `data.lifeCycleName` | string | 卡生命周期状态文字 |
| `error` | any | 错误信息字段 |
响应示例(查询命中):
```json
{
"code": 0,
"message": "",
"data": {
"iccid": "898604F4152391115474",
"lifeCycle": 2,
"lifeCycleName": "已激活"
},
"error": null
}
```
响应示例(未命中):
```json
{
"code": 50,
"message": "查询sim卡信息失败,请确认ICCID,MSISDN,IMSI是否正确",
"data": {},
"error": null
}
```
`lifeCycleName` 为状态文字;`lifeCycle` 是此接口的状态编码,不要与其他接口或字典中的状态编码混用。
## 单卡流量限额查询
```http
POST /openapi/v3/query/sim-limit
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 客户组织编码 |
| `iccid` | string | ICCID |
| `msisdn` | string | MSISDN |
| `imsi` | string | IMSI |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"iccid": "898604F4152391115474"
}
```
响应字段:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `data.trafficCutoffStatus` | integer | 达量断网状态:`0` 未配置、`1` 已开启、`2` 已关闭 |
| `data.trafficCutoffName` | string | 状态名称,返回 `未配置`、`已开启` 或 `已关闭` |
| `data.trafficCutoffThreshold` | number | 达量断网阈值,单位 MB |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"trafficCutoffStatus": 1,
"trafficCutoffName": "已开启",
"trafficCutoffThreshold": 1024
},
"error": null
}
```
## 单卡实时终端 IMEI 查询
```http
POST /openapi/v3/query/sim-imei
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| appId | string | 客户组织编码 |
| iccid | string | ICCID |
| msisdn | string | MSISDN |
| imsi | string | IMSI |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"iccid": "898604F4152391115474"
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `data.imei` | string | IMEI |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"imei": ""
},
"error": null
}
```
## 单卡本月流量使用量查询
```http
POST /openapi/v3/query/sim-usage
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| appId | string | 客户组织编码 |
| iccid | string | ICCID |
| msisdn | string | MSISDN |
| imsi | string | IMSI |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"iccid": "898604F4152391115474"
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `data.useUnit` | string | 流量单位,固定为 `MB` |
| `data.useAmount` | number | 当前周期已用流量 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"useUnit": "MB",
"useAmount": 0.875
},
"error": null
}
```
## 物联网卡批量状态信息查询
```http
POST /openapi/v3/query/sim-status-batch
```
单次最多查询 1000 张卡。每张卡至少提供 `iccid`、`msisdn`、`imsi` 中的一个;同一条记录提供多个标识时,必须对应同一张卡。
请求头:
```http
X-Access-Token: {accessToken}
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | token 返回的客户组织编码,示例为 `CUS-202601-0001` |
| `cards` | array | 卡片标识列表;示例包含 3 张卡,单次最多 1000 项 |
| `cards[].iccid` | string | ICCID;示例中每项均使用 ICCID,实际调用时与 `msisdn`、`imsi` 至少传一个 |
| `cards[].msisdn` | string | MSISDN,可代替 ICCID 标识卡片 |
| `cards[].imsi` | string | IMSI,可代替 ICCID 标识卡片 |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"cards": [
{
"iccid": "898604F4152391115473"
},
{
"iccid": "898604F4152391115474"
},
{
"iccid": "8986112223600594371"
}
]
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | number | 业务状态码,成功为 `0` |
| `message` | string | 错误或提示信息 |
| `data.total` | integer | 本次请求的卡片总数;示例为 `3` |
| `data.matchedCount` | integer | 匹配成功的卡片数量;示例为 `3` |
| `data.notFoundCount` | integer | 未匹配成功的卡片数量;示例为 `0` |
| `data.items` | array | 每张卡的查询结果;示例依次对应请求中的 3 张卡 |
| `data.items[].matched` | boolean | 是否匹配成功;示例中均为 `true` |
| `data.items[].iccid` | string | 匹配成功时返回的 ICCID |
| `data.items[].lifeCycle` | number | 匹配成功时返回的卡生命周期状态编码;示例中 `2` 为已激活 |
| `data.items[].lifeCycleName` | string | 匹配成功时返回的卡生命周期状态文字 |
| `data.items[].errorCode` | string | 匹配失败时返回的错误码;示例均匹配成功,因此未返回 |
| `data.items[].errorMessage` | string | 匹配失败时返回的错误说明;示例均匹配成功,因此未返回 |
| `error` | any | 错误信息字段 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"total": 3,
"matchedCount": 3,
"notFoundCount": 0,
"items": [
{
"matched": true,
"iccid": "898604F4152391115473",
"lifeCycle": 2,
"lifeCycleName": "已激活"
},
{
"matched": true,
"iccid": "898604F4152391115474",
"lifeCycle": 2,
"lifeCycleName": "已激活"
},
{
"matched": true,
"iccid": "8986112223600594371",
"lifeCycle": 2,
"lifeCycleName": "已激活"
}
]
},
"error": null
}
```
## 物联网卡批量流量信息查询
```http
POST /openapi/v3/query/sim-usage-batch
```
单次最多查询 1000 张卡。请求体需传入 `appId` 和 `cards` 数组;数组中的每张卡至少提供 `iccid`、`msisdn`、`imsi` 中的一个。同一条记录提供多个标识时,必须对应同一张卡。
请求头:
```http
X-Access-Token: {accessToken}
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | token 返回的客户组织编码 |
| `cards` | array | 卡片标识列表,单次最多 1000 项 |
| `cards[].iccid` | string | ICCID;每项与 `msisdn`、`imsi` 至少传一个 |
| `cards[].msisdn` | string | MSISDN,可代替 ICCID 标识卡片 |
| `cards[].imsi` | string | IMSI,可代替 ICCID 标识卡片 |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"cards": [
{
"iccid": "898604F4152391115474"
},
{
"iccid": "898604F4152391115473"
},
{
"iccid": "8986112223600594371"
}
]
}
```
响应结构(流量单位为 MB):
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | number | 业务状态码,成功为 `0` |
| `message` | string | 错误或提示信息 |
| `data.total` | integer | 本次请求的卡片总数 |
| `data.matchedCount` | integer | 匹配成功的卡片数量 |
| `data.notFoundCount` | integer | 未匹配成功的卡片数量 |
| `data.items` | array | 每张卡的查询结果 |
| `data.items[].matched` | boolean | 是否匹配成功 |
| `data.items[].iccid` | string | 匹配成功时返回的 ICCID |
| `data.items[].useUnit` | string | 流量单位,示例为 `MB` |
| `data.items[].useAmount` | number | 流量使用量 |
| `data.items[].errorCode` | string | 匹配失败时返回的错误码;匹配成功时不返回 |
| `data.items[].errorMessage` | string | 匹配失败时返回的错误说明;匹配成功时不返回 |
| `error` | any | 错误信息字段 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"total": 3,
"matchedCount": 3,
"notFoundCount": 0,
"items": [
{
"matched": true,
"iccid": "898604F4152391115474",
"useUnit": "MB",
"useAmount": 0.875
},
{
"matched": true,
"iccid": "898604F4152391115473",
"useUnit": "MB",
"useAmount": 12.5
},
{
"matched": true,
"iccid": "8986112223600594371",
"useUnit": "MB",
"useAmount": 36.25
}
]
},
"error": null
}
```
## 物联网卡批量 IMEI 查询
```http
POST /openapi/v3/query/sim-imei-batch
```
单次最多查询 1000 张卡。每张卡至少提供 `iccid`、`msisdn`、`imsi` 中的一个;同一条记录提供多个标识时,必须对应同一张卡。
请求头:
```http
X-Access-Token: {accessToken}
```
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | token 返回的客户组织编码 |
| `cards` | array | 卡片标识列表,单次最多 1000 项 |
| `cards[].iccid` | string | ICCID;每项与 `msisdn`、`imsi` 至少传一个 |
| `cards[].msisdn` | string | MSISDN,可代替 ICCID 标识卡片 |
| `cards[].imsi` | string | IMSI,可代替 ICCID 标识卡片 |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"cards": [
{
"iccid": "898604F4152391115474"
},
{
"iccid": "898604F4152391115473"
},
{
"msisdn": "1441543605474"
}
]
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `code` | number | 业务状态码,成功为 `0` |
| `message` | string | 错误或提示信息 |
| `data.total` | integer | 本次请求的卡片总数 |
| `data.matchedCount` | integer | 匹配成功的卡片数量 |
| `data.notFoundCount` | integer | 未匹配成功的卡片数量 |
| `data.items` | array | 每张卡的查询结果,顺序与请求中的 `cards` 一致 |
| `data.items[].matched` | boolean | 是否匹配成功 |
| `data.items[].iccid` | string | 匹配成功时返回的 ICCID |
| `data.items[].imei` | string | IMEI;尚未采集到该卡 IMEI 时为空字符串 |
| `data.items[].errorCode` | string | 匹配失败时返回的错误码;匹配成功时不返回 |
| `data.items[].errorMessage` | string | 匹配失败时返回的错误说明;匹配成功时不返回 |
| `error` | any | 错误信息字段 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"total": 3,
"matchedCount": 2,
"notFoundCount": 1,
"items": [
{
"matched": true,
"iccid": "898604F4152391115474",
"imei": ""
},
{
"matched": true,
"iccid": "898604F4152391115473",
"imei": "865466070817587"
},
{
"matched": false,
"imei": "",
"errorCode": "CARD_NOT_FOUND",
"errorMessage": "卡片不存在或无权限"
}
]
},
"error": null
}
```
## 物联网卡批量限额信息查询
```http
POST /openapi/v3/query/traffic-cutoff-config
```
根据卡片标识批量查询当前达量断网配置。`cards[]` 中的 `iccid`、`msisdn`、`imsi` 三码至少传一个。
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 客户组织编码 |
| `cards` | array | 卡片标识列表 |
| `cards[].iccid` | string | ICCID |
| `cards[].msisdn` | string | MSISDN |
| `cards[].imsi` | string | IMSI |
| `includeUsage` | boolean | 是否返回套餐和流量使用信息 |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"cards": [
{
"iccid": "898604F4152391115474"
},
{
"iccid": "898604F4152391115475"
},
{
"iccid": "898604F4152391115476"
}
],
"includeUsage": true
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `data.total` | integer | 请求中的卡片数量 |
| `data.matchedCount` | integer | 匹配成功的卡片数量 |
| `data.notFoundCount` | integer | 未匹配成功的卡片数量 |
| `data.items` | array | 每张卡的查询结果 |
| `data.items[].matched` | boolean | 是否匹配成功 |
| `data.items[].iccid` | string | 平台返回的 ICCID |
| `data.items[].trafficCutoffStatus` | integer | 达量断网状态:`0` 未配置、`1` 已开启、`2` 已关闭 |
| `data.items[].trafficCutoffStatusName` | string | 达量断网状态名称 |
| `data.items[].trafficCutoffThreshold` | number | 达量断网阈值,单位 MB |
| `data.items[].trafficCutoffThresholdUnit` | string | 阈值单位,固定为 `MB` |
| `data.items[].packageTotalFlowMb` | number | 套餐总流量;`includeUsage=true` 时返回 |
| `data.items[].usedFlowMb` | number | 已用流量;`includeUsage=true` 时返回 |
| `data.items[].remainingFlowMb` | number | 剩余流量;`includeUsage=true` 时返回 |
| `data.items[].errorCode` | string | 匹配失败时返回 |
| `data.items[].errorMessage` | string | 匹配失败时返回 |
响应示例:
以下状态、阈值和流量数值用于展示批量响应结构,实际结果以接口查询为准。
```json
{
"code": 0,
"message": "",
"data": {
"total": 3,
"matchedCount": 3,
"notFoundCount": 0,
"items": [
{
"matched": true,
"iccid": "898604F4152391115474",
"trafficCutoffStatus": 0,
"trafficCutoffStatusName": "未配置",
"trafficCutoffThreshold": 0,
"trafficCutoffThresholdUnit": "MB",
"packageTotalFlowMb": 0,
"usedFlowMb": 18,
"remainingFlowMb": 0
},
{
"matched": true,
"iccid": "898604F4152391115475",
"trafficCutoffStatus": 1,
"trafficCutoffStatusName": "已开启",
"trafficCutoffThreshold": 100,
"trafficCutoffThresholdUnit": "MB",
"packageTotalFlowMb": 200,
"usedFlowMb": 80,
"remainingFlowMb": 120
},
{
"matched": true,
"iccid": "898604F4152391115476",
"trafficCutoffStatus": 2,
"trafficCutoffStatusName": "已关闭",
"trafficCutoffThreshold": 50,
"trafficCutoffThresholdUnit": "MB",
"packageTotalFlowMb": 100,
"usedFlowMb": 30,
"remainingFlowMb": 70
}
]
},
"error": null
}
```
## 批次状态查询
```http
POST /openapi/v3/query/batch-status
```
根据指定批次号查询异步处理状态,支持续费、达量断网等异步批次。
请求参数:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `appId` | string | 客户组织编码 |
| `batchNo` | string | 异步 API 返回的批次号 |
请求示例:
```json
{
"appId": "CUS-202601-0001",
"batchNo": "REN20260910153546001000001"
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `data.batchNo` | string | 请求中的批次号 |
| `data.batchAsyncStatus` | integer | 异步状态:`0` 已创建、`1` 待处理、`2` 处理中、`3` 成功、`4` 失败、`5` 部分成功 |
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"batchNo": "REN20260910153546001000001",
"batchAsyncStatus": 3
},
"error": null
}
```
+57
View File
@@ -0,0 +1,57 @@
---
title: 获取调用凭证
description: 使用 appKey、appSecret 换取 V3 接口调用凭证
outline: deep
---
# 获取调用凭证
```http
POST /openapi/v3/query/token
```
说明:使用 `appKey`、`appSecret` 换取接口调用凭证。
请求体:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| appKey | string | API 账号标识,在管理后台申请获取 |
| appSecret | string | API 密钥,在管理后台申请获取 |
| refresh | string | 是否刷新 token:`1` 强制生成新 token,`0` 或留空时尽量复用已有 token |
请求示例:
```json
{
"appKey": "YOUR_APP_ID",
"appSecret": "YOUR_APP_SECRETebdebae9763127943f097758e029a0fdbc"
}
```
响应结构:
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| data.appId | string | 客户组织编码,**后续所有接口请求体中都要传入此值** |
| data.accessToken | string | 接口调用凭证,后续放入 `X-Access-Token` |
::: info 注意:appId ≠ appKey
- **`appKey`**(如 `SDYZ`)只用于获取 token,调用 `/openapi/v3/query/token` 后就不再需要
- **`appId`**(如 `CUS-202601-0001`)由 token 接口返回,后续调用 sim-info 等接口时,请求体中的 `appId` 字段必须填这个值
- 如果传错会导致 `code: 61 "登录已过期"` 错误
:::
响应示例:
```json
{
"code": 0,
"message": "",
"data": {
"appId": "CUS-202601-0001",
"accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJ1IjoiZWE3ZjJiZGY5MjQyNDFkZjg3NGIwZDMzNmZkN2UzMzEiLCJleHAiOjE3ODQ3MDAyODB9.JiYK-CXdXQKKU0UNhNOqKX5Hzyk4lVMtIpunQJDxlBI"
},
"error": null
}
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

Some files were not shown because too many files have changed in this diff Show More