订单查询
仅提供已授权的门店数据服务:调用时通过
clientStoreSn定位门店,平台校验该门店已完成授权(客户门店与收钱吧门店映射);未授权门店的订单数据无法查询。
1. 接口说明
商家可以通过此接口主动查询订单数据。
| 项目 | 说明 |
|---|---|
| 接口路径 | POST /open-api/v1/order/query |
| 鉴权方式 | HMAC-SHA256,见鉴权与签名 |
2. 请求参数
| 字段 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|
| clientStoreSn | String | 是 | SH001 | 客户门店号,平台据此查询映射的收钱吧门店并校验授权,仅返回该门店下的订单 |
| sqbStoreSn | String | 否 | 1580000003443730 | 收钱吧门店号,可不传;如传则优先使用 sqbStoreSn,平台会校验其与 clientStoreSn 的映射关系 |
| orderSn | String | 是 | 210000001000001 | 收钱吧智慧门店订单号。如果没有收钱吧智慧门店订单号,请订阅订单消息推送。 |
| requestId | String | 是 | req_001 | 请求标识,必传。本接口为查询类接口,requestId 用于请求链路追踪与日志关联,不参与幂等去重,见幂等机制 |
3. 响应参数
3.1 订单基础信息
| 字段 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|
| orderSn | String | 是 | 210000001000001 | 订单号 |
| orderType | String | 是 | QR_FOOD | 订单类型,枚举见订单枚举附录 |
| orderStatus | String | 是 | FINISHED | 订单状态,枚举见订单枚举附录 |
| orderSeq | String | 否 | 0001 | 商家当日订单序号 |
| subject | String | 否 | 牛肉拉面 | 订单标题 |
| tableId | String | 否 | T001 | 桌子 id |
| tableNo | String | 否 | A01 | 桌号 |
| orderSource | String | 否 | 订单来源,枚举见订单枚举附录 | |
| cashierId | String | 否 | 51180ee7-3c49-4591-99bb-26fa4c04b321 | 收银员 id |
| cashierName | String | 否 | 收银员 | 收银员姓名 |
| originalAmount | Long | 是 | 6300 | 订单金额 |
| merchantDiscountTotalAmount | Long | 否 | 500 | 商家优惠金额 |
| platformServiceAmount | Long | 否 | 300 | 平台服务费 |
| packageAmount | Long | 否 | 100 | 打包费 |
| deliveryAmount | Long | 否 | 300 | 配送费 |
| expectedIncomeAmount | Long | 是 | 5500 | 预计收入 |
| refundAmount | Long | 否 | 0 | 退款金额 |
| goods | Array | 是 | 详见下方商品数据结构定义 | |
| discounts | Array | 否 | 详见下方优惠数据结构定义 | |
| payments | Array | 否 | 详见下方支付数据结构定义 | |
| remark | String | 否 | 不吃香菜 | 订单备注 |
| ctime | Long | 是 | 1700318325713 | 下单时间 |
金额补充说明
- 订单金额 = 商品总金额 + 打包费 + 配送费
- 预计收入 = 订单金额 - 商家优惠金额 - 平台服务费
- 金额单位均为"分"
- 上述金额字段为空(
null)时按0参与计算
3.2 商品数据
| 字段 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|
| spuId | String | 是 | 9990418 | 商品 id |
| url | String | 否 | https://example.com/noodles.jpg | 商品图片 url |
| name | String | 否 | 牛肉拉面 | 商品名称 |
| originalAmountPer | Long | 是 | 800 | 商品单价,单位分 |
| effectiveAmountPer | Long | 是 | 800 | 商品实付单价,单位分 |
| totalAmount | Long | 否 | 1600 | 商品总金额,单位分 |
| discountCount | String | 否 | 2 | 享受优惠的商品数量,最多 3 位小数 |
| count | String | 否 | 2 | 商品数量,最多 3 位小数 |
| refundCount | String | 否 | 0 | 退款商品数量,最多 3 位小数 |
| spuType | String | 否 | PRODUCT | 商品类型,枚举见订单枚举附录 |
| skuType | String | 否 | SINGLE | sku 类型,枚举见订单枚举附录 |
| packageGroupId | String | 否 | 商品所属分组 id | |
| packageGroupName | String | 否 | 商品所属分组名称 | |
| spec | String | 否 | 大份 | 商品规格 |
| specInfo | Object | 否 | 商品规格信息,结构见下方说明 | |
| attributeInfos | Array | 否 | 商品属性信息(口味做法),结构见下方说明 | |
| materials | Array | 否 | 加料信息,结构见下方说明 | |
| packageGoods | Array | 否 | 套餐内商品信息,结构同商品数据 | |
| saleUnit | String | 否 | 份 | 售卖单位 |
| unitType | String | 否 | NUMBER | 单位类型,枚举见订单枚举附录 |
| refPayType | String | 否 | PAY | 商品关联的订单操作类型,枚举见订单枚举附录 |
| orderTime | Long | 否 | 1700318325713 | 下单时间,毫秒时间戳 |
| processStatus | String | 否 | ACCEPTED | 菜品处理状态,枚举见订单枚举附录 |
| extraInfo | Object | 否 | 额外信息(Map) | |
| extraMap | Object | 否 | 预留字段(Map) | |
| goodsDiscountType | String | 否 | ACTIVITY | 优惠类型,枚举见订单枚举附录 |
| discountAmount | Long | 否 | 100 | 优惠金额,单位分 |
| categoryId | String | 否 | 352984 | 类目 id |
| goodsTag | Long | 否 | 0 | 商品 tag |
| ctime | Long | 否 | 1700318325713 | 创建时间,毫秒时间戳 |
| mtime | Long | 否 | 1700318325713 | 更新时间,毫秒时间戳 |
商品数据补充说明
商品总金额 = 商品单价 × 商品数量 + 加料总金额 - 商品优惠总金额
对象字段结构说明
specInfo(商品规格信息):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | String | 规格 id |
| name | String | 规格名称 |
| price | Long | 规格价格,单位分 |
| attachedInfo | String | 附加信息 |
attributeInfos(商品属性信息,口味做法):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | String | 属性 id |
| title | String | 口味做法标题 |
| name | String | 口味做法内容 |
| seq | Long | 顺序 |
| price | Long | 价格,单位分 |
materials(加料信息):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | String | 加料 id |
| name | String | 加料名称 |
| price | Long | 加料价格,单位分 |
| number | String | 加料数量 |
| source | Long | 加料来源 |
3.3 优惠数据
| 字段 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|
| name | String | 是 | 全场折扣 | 优惠名称 |
| discountType | Long | 是 | 1 | 活动优惠类型,枚举见订单枚举附录 |
| amount | Long | 是 | 120 | 优惠金额 |
3.4 支付数据
| 字段 | 类型 | 必填 | 示例值 | 说明 |
|---|---|---|---|---|
| clientSn | String | 否 | 210000001000001 | 智慧经营交易订单号 |
| transSn | String | 是 | 7894259236461446 | 支付订单号 |
| tradeNo | String | 否 | 平台订单号 | |
| refClientSn | String | 否 | 退款关联智慧经营交易订单号 | |
| refundBatchNo | String | 否 | 退款批次号 | |
| totalAmount | Long | 否 | 6300 | 订单总额 |
| receiveAmount | Long | 否 | 6000 | 实收总额 |
| buyerPayAmount | Long | 否 | 6000 | 用户实付金额 |
| discountAmount | Long | 否 | 300 | 优惠金额 |
| channelAssistDiscount | Long | 否 | 0 | 渠道补贴金额 |
| refundAmount | Long | 否 | 0 | 订单已退款总额 |
| cashBackAmount | Long | 否 | 0 | 找零金额 |
| chargeGiftAmount | Long | 否 | 0 | 充值赠送金额 |
| payDiscountAmount | Long | 否 | 0 | 支付优惠金额 |
| profitSharingAmount | Long | 否 | 0 | 分账金额 |
| payWay | String | 是 | 支付通道,枚举见订单枚举附录 | |
| subPayWay | String | 是 | QRCODE | 子支付通道,枚举见订单枚举附录 |
| payType | String | 否 | 支付类型,枚举见订单枚举附录 | |
| orderPayStatus | String | 否 | 交易状态,枚举见订单枚举附录 | |
| payerLogin | String | 否 | 付款人账号 | |
| payerUid | String | 否 | 付款人 id | |
| tradeTime | Long | 否 | 1700318325713 | 交易时间戳 |
| payTime | Long | 是 | 1702276912510 | 支付时间戳 |
| cashierId | String | 否 | 收银员 id |
4. 完整请求示例
4.1 请求示例
{
"clientStoreSn": "SH001",
"orderSn": "210000001000001",
"requestId": "req_001"
}
4.2 响应示例
{
"code": 0,
"message": "成功",
"data": {
"orderSn": "2100006149241454",
"orderType": "RETAIL",
"orderStatus": "PARTIAL_REFUNDED",
"ctime": 1786590141819,
"remark": "",
"originalAmount": 2400,
"merchantDiscountTotalAmount": 0,
"expectedIncomeAmount": 2400,
"refundAmount": 1600,
"goods": [
{
"spuId": "9990418",
"name": "统一老坛泡椒面",
"saleUnit": "份",
"originalAmountPer": 800,
"effectiveAmountPer": 800,
"totalAmount": 1600,
"count": 2,
"refundCount": 1,
"spuType": "PRODUCT",
"skuType": "SINGLE",
"specInfo": {
"id": "9990418",
"name": null,
"price": 800,
"attachedInfo": null
},
"refPayType": "PAY",
"processStatus": "PART_REFUNDED",
"discountAmount": 0,
"categoryId": "352984",
"extraMap": {
"localGoodsId": "9990418_1786590131719",
"userName": "收银员",
"saleWeight": 2,
"itemSort": 758,
"orderTimeStamp": "1786590141819",
"unitType": "NUMBER",
"barcode": "6925303797515",
"originGoodsPrice": 800
}
},
{
"spuId": "9990099",
"name": "康师傅超爽桶KING香辣牛肉面143g",
"saleUnit": "桶",
"originalAmountPer": 800,
"effectiveAmountPer": 800,
"totalAmount": 800,
"count": 1,
"refundCount": 1,
"spuType": "PRODUCT",
"skuType": "SINGLE",
"specInfo": {
"id": "9990099",
"name": null,
"price": 800,
"attachedInfo": null
},
"refPayType": "PAY",
"processStatus": "REFUNDED",
"discountAmount": 0,
"categoryId": "352984",
"extraMap": {
"localGoodsId": "9990099_1786590128804",
"userName": "收银员",
"saleWeight": 1,
"itemSort": 439,
"orderTimeStamp": "1786590141819",
"unitType": "NUMBER",
"barcode": "6900873000470",
"originGoodsPrice": 800
}
}
],
"discounts": [],
"payments": [
{
"clientSn": "2300004070708804",
"transSn": "7895217130477124",
"tradeNo": "4200003142202608137239737952",
"totalAmount": 2400,
"receiveAmount": 2400,
"buyerPayAmount": 2400,
"discountAmount": 0,
"channelAssistDiscount": 0,
"refundAmount": 1600,
"cashBackAmount": 0,
"chargeGiftAmount": 0,
"payWay": "WECHAT",
"subPayWay": "BARCODE",
"payType": "PAYMENT",
"orderPayStatus": "PARTIAL_REFUNDED",
"payerLogin": "oc5mSjtKoPs2dn2zklO-kWh3RPuU",
"tradeTime": 1786590142000,
"payTime": 1786590144000,
"cashierId": "51180ee7-3c49-4591-99bb-26fa4c04b321"
},
{
"clientSn": "2300004071058534",
"transSn": "7895217130479698",
"tradeNo": "WX260813110224000646447032",
"refClientSn": "2300004070708804",
"refundBatchNo": "20260813110241919",
"totalAmount": 1600,
"receiveAmount": 1600,
"buyerPayAmount": 1600,
"discountAmount": 0,
"channelAssistDiscount": 0,
"refundAmount": 1600,
"cashBackAmount": 0,
"chargeGiftAmount": 0,
"payWay": "WECHAT",
"subPayWay": null,
"payType": "REFUND",
"orderPayStatus": "PARTIAL_REFUNDED",
"payerLogin": "oc5mSjtKoPs2dn2zklO-kWh3RPuU",
"tradeTime": 1786590162000,
"payTime": 1786590163000,
"cashierId": "51180ee7-3c49-4591-99bb-26fa4c04b321"
}
]
}
}
5. 错误码列表
| 错误码 | 含义 |
|---|---|
| 50001 | 订单不存在 |
完整错误码表见错误码。接口响应中的
code为统一包装结果码,业务数据在data中体现。
6. AI 快速接入提示词
将下方提示词连同当前项目代码库提供给任意 AI 编程工具,即可快速完成订单查询接口的接入。AI 会先识别项目所用语言、框架与既有规范,再依据收钱吧官方接口及签名文档实现请求、签名、配置和测试;适用于不同技术栈,无需预设 Java 或固定项目目录。使用前请在安全的配置渠道提供脱敏后的必要参数,切勿将真实密钥写入提示词、代码或日志。
你是一名经验丰富的后端集成工程师。请在“当前项目”的既有技术栈、代码规范和部署方式下,接入并验证收钱吧智慧开放平台的“订单查询”接口。不要假定编程语言、框架、HTTP 客户端、配置系统或目录结构;先调研当前项目,再选择与项目一致的实现方式。
## 业务目标
根据门店标识和订单号查询订单详情,并交付一个可安全配置、可自动验证、可供业务代码复用的接口适配能力。
## 接口信息
- 网关:`https://gateway-smart.shouqianba.com`
- 方法与路径:`POST /open-api/v1/order/query`
- 官方文档:
- 鉴权与签名:`https://doc.shouqianba.com/docs-for-smart/公共定义/鉴权与签名.html`
- 订单查询:`https://doc.shouqianba.com/docs-for-smart/接口说明/订单/订单查询.html`
## 工作步骤
1. 先阅读当前项目中与 OpenAPI、HTTP 请求、配置加载、密钥管理、日志、错误处理和测试有关的现有代码;复用已有约定,不要为了本接口引入无必要的新框架或重构无关代码。
2. 阅读上述官方文档,先在实施说明中写清“待签名字符串/字节的构造规则、签名算法、编码和请求头含义”。不要凭经验推断签名格式;文档与旧代码冲突时,以官方文档为准并说明差异。
3. 实现订单查询客户端/适配层,并将业务参数、认证参数、序列化、签名、网络调用和响应解析合理分离,便于后续复用与测试。
## 请求与签名硬性要求
- 请求体使用 JSON,至少传入 `clientStoreSn`、`orderSn`、`requestId`;按官方文档支持需要的其他字段(例如 `sqbStoreSn`)。
- `requestId` 必须每次唯一。
- 按官方规范生成并发送 `X-AccessKey`、`X-Timestamp`(毫秒级)、`X-Nonce`(8 位字母数字随机串)和 `X-Signature`(小写十六进制)。
- 使用官方规定的 HMAC-SHA256 签名规则。参与签名的原始 JSON 请求体必须与最终实际发送的字节完全一致;签名完成后不得重新格式化、排序或序列化请求体。
- 不得继续使用旧式 `access_token` 流程,除非官方当前文档明确要求。
## 配置与安全
- 所有敏感和环境相关值必须由当前项目的标准安全配置机制注入(例如环境变量、密钥服务、部署平台 Secret 或本地忽略的配置文件),不得硬编码。
- 至少支持以下逻辑配置项:AccessKey、AccessSecret、clientStoreSn、orderSn;并按需支持 sqbStoreSn、网关/接口地址覆盖。
- 配置示例、日志、异常、测试输出、提交记录和文档中都不得出现真实 AccessSecret、令牌、门店号或订单数据。
- 必填配置缺失时,应给出可操作的报错/跳过信息,绝不能使用任何默认真实凭据。
## 验收与测试
1. 增加不依赖网络的签名单元测试,使用固定测试向量验证 HMAC-SHA256 和小写十六进制编码。
2. 增加可选的集成测试或可执行调用示例;只有在必填配置齐全时才实际请求平台,缺失时安全跳过或明确提示。
3. 成功响应至少校验 `code == 0`、返回订单号与请求的 `orderSn` 一致,并按官方响应结构校验商品明细存在。
4. 对网络超时、非成功状态、签名/鉴权失败、响应 JSON 异常和业务错误码提供与当前项目一致的错误处理。
5. 执行当前项目可用的相关检查和测试。
## 最终交付格式
请输出:
1. 采用的技术栈与复用的项目既有组件;
2. 修改/新增的文件及各自职责;
3. 脱敏的配置项说明和调用示例;
4. 签名构造规则摘要;
5. 已执行的验证命令与结果,以及因现有项目问题无法验证的部分;
6. 任何需要人工补充的非敏感配置或权限。
实施范围仅限该订单查询能力及其必要测试,不修改无关业务逻辑。