开放接口签名、额度和资源路径说明
需要把门店资料、商品、会员或订单同步到外部系统时,先在控制台创建凭证,再按签名规则请求开放接口。
凭证只在控制台创建,appSecret 只在创建时展示一次
进入控制台路径 /client/open-api 创建凭证。请把 appSecret 保存在你自己的服务端,白洞门店管理系统不会再次展示明文密钥。
套餐需要包含开放接口模块,并按资源额外开通商品与库存、会员与营销、收银与桌台等业务模块。
控制台会生成 appKey 和 appSecret。appSecret 只在创建时展示一次,请不要写进前端页面。
开放接口域名为 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/profileGET /api/external/open-api/productsGET /api/external/open-api/stock-recordsGET /api/external/open-api/membersGET /api/external/open-api/member-consumesGET /api/external/open-api/ordersGET /api/external/open-api/orders/{orderNo}GET /api/external/open-api/reports/business-overviewGET /api/external/open-api/reports/business-trendGET /api/external/open-api/reports/product-sales-rankingGET /api/external/open-api/reports/member-growth-retentionGET /api/external/open-api/reports/business-metric-groups套餐控制每月调用次数和每分钟调用次数
开放接口会在写入调用日志前检查额度,超过额度会拒绝请求。控制台开放接口页可查看调用记录、来源 IP、User-Agent 和状态码。
openApiMonthlyCallLimit
每月开放接口调用次数,适合按套餐档位定义外部系统同步规模。
openApiPerMinuteCallLimit
每分钟开放接口调用次数,用于限制突发请求,避免影响门店业务。
每次成功调用都会记录接口路径、请求方法、状态码、来源 IP 和浏览器标识。
开放接口错误码
开放接口会返回 HTTP 状态和错误信息。外部系统可以按下列业务码归类处理,方便把签名、套餐、额度和资源模块问题分开排查。
INVALID_OPEN_API_SIGNATUREX-WH-App-Key、X-WH-Timestamp、X-WH-Signature 和签名路径。OPEN_API_NOT_ENTITLEDOPEN_API_LIMIT_EXCEEDEDRESOURCE_FEATURE_NOT_ENTITLEDPostman / Apifox 调试模板
调试时先建环境变量,再把预请求脚本放到集合或接口的 Pre-request Script。正式接入仍建议在你自己的服务端生成签名,不要把 appSecret 放到浏览器代码里。
环境变量
baseUrl:https://open.whbdvr.comappKey:控制台开放接口页创建凭证后返回。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_VERSION、OPEN_API_ERROR_CODES、WhiteholeOpenApiClient、signOpenApiRequest和requestOpenApi。 - 内置门店资料、商品、库存、会员、订单和经营报表资源方法。
- 提供
buildPageQuery统一分页参数,列表接口默认限制pageSize不超过 100。 - 支持
retry、retryDelayMs和retryOnStatusCodes,可对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
场景覆盖
- 调用
getBusinessOverview、getBusinessTrend和getBusinessMetricGroups。 - 按
WH_SYNC_START_DATE和WH_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
场景覆盖
- 调用
listProducts和listStockRecords。 - 通过
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
场景覆盖
- 调用
listMembers、listMemberConsumes和getMemberGrowthRetention。 - 按
WH_SYNC_START_DATE和WH_SYNC_END_DATE控制消费与复购统计窗口。 - 未配置
WH_MARKETING_WEBHOOK_URL时只在服务端输出 JSON,便于本地调试。
Node.js 服务端示例
下载示例后,在服务端设置 WH_OPEN_API_APP_KEY 和 WH_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_KEY 和 WH_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。
先确认套餐是否包含开放接口和对应业务模块
如果你要接商品、会员或订单,请同时确认商品与库存、会员与营销、收银与桌台模块是否已开通。