开发者接入

开放接口签名、额度和资源路径说明

需要把门店资料、商品、会员或订单同步到外部系统时,先在控制台创建凭证,再按签名规则请求开放接口。

接入前准备

凭证只在控制台创建,appSecret 只在创建时展示一次

进入控制台路径 /client/open-api 创建凭证。请把 appSecret 保存在你自己的服务端,白洞门店管理系统不会再次展示明文密钥。

1 开通套餐能力

套餐需要包含开放接口模块,并按资源额外开通商品与库存、会员与营销、收银与桌台等业务模块。

2 创建调用凭证

控制台会生成 appKey 和 appSecret。appSecret 只在创建时展示一次,请不要写进前端页面。

3 从服务端发起请求

开放接口域名为 https://open.whbdvr.com,业务系统应从服务端计算签名后请求。

签名规则

每次请求都必须带三个签名请求头

服务端使用保存的密钥哈希校验签名。签名密钥为 sha256(appSecret),签名算法为 HMAC-SHA256

必填请求头

  • X-WH-App-Key:控制台创建凭证时返回的 appKey。
  • X-WH-Timestamp:当前请求时间戳,用于防止过期请求。
  • X-WH-Signature:按请求方法和路径计算出的签名。

签名输入

signingKey = sha256(appSecret)
signature = HMAC-SHA256(signingKey, METHOD + "\n" + PATH + "\n" + TIMESTAMP)

PATH 使用带 /api 前缀的接口路径,不包含查询参数。

当前资源

已开放的只读资源接口

所有资源都会按凭证所属门店查询,不接受外部传入门店参数覆盖。商品、会员、订单还会继续校验对应业务模块是否已开通。

请求
用途
额外套餐模块
GET /api/external/open-api/tenant/profile
查询当前凭证所属门店资料
开放接口
GET /api/external/open-api/products
查询商品只读列表,支持关键词、分类、状态筛选
商品与库存
GET /api/external/open-api/stock-records
查询库存流水只读列表,支持商品、类型和时间筛选
商品与库存
GET /api/external/open-api/members
查询会员只读列表,支持关键词、等级、状态筛选
会员与营销
GET /api/external/open-api/member-consumes
查询会员消费记录只读列表,支持会员、订单号、支付方式和时间筛选
会员与营销
GET /api/external/open-api/orders
查询订单只读列表,支持订单号、时间、状态、支付方式筛选
收银与桌台
GET /api/external/open-api/orders/{orderNo}
按订单号查询订单只读详情,包含订单明细
收银与桌台
GET /api/external/open-api/reports/business-overview
查询经营概览只读汇总,包含订单数、营业额、实际收入、会员充值和平均客单
经营报表
GET /api/external/open-api/reports/business-trend
查询经营趋势只读汇总,按日期返回营业额、实际收入、会员充值、订单数和平均客单
经营报表
GET /api/external/open-api/reports/product-sales-ranking
查询商品销售排行只读汇总,按商品返回销量、销售额、订单数和平均单价
经营报表
GET /api/external/open-api/reports/member-growth-retention
查询会员增长与复购概览,返回新增会员、消费会员、复购率、消费金额和储值汇总
会员与营销
GET /api/external/open-api/reports/business-metric-groups
查询门店经营指标分组汇总,按订单收入、会员储值、商品销售和会员活跃返回指标组
经营报表
额度与日志

套餐控制每月调用次数和每分钟调用次数

开放接口会在写入调用日志前检查额度,超过额度会拒绝请求。控制台开放接口页可查看调用记录、来源 IP、User-Agent 和状态码。

openApiMonthlyCallLimit

每月开放接口调用次数,适合按套餐档位定义外部系统同步规模。

openApiPerMinuteCallLimit

每分钟开放接口调用次数,用于限制突发请求,避免影响门店业务。

调用记录

每次成功调用都会记录接口路径、请求方法、状态码、来源 IP 和浏览器标识。

错误处理

开放接口错误码

开放接口会返回 HTTP 状态和错误信息。外部系统可以按下列业务码归类处理,方便把签名、套餐、额度和资源模块问题分开排查。

