通用 API 对接指南
本指南适用于任何需要自动查询 Lumio 商品与库存、使用钱包购买、读取服务状态和凭据、续费或执行生命周期操作的外部系统。Lumio 只提供统一的通用 API;商品映射、终端客户订单、前端展示和你向终端客户提供的退款政策由你的系统负责。
1. 接入前准备
API 基础地址固定为 https://lumio.sh/api/v1/integration。
在“账户设置 → API 对接”创建 API Key。完整 Key 只显示一次,请保存在服务端密钥管理系统中。
不要把 Key 写进浏览器、移动 App、公开仓库、日志或发给终端客户。
只授予实际需要的 Scope。具有购买、续费权限的调用会直接扣除当前 Lumio 钱包余额。
所有金额均以最小货币单位表示,例如 12900 表示 USD 129.00;时间使用 ISO 8601。
2. Scope 与能力
catalog:read:读取商品、周期价格和准确库存。
wallet:read:读取钱包可用余额。
purchase:write:报价并购买商品。
service:read:读取购买结果、异步操作和服务状态。
credentials:read:读取已就绪服务的登录凭据。
renewal:write:用 Lumio 钱包续费。
lifecycle:write:暂停、恢复、终止、重启、重置密码和重装。
3. 鉴权与连接测试
每次请求发送 Authorization: Bearer <Lumio API Key>、Accept: application/json 和你生成的唯一 X-Request-Id。有 JSON 请求体时再发送 Content-Type: application/json。
curl -sS https://lumio.sh/api/v1/integration/account \
-H "Authorization: Bearer lumio_live_example.secret" \
-H "Accept: application/json" \
-H "X-Request-Id: partner-connection-0001"
HTTP 200 且响应中的 code=200 表示连接成功。保存返回的 Scope 并确认包含后续流程所需权限。响应外层统一为 {"code":200,"message":"...","data":{...}};程序应按 HTTP 状态和 data.error 分支,不要匹配可能变化的 message 文案。
4. 商品、库存与钱包
调用 GET /catalog/products 获取 SKU、周期、价格、固定配置和当前库存。
需要详情时调用 GET /catalog/products/{sku}。只能使用接口返回的 SKU、周期、配置和附加项,不要在外部系统中猜测。
购买前调用 GET /wallet 检查 available_cents。页面显示的余额或历史缓存不能代替购买时的实时校验。
5. 报价与购买闭环
先调用 POST /purchases/quote 做只读试算。报价请求不发送 Idempotency-Key:
{
"product_sku": "MAC-MINI-M4-ESSENTIAL",
"billing_cycle": "month",
"quantity": 1,
"configuration": {},
"addon_ids": []
}
向终端客户确认价格后,为这次购买生成并持久保存一个稳定的 external_reference 和一个稳定的 Idempotency-Key。把报价返回的 total_cents 作为 expected_total_cents 回传,它是防止价格变化后意外多扣款的成本上限。
POST /purchases
Idempotency-Key: partner-order-9001-create-v1
{
"external_reference": "partner-order-9001:create:1",
"product_sku": "MAC-MINI-M4-ESSENTIAL",
"billing_cycle": "month",
"quantity": 1,
"configuration": {},
"addon_ids": [],
"expected_total_cents": 12900
}
成功后立即保存 operation_id、Lumio 订单号、账单号和服务编号。若响应时服务仍在开通,轮询 GET /operations/{operation_id},直到 status=succeeded、needs_attention 或出现明确失败。也可用 GET /purchases/by-reference/{external_reference} 找回原购买。
网络超时不等于购买失败。超时后先按外部单号查找;找不到时必须使用完全相同的请求体、external_reference 和 Idempotency-Key 重发。不要更换编号绕过幂等保护,否则可能造成重复购买或重复扣款。
6. 服务状态与凭据
GET /services/by-reference/{external_reference}:按你的外部购买编号找服务。
GET /services/{serviceId}:读取当前状态、账期、到期时间和凭据是否就绪。
GET /services/{serviceId}/credentials:仅在 credentials_ready=true 后读取。未就绪时等待并重试,不要制造本地假凭据。
凭据属于敏感数据,只能展示给有权访问该服务的终端客户或运维人员。不要写入普通业务日志。服务终止或删除后,凭据不再可用,next_due_at 也会为空。
7. 续费闭环
调用 GET /services/{serviceId}/renewal-quote,保存 current_next_due_at 和 total_cents。
调用 POST /services/{serviceId}/renew,发送稳定的外部续费编号和幂等键,并把报价值作为 expected_next_due_at、expected_total_cents 回传。
保存并轮询返回的 operation_id。只有操作成功且服务的新到期时间已经更新,才把外部订单标记为续费完成。
{
"external_reference": "partner-service-1001:renew:2026-09-02",
"expected_next_due_at": "2026-09-02T00:00:00+00:00",
"expected_total_cents": 9900
}
8. 生命周期与设备操作
以下写操作都必须发送稳定的 external_reference 和 Idempotency-Key,保存返回的 operation_id 并轮询:
POST /services/{serviceId}/suspend:暂停服务。
POST /services/{serviceId}/resume:释放当前 API Key 建立的暂停;若仍有欠费或管理员限制,服务可能继续保持暂停。
POST /services/{serviceId}/actions/reboot:重启设备。
POST /services/{serviceId}/actions/reset-password:请求 Lumio 生成新密码。请求体禁止传入密码;完成后重新读取凭据。
POST /services/{serviceId}/actions/reinstall:请求体必须包含 "confirmation":true。重装会清除设备数据。
POST /services/{serviceId}/terminate:请求体必须包含 "immediate":true。
终止不可逆。终止成功会永久回收服务资源和凭据并放弃本期剩余使用时间,Lumio 不会自动退款或补回钱包。你的系统给终端客户退款也不会反向触发 Lumio 退款;例外只能提交 Lumio 支持人工核对。
9. 错误、限流与安全重试
400/422:修正请求参数或选择;不要原样无限重试。
401/403:停止调用,检查 Key、账户状态和 Scope。
404:核对资源是否属于当前 Key 对应的 Lumio 账户。
409:处理价格、状态、外部编号或幂等冲突;不要换编号强行提交。
429 或带 Retry-After 的 503:等待指定秒数并使用指数退避。
异步操作进入 needs_attention 时停止自动重试,保存 operation_id、X-Request-Id、外部编号和安全错误码供人工排查。
10. 上线检查清单
生产环境只使用服务端密钥存储,并准备 Key 轮换流程。
SKU、周期和固定配置来自实时目录;价格提交带成本上限。
每个写操作先持久化外部编号和幂等键,再发送请求。
购买、续费和生命周期操作都能在进程重启后继续轮询原 operation。
已覆盖连接失败、余额不足、缺货、价格变化、限流、超时、凭据未就绪和 needs_attention。
终端客户界面明确展示扣款、重装清除数据和立即终止不退款的后果。
11. 契约文件与支持
登录 Lumio 后,前往“API 对接”页面下载 OpenAPI 契约和 Postman 集合。正式开发以 OpenAPI 为字段与状态契约,本文用于说明业务闭环。
提交工单时请提供发生时间、接口路径、HTTP 状态、data.error、X-Request-Id、operation_id 和外部编号;不要发送完整 API Key、密码或服务凭据。