商品库存变更查询
仅提供已授权的门店数据服务:调用时通过
clientStoreSn定位门店,平台校验该门店已完成授权(即客户门店与收钱吧门店已完成映射);未授权门店的商品库存变更数据无法查询。
1. 接口说明
按指定日期范围异步导出已授权门店的商品库存变更数据。开放平台受理请求后创建导出任务,任务完成后生成导出文件(库存流水明细 CSV、库存流水 movement Excel),再通过 notifyUrl 回调将下载链接通知开发者;任务失败时同样回调通知失败原因。
接口为异步导出模式:提交后立即返回受理结果,导出结果与任务状态通过回调通知异步获取,无需轮询。任务受理后异步执行导出,处理时长一般不超过 5 分钟,完成后通过 notifyUrl 回调通知开发者。
导出流程

- 开发者发起查询请求,携带门店、日期范围、回调地址
notifyUrl。 - 开放平台受理并创建该门店的商品库存变更导出任务。
- 任务完成:开放平台回调
notifyUrl,downloadUrls为结果文件下载链接集合。 - 任务失败:开放平台回调
notifyUrl,携带失败原因(remark),请联系收钱吧运营人员处理。
| 项目 | 说明 |
|---|---|
| 接口路径 | POST /open-api/v1/goods/stock/query |
| 鉴权方式 | HMAC-SHA256,见鉴权与签名 |
| 限流 | 以门店号(clientStoreSn)为维度进行限流,频率限制为 10 QPS |
2. 请求参数
| 字段 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|
| clientStoreSn | String | 是 | SH001 | 客户门店号,平台据此查询映射的收钱吧门店并校验授权,仅返回该门店下的商品库存变更 |
| sqbStoreSn | String | 否 | 1580000003443730 | 收钱吧门店号,可不传;如传则优先使用 sqbStoreSn,平台会校验其与 clientStoreSn 的映射关系 |
| requestId | String | 是 | req_001 | 请求标识,必传。本接口requestId 用于幂等去重,见幂等机制 |
| startTime | String | 否 | 2026-01-01 | 开始日期,日维度(格式:yyyy-MM-dd)。与 endTime 组成查询时间范围,仅支持查询近 6 个月内的数据,查询跨度最大 31 天,不传时默认查询前一天数据 |
| endTime | String | 否 | 2026-01-31 | 结束日期,日维度(格式:yyyy-MM-dd)。与 startTime 组成查询时间范围,仅支持查询近 6 个月内的数据,查询跨度最大 31 天,不传时默认查询前一天数据 |
| notifyUrl | String | 是 | https://3rd.example.com/stock/notify | 结果回调地址。查询结果生成后回调此地址,回调内容包含 requestId、文件下载链接、生成状态、失败原因 |
请求示例
{
"clientStoreSn": "SH001",
"sqbStoreSn": "1580000003443730",
"requestId": "req_001",
"startTime": "2026-01-01",
"endTime": "2026-01-31",
"notifyUrl": "https://3rd.example.com/stock/notify"
}
3. 响应参数
接口为异步受理,响应 data 为受理结果,导出结果文件与任务状态通过回调通知异步获取:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| data | Object | 是 | 受理结果,结构见 3.1 受理结果 |
3.1 受理结果
| 字段 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|
| requestId | String | 是 | req_001 | 与查询请求的 requestId 一致,用于关联导出结果 |
响应示例
{
"code": 0,
"message": "成功",
"data": {
"requestId": "req_001"
}
}
3.2 回调通知(notifyUrl)
查询结果生成后,开放平台向请求中的 notifyUrl 发起回调通知:生成成功时携带结果文件下载链接,失败时携带失败原因。
回调请求(开放平台 → 开发者)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| msgId | String | 是 | 消息 ID,平台生成,唯一标识,重试时不变,用于幂等去重 |
| requestId | String | 是 | 与查询请求的 requestId 一致,用于关联查询结果 |
| clientStoreSn | String | 是 | 客户门店号,与查询请求一致,便于多任务关联 |
| downloadUrls | Object | 否 | 结果文件下载链接集合,生成成功时返回,各链接有效期 24 小时,结构见下方说明 |
| status | String | 是 | 生成状态,枚举见商品枚举附录 |
| remark | String | 否 | 失败原因,生成失败时返回 |
downloadUrls 结构说明
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| detailUrl | String | 是 | 库存流水明细文件下载链接 |
| movementUrl | String | 是 | 库存movement 文件下载链接 |
回调请求示例
{
"msgId": "MSG20260101120000001",
"requestId": "req_001",
"clientStoreSn": "SH001",
"downloadUrls": {
"detailUrl": "https://files.3rd.example.com/stock/2026-01-01/req_001_detail.csv",
"movementUrl": "https://files.3rd.example.com/stock/2026-01-01/req_001_movement.csv"
},
"status": "SUCCESS",
"remark": null
}
回调验签
回调请求与主动调用接口复用同一套签名鉴权规范(见鉴权与签名):签名参数通过请求头 X-AccessKey、X-Timestamp、X-Nonce、X-Signature 携带,接收方需使用自身 accessSecret 验签,验签不通过应丢弃该回调。防重放机制同样适用(X-Timestamp 与服务器时间差 ≤ 5 分钟,X-Nonce 5 分钟内不可重复使用)。
回调响应(开发者 → 开放平台)
回调必须遵循推送与回调机制,尤其是其中的响应要求(HTTP 200、Content-Type: application/json、Body 为 {"status": "success"}、3 秒内响应)为强制项,不满足即视为回调失败并触发重试;重试策略、幂等处理与消息兼容机制同见该文件。
4. 导出文件内容
导出文件包含两个文件:库存流水 movement 文件(Excel)与库存流水明细文件(CSV),分别对应回调 downloadUrls 中的 movementUrl 与 detailUrl。
4.1 库存流水 movement 文件(Excel)
每行一条商品的库存 movement 记录,字段如下:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| sqbStoreSn | String | 是 | 收钱吧门店号 |
| clientStoreSn | String | 是 | 客户门店号 |
| spuId | String | 是 | 商品 id |
| clientSpuId | String | 是 | 客户商品 id |
| title | String | 是 | 商品标题 |
| skuId | String | 是 | 规格 id |
| clientSkuId | String | 是 | 客户规格 id |
| skuName | String | 是 | 规格名称 |
| openingDate | String | 是 | 期初日期,格式 yyyy-MM-dd |
| openingStock | BigDecimal | 是 | 期初库存 |
| stockIncrease | BigDecimal | 是 | 库存增加 |
| stockDecrease | BigDecimal | 是 | 库存减少 |
| closingDate | String | 是 | 期末日期,格式 yyyy-MM-dd |
| closingStock | BigDecimal | 是 | 期末库存 |
示例(10 条)
| sqbStoreSn | clientStoreSn | spuId | clientSpuId | title | skuId | clientSkuId | skuName | openingDate | openingStock | stockIncrease | stockDecrease | closingDate | closingStock |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1580000003443730 | SH001 | 9990418 | SPU1001 | 统一老坛泡椒面 | 9990418 | SKU1001 | 默认 | 2026-01-01 | 50 | 20 | 5 | 2026-01-31 | 65 |
| 1580000003443730 | SH001 | 9990099 | SPU1002 | 伊利纯牛奶250ml | 9990099 | SKU1002 | 默认 | 2026-01-01 | 80 | 30 | 25 | 2026-01-31 | 85 |
| 1580000003443730 | SH001 | 9990111 | SPU1003 | 可口可乐330ml | 9990111 | SKU1003 | 330ml | 2026-01-01 | 100 | 50 | 40 | 2026-01-31 | 110 |
| 1580000003443730 | SH001 | 9990122 | SPU1004 | 乐事薯片原味 | 9990122 | SKU1004 | 原味 | 2026-01-01 | 45 | 15 | 20 | 2026-01-31 | 40 |
| 1580000003443730 | SH001 | 9990133 | SPU1005 | 双汇王中王火腿肠 | 9990133 | SKU1005 | 默认 | 2026-01-01 | 60 | 20 | 18 | 2026-01-31 | 62 |
| 1580000003443730 | SH001 | 9990144 | SPU1006 | 农夫山泉550ml | 9990144 | SKU1006 | 550ml | 2026-01-01 | 200 | 60 | 55 | 2026-01-31 | 205 |
| 1580000003443730 | SH001 | 9990155 | SPU1007 | 奥利奥原味夹心饼干 | 9990155 | SKU1007 | 原味 | 2026-01-01 | 40 | 12 | 15 | 2026-01-31 | 37 |
| 1580000003443730 | SH001 | 9990166 | SPU1008 | 青岛啤酒500ml | 9990166 | SKU1008 | 500ml | 2026-01-01 | 90 | 30 | 35 | 2026-01-31 | 85 |
| 1580000003443730 | SH001 | 9990177 | SPU1009 | 中华健齿白牙膏120g | 9990177 | SKU1009 | 默认 | 2026-01-01 | 25 | 10 | 6 | 2026-01-31 | 29 |
| 1580000003443730 | SH001 | 9990188 | SPU1010 | 康师傅香辣牛肉面 | 9990188 | SKU1010 | 默认 | 2026-01-01 | 30 | 10 | 8 | 2026-01-31 | 32 |
4.2 库存流水明细文件(CSV)
导出文件为 CSV 格式,每行一条库存变更流水记录,由库存流水字段与商品信息字段拼接成宽表:
extra(Map)、extendBarcodes(List)等复合类型字段,以 JSON 字符串形式输出。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | Long | 是 | 库存流水 id |
| stockId | String | 是 | 库存 id |
| sqbStoreId | String | 是 | 收钱吧门店 id |
| sqbStoreSn | String | 是 | 收钱吧门店号 |
| clientStoreSn | String | 是 | 客户门店号 |
| bizScene | String | 是 | 业务场景,枚举见商品枚举附录 |
| bizType | Integer | 是 | 业务类型,枚举见商品枚举附录 |
| bizSn | String | 否 | 业务单号(订单号、入库单号等) |
| operatorId | String | 否 | 操作员 id |
| before | BigDecimal | 是 | 变更前库存值 |
| after | BigDecimal | 是 | 变更后库存值 |
| change | BigDecimal | 是 | 变化量(带符号,正增负减) |
| changeType | Integer | 是 | 库存变更类型,枚举见商品枚举附录 |
| extra | Map | 否 | 扩展信息(如来源 source、备注 remark、商品名等) |
| ctime | Long | 是 | 创建时间(毫秒) |
| mtime | Long | 是 | 更新时间(毫秒) |
| spuId | String | 是 | 商品 id |
| clientSpuId | String | 是 | 客户商品 id |
| skuId | String | 是 | 规格 id |
| clientSkuId | String | 是 | 客户规格 id |
| skuName | String | 是 | 规格名称 |
| title | String | 是 | 商品标题 |
| pinyin | String | 否 | 首字母拼音 |
| barcode | String | 否 | 条码 |
| extendBarcodes | List | 否 | 副条码 |
| productType | Integer | 是 | 商品类型,枚举见商品枚举附录 |
| saleType | Integer | 是 | 售卖类型,枚举见商品枚举附录 |
| unit | String | 是 | 单位 |
| coverImage | String | 否 | 封面图 URL |
| description | String | 否 | 商品描述 |
| sysCode | String | 否 | 简码 |
| pluCode | Long | 否 | 条码秤 PLU 码 |
| saleStatus | Integer | 是 | 售卖状态,枚举见商品枚举附录 |
| status | Integer | 是 | 状态,枚举见商品枚举附录 |
| categoryId | String | 否 | 分类 id |
| supplierId | Long | 否 | 供应商 id |
| brandId | Long | 否 | 品牌 id |
示例(10 条)
extra、extendBarcodes等复合字段以 JSON 字符串形式输出,字段含逗号/引号时按 CSV 规则使用双引号包裹转义。
id,stockId,sqbStoreId,sqbStoreSn,clientStoreSn,bizScene,bizType,bizSn,operatorId,before,after,change,changeType,extra,ctime,mtime,spuId,clientSpuId,skuId,clientSkuId,skuName,title,pinyin,barcode,extendBarcodes,productType,saleType,unit,coverImage,description,sysCode,pluCode,saleStatus,status,categoryId,supplierId,brandId
10001,stock1001,store001,1580000003443730,SH001,retail,1,ORDER20260101001,OP001,50,48,-2,3,"{""source"": ""POS"", ""remark"": ""销售出库""}",1767571200000,1767571200000,9990418,SPU1001,9990418,SKU1001,默认,统一老坛泡椒面,tyltjpm,6925303797515,[],1,1,袋,,,JPM001,9990418,1,0,352984,50001,60001
10002,stock1001,store001,1580000003443730,SH001,retail,4,PO20260102001,OP001,48,68,20,2,"{""source"": ""ERP"", ""remark"": ""采购入库""}",1767571201000,1767571201000,9990418,SPU1001,9990418,SKU1001,默认,统一老坛泡椒面,tyltjpm,6925303797515,[],1,1,袋,,,JPM001,9990418,1,0,352984,50001,60001
10003,stock1002,store001,1580000003443730,SH001,retail,3,ADJ20260102001,OP001,80,78,-2,1,"{""source"": ""MANUAL"", ""remark"": ""盘点调整""}",1767571202000,1767571202000,9990099,SPU1002,9990099,SKU1002,默认,伊利纯牛奶250ml,ylcnn,6907992822716,[],1,1,盒,,,,,1,0,352984,50002,60002
10004,stock1003,store001,1580000003443730,SH001,retail,1,ORDER20260103001,OP001,100,97,-3,3,"{""source"": ""POS"", ""remark"": ""销售出库""}",1767571203000,1767571203000,9990111,SPU1003,9990111,SKU1003,330ml,可口可乐330ml,kkkl,6922255800510,[],1,1,瓶,,,,,1,0,352985,50003,60003
10005,stock1004,store001,1580000003443730,SH001,retail,5,RO20260103001,OP001,45,42,-3,3,"{""source"": ""POS"", ""remark"": ""退货出库""}",1767571204000,1767571204000,9990122,SPU1004,9990122,SKU1004,原味,乐事薯片原味,lssp,6924743915235,[],1,1,袋,,,,,1,0,352986,50004,60004
10006,stock1005,store001,1580000003443730,SH001,retail,6,ST20260104001,OP001,60,60,0,4,"{""source"": ""STOCKTAKE"", ""remark"": ""盘点无差异""}",1767571205000,1767571205000,9990133,SPU1005,9990133,SKU1005,默认,双汇王中王火腿肠,shwz,6901389631250,[],1,1,根,,,,,1,0,352984,50005,60005
10007,stock1001,store001,1580000003443730,SH001,retail,1,ORDER20260104001,OP001,68,65,-3,3,"{""source"": ""POS"", ""remark"": ""销售出库""}",1767571206000,1767571206000,9990418,SPU1001,9990418,SKU1001,默认,统一老坛泡椒面,tyltjpm,6925303797515,[],1,1,袋,,,JPM001,9990418,1,0,352984,50001,60001
10008,stock1003,store001,1580000003443730,SH001,retail,4,PO20260105001,OP001,97,117,20,2,"{""source"": ""ERP"", ""remark"": ""采购入库""}",1767571207000,1767571207000,9990111,SPU1003,9990111,SKU1003,330ml,可口可乐330ml,kkkl,6922255800510,[],1,1,瓶,,,,,1,0,352985,50003,60003
10009,stock1002,store001,1580000003443730,SH001,retail,7,LOSS20260105001,OP001,78,76,-2,3,"{""source"": ""MANUAL"", ""remark"": ""过期报损""}",1767571208000,1767571208000,9990099,SPU1002,9990099,SKU1002,默认,伊利纯牛奶250ml,ylcnn,6907992822716,[],1,1,盒,,,,,1,0,352984,50002,60002
10010,stock1004,store001,1580000003443730,SH001,retail,1,ORDER20260105001,OP001,42,40,-2,3,"{""source"": ""POS"", ""remark"": ""销售出库""}",1767571209000,1767571209000,9990122,SPU1004,9990122,SKU1004,原味,乐事薯片原味,lssp,6924743915235,[],1,1,袋,,,,,1,0,352986,50004,60004
5. 完整请求示例
5.1 请求示例
{
"clientStoreSn": "SH001",
"requestId": "req_001",
"startTime": "2026-01-01",
"endTime": "2026-01-31",
"notifyUrl": "https://3rd.example.com/stock/notify"
}
5.2 响应示例
{
"code": 0,
"message": "成功",
"data": {
"requestId": "req_001"
}
}
6. 错误码
本接口业务错误码(51xxx 段)
| 错误码 | 含义 | 处理建议 |
|---|---|---|
| 51001 | sqbStoreSn 与 clientStoreSn 映射不匹配 |
校验传入的收钱吧门店号,确保与客户门店的映射关系一致 |
| 51002 | 查询日期范围超限 | 日期跨度不超过 31 天,且仅支持查询近 6 个月内的数据 |
完整错误码表见错误码。接口响应中的
code为统一包装结果码,业务数据在data中体现。