错误码
触发场景
处理方式
INVALID_OPEN_API_SIGNATURE
签名失败、签名参数不完整、时间戳无效或签名已过期。
重新检查 X-WH-App-KeyX-WH-TimestampX-WH-Signature 和签名路径。
OPEN_API_NOT_ENTITLED
套餐未开通开放接口,或当前套餐不包含开放接口调用权限。
进入套餐与续费页确认开放接口模块,必要时升级到包含该模块的套餐。
OPEN_API_LIMIT_EXCEEDED
开放接口额度超限,包括每月调用次数或每分钟调用次数达到套餐上限。
降低同步频率,稍后重试,或升级到更高调用额度的套餐。
RESOURCE_FEATURE_NOT_ENTITLED
资源模块未开通,例如请求商品、库存、会员或订单资源时缺少对应业务模块。
按接口资源表确认需要的额外套餐模块,再调整套餐或改用已开通资源。
接口调试

Postman / Apifox 调试模板

调试时先建环境变量,再把预请求脚本放到集合或接口的 Pre-request Script。正式接入仍建议在你自己的服务端生成签名,不要把 appSecret 放到浏览器代码里。

环境变量

  • baseUrlhttps://open.whbdvr.com
  • appKey:控制台开放接口页创建凭证后返回。
  • appSecret:只在创建凭证时展示一次,请仅用于本地调试环境。

示例请求

GET {{baseUrl}}/api/external/open-api/tenant/profile
GET {{baseUrl}}/api/external/open-api/orders

预请求脚本

const method = pm.request.method.toUpperCase();
const path = pm.request.url.getPath();
const timestamp = Date.now().toString();
const appKey = pm.environment.get('appKey');
const appSecret = pm.environment.get('appSecret');
const signingKey = CryptoJS.SHA256(appSecret).toString();
const payload = [method, path, timestamp].join('\n');
const signature = CryptoJS.HmacSHA256(payload, signingKey).toString();

pm.request.headers.upsert({ key: 'X-WH-App-Key', value: appKey });
pm.request.headers.upsert({ key: 'X-WH-Timestamp', value: timestamp });
pm.request.headers.upsert({ key: 'X-WH-Signature', value: signature });

如果请求带查询参数,签名仍使用路径部分,例如 /api/external/open-api/orders

JavaScript SDK

SDK 封装签名、请求头和当前开放资源方法,适合 Node.js 服务端直接复用。不要在浏览器里放入 appSecret

const { WhiteholeOpenApiClient } = require('./whitehole-open-api-sdk');

const client = new WhiteholeOpenApiClient({
  baseUrl: process.env.WH_OPEN_API_BASE_URL,
  appKey: process.env.WH_OPEN_API_APP_KEY,
  appSecret: process.env.WH_OPEN_API_APP_SECRET,
  retry: 2,
  retryOnStatusCodes: [429, 500, 502, 503, 504],
});

const overview = await client.getBusinessOverview({
  startDate: '2026-05-01',
  endDate: '2026-05-07',
});

SDK 覆盖

  • 导出 SDK_VERSIONOPEN_API_ERROR_CODESWhiteholeOpenApiClientsignOpenApiRequestrequestOpenApi
  • 内置门店资料、商品、库存、会员、订单和经营报表资源方法。
  • 提供 buildPageQuery 统一分页参数,列表接口默认限制 pageSize 不超过 100。
  • 支持 retryretryDelayMsretryOnStatusCodes,可对 OPEN_API_LIMIT_EXCEEDED 场景按服务端状态做退避重试。
  • 提供 whitehole-open-api-sdk.d.ts 类型声明和 whitehole-open-api-sdk.CHANGELOG.md 版本变更记录。
  • 提供 whitehole-open-api-sdk.RELEASE.md 发布说明和 whitehole-open-api-sdk.verify.js 发布前校验脚本。
  • 提供 whitehole-open-api-sdk.package.json 包清单和 whitehole-open-api-sdk.README.md,发布到私有 npm 仓库前可重命名为标准包文件。
  • 请求带查询参数时,签名仍只使用路径部分,和开放接口服务端校验规则一致。

私有包发布准备

当前官网以静态文件交付 SDK。若要发布到企业内部 npm 仓库,请把 SDK 文件放入独立目录,并将包清单重命名为 package.json 后再打包。

cp whitehole-open-api-sdk.package.json package.json
node whitehole-open-api-sdk.verify.js
npm pack --dry-run

包内文件

  • whitehole-open-api-sdk.js:CommonJS SDK 主文件。
  • whitehole-open-api-sdk.d.ts:TypeScript 类型声明。
  • whitehole-open-api-sdk.README.md:包使用说明。
  • whitehole-open-api-sdk.CHANGELOG.md:版本变更记录。
  • whitehole-open-api-sdk.RELEASE.md:发布检查说明。

