# 91卡券查询订单接口 ## 1. 接口说明 本文档为当前项目对接 `91卡券` 的正式技术文档,用于提交客服审核。 本接口用于在异步卡密下单后,由 `91卡券` 主动查询订单状态与最终卡密内容。 当前项目的最终交付物不是传统卡号密码,而是: - 我方系统生成的**领取链接**; - 该链接将作为最终卡密内容,通过 `cards` 字段返回给 `91卡券`; - `91卡券` 再使用自动发货能力,将该领取链接展示给买家。 ## 2. 请求方向 - `91卡券平台 -> 接入方系统` ## 3. 请求 URL 请按以下地址配置: ```text POST https://你的域名/api/v1/open/91/orders/query ``` ## 4. 请求方式 - `POST` - `Content-Type: application/json;charset=utf-8` ## 5. 签名规则 签名规则采用 2.签名规则示例 中的约定: - 仅使用请求 JSON body 中实际传入的参数参与签名; - 除 `sign` 外,所有 body 参数按字段名 ASCII 升序排序; - 使用 `key=value&key=value` 方式拼接; - 前后拼接商户密钥; - 取 `MD5`,输出 32 位大写字符串; - 已传入的空值参数参与签名; - 不要额外加入 `userId`、商户号、内部配置项或未传入的可选字段。 ## 6. 请求参数 | 参数名 | 必填 | 类型 | 说明 | | --- | --- | --- | --- | | `orderNo` | 是 | string | 商家订单号。 | | `timestamp` | 是 | long | 10 位秒级 Unix 时间戳,用于请求时效校验。 | | `version` | 是 | string | 固定传 `1.0`。 | | `sign` | 是 | string | 签名。 | ## 7. 请求示例 ```json { "orderNo": "P91KS202605040001", "timestamp": 1777867260, "version": "1.0", "sign": "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" } ``` ## 8. MD5 源串示例 假设: - 商户密钥为:`your_secret_key` 则源串示例如下: ```text your_secret_keyorderNo=P91KS202605040001×tamp=1777867260&version=1.0your_secret_key ``` ## 9. 业务处理规则 我方系统收到查询请求后,按以下规则返回: 1. 校验签名与时间戳; 2. 根据 `orderNo` 查询内部订单; 3. 若订单存在但商品履约配置尚未补齐,返回 `orderStatus = 10`; 4. 若订单存在但领取链接尚未准备完成,返回 `orderStatus = 10`; 5. 若领取链接已生成,可交付,返回 `orderStatus = 20`; 6. 若订单无法履约,返回 `orderStatus = 30`; 7. 当返回 `20` 时,通过 `cards` 返回最终卡密内容。 ## 10. 响应参数 | 参数名 | 类型 | 必须返回 | 说明 | | --- | --- | --- | --- | | `orderNo` | string | 必须返回 | 商家订单号,来源 `91卡券` 下单请求。 | | `outTradeNo` | string | 必须返回 | 我方系统内部订单号。 | | `orderStatus` | int | 必须返回 | 订单状态。`10`:处理中;`20`:成功;`30`:失败。 | | `failCode` | int | 失败时建议返回 | 失败代码。可以不返回该字段,但不要返回 `null`。 | | `failReason` | string | 失败时建议返回 | 失败原因。 | | `orderCost` | decimal(14,4) | 成功时建议返回 | 订单总成本,单位:元。 | | `cards` | string | `orderStatus = 20` 时必须 | 卡密数据加密串。当前项目通过该字段返回领取链接。 | | `cards[0].cardNo` | string | 成功时必须 | 最终交付的领取链接,格式为 `https://你的域名/#/claim/{token}`。 | | `cards[0].cardPwd` | string | 可选 | 当前场景固定为空字符串。 | | `cards[0].expireTime` | string | 可选 | 领取链接过期时间,支持 `yyyy-MM-dd HH:mm:ss` 或 10 位秒级 Unix 时间戳。 | | `cards[0].jumpLink` | string | 可选 | 与 `cardNo` 保持一致,用于兼容链接展示场景。 | ## 11. cards 原始结构约定 由于已确认允许将链接作为最终卡密内容展示给买家,当前项目约定: - `cardNo`:直接放领取链接; - `cardPwd`:留空; - `expireTime`:放领取链接过期时间; - `jumpLink`:与 `cardNo` 一致。 原始结构示例如下: ```json [ { "cardNo": "https://你的域名/#/claim/abc123xyz", "cardPwd": "", "expireTime": "2026-05-05 12:00:00", "jumpLink": "https://你的域名/#/claim/abc123xyz" } ] ``` 若 `buyNum > 1`,则 `cards` 原始结构中返回多个卡项,每个卡项对应一个独立领取链接。 ## 12. 响应示例 ### 12.1 处理中 ```json { "code": 200, "message": "接口调用成功", "data": { "orderNo": "P91KS202605040001", "outTradeNo": "OS202605040001", "orderStatus": 10, "failCode": 0, "failReason": "", "orderCost": 0.0000, "cards": "" } } ``` ### 12.2 查询成功 ```json { "code": 200, "message": "接口调用成功", "data": { "orderNo": "P91KS202605040001", "outTradeNo": "OS202605040001", "orderStatus": 20, "failCode": 0, "failReason": "", "orderCost": 0.0000, "cards": "加密后的cards字符串" } } ``` `cards` 解密前原始结构示例: ```json [ { "cardNo": "https://你的域名/#/claim/abc123xyz", "cardPwd": "", "expireTime": "2026-05-05 12:00:00", "jumpLink": "https://你的域名/#/claim/abc123xyz" } ] ``` ### 12.3 查询失败 ```json { "code": 200, "message": "接口调用成功", "data": { "orderNo": "P91KS202605040001", "outTradeNo": "OS202605040001", "orderStatus": 30, "failCode": 1204, "failReason": "商品未配置或订单无法履约" } } ``` ## 13. 对接说明 - 本接口是 `91卡券` 自动发货的关键接口; - 当返回 `orderStatus = 20` 时,表示我方已准备好最终交付内容; - 当返回 `orderStatus = 10` 时,可能是履约任务正在准备,也可能是后台正在补齐 `productNo` 对应的履约配置; - 最终交付内容是领取链接,不是传统卡号密码; - 领取链接域名按实际部署域名配置; - 买家收到链接后,会进入我方系统领取页完成后续快手核销与履约流程; - 建议 `91卡券` 侧确认: - `cards.cardNo` 可直接展示完整链接; - `jumpLink` 可按链接字段兼容展示; - 查询频率按异步商品标准轮询配置。