开放 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/mattingSAM 商品抠图,返回透明底 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
})
准备好接入了吗?

旗舰版套餐含开放 API 权限 · 签名问题排查见上文错误码 401