外部 BI 同步经营指标

适合已经购买开放接口和经营报表模块的门店,把经营概览、经营趋势和指标分组同步到外部 BI 或集团看板。

WH_OPEN_API_APP_KEY=your-app-key \
WH_OPEN_API_APP_SECRET=your-app-secret \
WH_BI_WEBHOOK_URL=https://bi.example.com/whitehole \
node whitehole-open-api-bi-sync-example.js

场景覆盖

  • 调用 getBusinessOverviewgetBusinessTrendgetBusinessMetricGroups
  • WH_SYNC_START_DATEWH_SYNC_END_DATE 控制同步日期。
  • 未配置 WH_BI_WEBHOOK_URL 时只在服务端输出 JSON,便于本地调试。

ERP 同步商品和库存

适合已经购买开放接口和商品与库存模块的门店,把商品列表和库存流水同步到外部 ERP 或采购系统。

WH_OPEN_API_APP_KEY=your-app-key \
WH_OPEN_API_APP_SECRET=your-app-secret \
WH_ERP_WEBHOOK_URL=https://erp.example.com/whitehole \
node whitehole-open-api-erp-inventory-example.js

场景覆盖

  • 调用 listProductslistStockRecords
  • 通过 WH_SYNC_PAGE_SIZE 控制单页数量,SDK 会把 pageSize 限制在 100 以内。
  • 未配置 WH_ERP_WEBHOOK_URL 时只在服务端输出 JSON,便于本地调试。

会员营销系统同步增长与复购

适合已经购买开放接口和会员与营销模块的门店,把会员列表、消费记录和增长复购汇总同步到外部营销系统。

WH_OPEN_API_APP_KEY=your-app-key \
WH_OPEN_API_APP_SECRET=your-app-secret \
WH_MARKETING_WEBHOOK_URL=https://marketing.example.com/whitehole \
node whitehole-open-api-member-marketing-example.js

场景覆盖

  • 调用 listMemberslistMemberConsumesgetMemberGrowthRetention
  • WH_SYNC_START_DATEWH_SYNC_END_DATE 控制消费与复购统计窗口。
  • 未配置 WH_MARKETING_WEBHOOK_URL 时只在服务端输出 JSON,便于本地调试。

Node.js 服务端示例

下载示例后,在服务端设置 WH_OPEN_API_APP_KEYWH_OPEN_API_APP_SECRET 环境变量,再执行脚本测试签名请求。

WH_OPEN_API_APP_KEY=your-app-key \
WH_OPEN_API_APP_SECRET=your-app-secret \
node whitehole-open-api-node-example.js

示例覆盖

  • 使用 Node.js 原生 crypto 生成 sha256(appSecret)
  • 使用 HMAC-SHA256 计算 X-WH-Signature
  • 示例请求 /api/external/open-api/tenant/profile/api/external/open-api/orders

PHP 服务端示例

下载示例后,在 PHP 服务端设置 WH_OPEN_API_APP_KEYWH_OPEN_API_APP_SECRET 环境变量,再用命令行执行脚本。

WH_OPEN_API_APP_KEY=your-app-key \
WH_OPEN_API_APP_SECRET=your-app-secret \
php whitehole-open-api-php-example.php

示例覆盖

  • 使用 hash('sha256') 生成 sha256(appSecret)
  • 使用 hash_hmac('sha256') 计算 X-WH-Signature
  • 示例请求 /api/external/open-api/tenant/profile/api/external/open-api/orders

Java 服务端示例

下载示例后,使用 JDK 11 或更高版本编译运行。示例只依赖 JDK 标准库,通过环境变量读取凭证。

javac WhiteholeOpenApiExample.java
WH_OPEN_API_APP_KEY=your-app-key \
WH_OPEN_API_APP_SECRET=your-app-secret \
java WhiteholeOpenApiExample

示例覆盖

  • 使用 MessageDigest 生成 sha256(appSecret)
  • 使用 Mac.getInstance("HmacSHA256") 计算 X-WH-Signature
  • 示例请求 /api/external/open-api/tenant/profile/api/external/open-api/orders
需要协助

先确认套餐是否包含开放接口和对应业务模块

如果你要接商品、会员或订单,请同时确认商品与库存、会员与营销、收银与桌台模块是否已开通。

咨询接入方式