开放 API 开发者文档
/api/snowland/v1 · 全量接口对外开放 · HMAC-SHA256 签名校验
📖 接入概览
智慧全景开放平台将全景漫游、空间商城、营销玩法、AI 生产等全部平台能力以 RESTful API 形式开放。第三方系统(小程序、ERP、官网、数字大屏)可通过 API 读取空间数据、下发热点、同步订单,实现「实景空间 + 业务系统」的深度集成。
Base URL
https://open.snowland.cn/api/snowland/v1(本演示环境为本地 Mock)协议 / 格式
HTTPS · 请求与响应均为 application/json(UTF-8)
返回结构
{ "code": 200, "msg": "success", "data": {…} },code≠200 时 msg 为错误描述
分页参数
page(页码,默认1)、page_size(每页条数,默认20,最大100);返回 total 与 list
速率限制
免费版 60 次/分钟,专业版 600 次/分钟,旗舰版不限(按租户维度计数)
🔐 鉴权与签名(HMAC-SHA256)
每个租户在「工作台 → 开放平台」可创建应用,获得 AccessKey 与 SecretKey。所有请求必须携带以下 Header:
X-Access-Key
应用 AccessKey,如 ak_live_8f3a…
X-Timestamp
Unix 秒级时间戳,允许 ±300 秒时钟偏移
X-Nonce
随机字符串(6~32位),5 分钟内不可重复,防重放
X-Signature
签名串,计算方式见下
签名算法
1)将「HTTP方法、路径、排序后的查询串、请求体SHA256、时间戳、Nonce」按换行符拼接为待签名串;2)以 SecretKey 为密钥做 HMAC-SHA256;3)取十六进制小写作为 X-Signature。
// 待签名串 stringToSign stringToSign = METHOD + "\n" + PATH + "\n" + sortedQuery + "\n" + sha256Hex(body) + "\n" + timestamp + "\n" + nonce signature = HMAC_SHA256(SecretKey, stringToSign).hex().toLowerCase()
// Node.js 签名示例 const crypto = require('crypto'); function sign({ method, path, query = {}, body = '', sk, ts, nonce }) { const sorted = Object.keys(query).sort() .map(k => k + '=' + encodeURIComponent(query[k])).join('&'); const bodyHash = crypto.createHash('sha256').update(body).digest('hex'); const s2s = [method, path, sorted, bodyHash, ts, nonce].join('\n'); return crypto.createHmac('sha256', sk).update(s2s).digest('hex'); }
📦 通用约定
错误码
200
success
400
参数错误(msg 携带字段级提示)
401
签名无效 / 时间戳过期 / Nonce 重放
403
无权限(套餐不含该能力或资源不属于当前租户)
429
触发速率限制,请指数退避重试
500
平台内部错误,可携带 request_id 联系支持
订单状态机
pending(待支付)→ paid(已支付)→ shipped(已发货/待核销)→ completed(已完成);售后分支:refunding(退款中)→ refunded(已退款);支付超时进入 cancelled。
🌐 全景项目接口
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /pano/project/list | 项目分页列表,支持 status / keyword 过滤 |
| GET | /pano/project/detail | 项目详情(含节点、热点、访问策略) |
| POST | /pano/project/create | 创建项目,返回 project_id |
| POST | /pano/project/save | 更新标题/封面/访问控制(密码/付费/限时/禁下载/截屏预警) |
| GET | /pano/node/list | 场景节点列表(全景图、深度图、初始视角) |
| POST | /pano/hotspot/save | 新增/更新热点(图文/音频/视频/导航/商品/AI问答六类) |
| GET | /pano/project/check-access | 访问前置校验:是否需密码/付费,返回门禁类型 |
| POST | /pano/project/verify-password | 校验访问密码,成功返回限时访问凭证 |
| POST | /pano/project/unlock | 付费项目支付解锁,写入 unlock_record |
🛍 空间商城接口
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /goods/list | 商品分页(category_id / keyword / status 过滤) |
| GET | /goods/detail | 商品详情 + SKU 列表 |
| POST | /cart/add | 加入空间购物车(跨场景合并) |
| POST | /order/submit | 下单:服务端计价、核销优惠券、清购物车,返回待支付订单 |
| POST | /order/pay | 支付回调(演示环境为 Mock 支付) |
| POST | /order/refund | 申请退款,进入 refunding 状态机 |
| GET | /shop/list | 多门店列表与切换 |
| POST | /coupon/save | 创建/更新优惠券(满减/折扣,适用店铺) |
🎯 营销玩法接口
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /marketing/list | 玩法列表,kind = distribute/groupon/blindbox/checkin/booking |
| POST | /marketing/save | 创建/启停玩法(分销/拼团/盲盒/打卡集点/预约到店) |
| GET | /stat/funnel | 空间转化漏斗:浏览→点击→加购→支付 |
| GET | /stat/heatmap | 全景视角热力数据(yaw/pitch 分布) |
📍 位置服务(高德地图)
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /map/config | 前端地图初始化参数(启停、Key、默认中心点与缩放、坐标系 GCJ-02) |
| GET | /map/regeo | 逆地理编码:经纬度 → 结构化地址(服务端代理,Web 服务 Key 不下发) |
| GET | /map/geo | 正向地理编码:地址关键词 → 候选坐标列表(服务端代理) |
| POST | /shop/update | 门店资料含地址与 GCJ-02 经纬度(lng/lat),用于地图展示与导航 |
| POST | /order/submit | 收货地址支持 lng/lat,订单详情返回坐标并生成高德地图链接 |
🤖 AI 与算力接口
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /ai/gen-pano | 文生全景:文本描述 → 2:1 等距全景图(异步任务) |
| POST | /ai/matting | SAM 商品抠图,返回透明底 PNG |
| POST | /ai/digital-human | 数字人解说视频生成(口型对齐 TTS) |
| POST | /splat/project/create | 提交 3DGS 重建任务(视频/照片序列) |
| GET | /task/list | 算力任务队列轮询(进度/状态/产物地址) |
🟨 JavaScript SDK
浏览器 / Node 通用。安装:npm i @snowland/sdk,或 CDN 引入。SDK 自动完成签名与重试。
import SmartPano from '@smartpano/sdk'; const sl = new SmartPano({ ak: 'ak_live_8f3a…', sk: 'sk_live_29c1…' }); // 拉取项目并嵌入漫游 iframe const { data } = await sl.pano.detail({ id: 1 }); document.querySelector('#pano').innerHTML = sl.embed(data.project, { width: '100%', height: 480, watermark: true }); // 空间内下单 const order = await sl.order.create({ sku_id: 110, num: 1, coupon_id: 501, address: { name: '王先生', phone: '138****0000' } }); await sl.order.pay({ order_id: order.data.id, channel: 'mock' });
🐍 Python SDK
安装:pip install snowland-sdk。适用于 ERP 订单同步、批量热点下发、数据回流等后端场景。
from snowland import Client cli = Client(ak="ak_live_8f3a…", sk="sk_live_29c1…") # 同步昨日订单到 ERP orders = cli.get("/order/list", params={ "status": "paid", "page": 1, "page_size": 100 }) for o in orders["data"]["list"]: erp.push(o) # 批量下发商品热点 cli.post("/pano/hotspot/save", json={ "project_id": 1, "node_id": 101, "type": "product", "title": "北欧布艺单人沙发", "yaw": 25, "pitch": -8, "goods_id": 11, "sku_id": 110 })
