Files
order_site/docs/91卡券/3.异步卡密下单.md
yml2213 ccb5b6f4d6 docs: 清理过时文档(以代码为准)
删除(整篇已被代码淘汰 / 重复副本 / 与仓库无关):
- cloudflared_tunnel.txt:全仓无 cloudflared 配置,个人终端记录,无任何引用
- 履约配置/工程债-lewan拆分与短链.md:文中 services/kuaishou-cloud 与 kuaishou-cloud-executor 已删除
- 履约配置/快手Cloud领取mock.md:mock:claim / mock:feifei 与 dev-mock 卡片已移除(只剩 mock:open91)
- 行业电子凭证/解决方案/技术方案/1.基础技术.md(+ 其孤立 image.png):0.基础技术.md 的 75 行截断副本
- 寄卖库存功能设计与实施方案.md:手工入库已 409 停用、收集链接表已随 079 删除、统计看板未实现
- 服务器图片迁移到阿里云OSS.md:MinIO→OSS 迁移已完成(生产 STORAGE_MODE=oss)
- pgBackRest备份方案分析.md:全仓无 pgBackRest 落地痕迹,文档自述暂缓实施
- finance-implementation-plan.md:财务模块已落地(072 迁移 / RBAC / 页面接口),已实现部分与代码重复
  (未落地的二期三期路线图可从本提交的历史版本取回)

改写为与代码一致(已下线通道不再当作现行能力):
- 履约配置/多发货平台与电子凭证整体链路.md:kuaishou-cloud / kuaishou-feifei 标注为已下线 legacy stub,
  现行自动通道 affiliate-dash、人工 manual_dispatch;核销时机与券表按实现校正
- 履约配置/{UID领取与旧单兼容, open91请求, TypeScript类型收紧}.md:lewan/feifei/cloudtentacles 表述改为
  现行 affiliate-dash 链路;normalize 具名类型 KuaishouCloudFlow/FeifeiFlow → AffiliateDashFlow
-  affiliate_dash_发货平台/affiliate-dash对接.md:§13/§14/§19/§21/§24/§25 的已删文件与已下线通道引用校正,
  §21/§22 加「当时快照 / 落地后现状」横幅,回调去重表按 013_affiliate_dash_webhook_events.sql 改写
- 91卡券/{3.异步卡密下单, 5.当前项目对接配置, 6.开发设计}.md:删掉不存在的后台入口、
  cloudtentacles/kuaishou_ct_assisted 依赖、cardsEncoding 与 .js 代码落点校正
- 行业电子凭证/技术方案.md:checklist 指向不存在的 测试用例.md → gen-test-cases.ts + 5.测试指南.md
- 履约配置/cloudtentacles发货平台.md:补「本仓库未接入该通道」说明(保持外部参考)
- 部署启动与数据库重建.md:补齐生产必需变量 APP_DOMAIN / CORS_ALLOWED_ORIGINS / STORAGE_MODE / STORAGE_OSS_*

其它:
- README.md:迁移序号范围 002~009 → 002~080
- 寄卖系统迁移079上库前检查.sql:第 2 段注释按批次 Y 的自动去重更新;新增 2.1「重复退款风险」只读排查
  (已在一次性 PostgreSQL 16 上跑通 001→080 迁移:整份脚本 exit=0,脏数据下 2/2.1 均按预期报警)
- 寄卖系统优化方案.md:删掉链路图里已下线的「客服手工录入」,去掉指向已删设计稿的引用
2026-09-17 16:57:27 +08:00

5.3 KiB
Raw Permalink Blame History

91卡券异步卡密下单接口

1. 接口说明

本文档为当前项目对接 91卡券 的正式技术文档,用于提交客服审核。

本项目对接场景说明:

  • 91卡券 负责售卖与自动发货;
  • 我方系统负责接收订单、创建任务、生成领取链接;
  • 该领取链接会在后续查询订单接口中,作为最终卡密内容返回给 91卡券;
  • 91卡券 再将该链接自动发给买家。

注意:

  • 本接口为异步卡密下单接口;
  • 首次下单成功受理后,返回 orderStatus = 10;
  • 不会在该接口首次响应中直接返回最终领取链接;
  • 最终链接请通过“查询订单接口”获取。

2. 请求方向

  • 91卡券平台 -> 接入方系统

3. 请求 URL

请按以下地址配置:

POST https://你的域名/api/v1/open/91/orders/create

4. 请求方式

  • POST
  • Content-Type: application/json;charset=utf-8

5. 签名规则

签名规则采用 签名规则示例 中的约定:

  • 仅使用请求 JSON body 中实际传入的参数参与签名;
  • 除 sign 外,所有 body 参数按字段名 ASCII 升序排序;
  • 使用 key=value&key=value 方式拼接;
  • 前后拼接商户密钥;
  • 取 MD5,输出 32 位大写字符串;
  • 已传入的空值参数参与签名;
  • 不要额外加入 userId、商户号、内部配置项或未传入的可选字段。

6. 请求参数

参数名 必填 类型 说明
orderNo 是 string 商家订单号,唯一,用于幂等处理。
productNo 是 string 接入方商品编号。建议与我方内部履约 SKU 一一对应。
buyNum 是 int 购买数量。
maxAmount 否 string 商家可接受最大成本金额。值为整单金额,非单价。若传值,则我方按该金额校验,超出时返回失败。
callbackUrl 否 string 由 91卡券 提供的回调地址。当前项目可接收但不依赖该字段完成主流程。
timestamp 是 long 10 位秒级 Unix 时间戳,用于请求时效校验。
version 是 string 固定传 1.0。
sign 是 string 签名。

7. 请求示例

{
  "orderNo": "P91KS202605040001",
  "productNo": "KS-CLOUD-SKU-001",
  "buyNum": 1,
  "maxAmount": "0.0000",
  "callbackUrl": "https://cb.example.com/notify/91/order",
  "timestamp": 1777867200,
  "version": "1.0",
  "sign": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

8. MD5 源串示例

假设:

  • 商户密钥为:your_secret_key

则源串示例如下:

your_secret_keybuyNum=1&callbackUrl=https://cb.example.com/notify/91/order&maxAmount=0.0000&orderNo=P91KS202605040001&productNo=KS-CLOUD-SKU-001&timestamp=1777867200&version=1.0your_secret_key

9. 业务处理规则

我方系统收到请求后,按以下规则处理:

  1. 校验签名与时间戳;
  2. 按 orderNo 做幂等;
  3. 将订单作为 91卡券 来源订单写入当前项目;
  4. 若 productNo 已映射到 affiliate-dash 履约商品,则创建履约任务;
  5. 若 productNo 尚未配置,则订单进入后台“待补全”队列,由运营补齐履约配置后重试生成任务;
  6. 若传入 maxAmount,则校验成本是否超限;
  7. 履约任务生成后,生成当前项目领取链接,例如:https://你的域名/#/claim/{token};
  8. 首次响应返回处理中状态,由 91卡券 后续调用查询订单接口获取最终卡密内容。

10. 响应参数

参数名 类型 必须返回 说明
orderNo string 必须返回 商家订单号,来源 91卡券 下单请求。
outTradeNo string 成功时必须 我方系统内部订单号。
orderStatus int 成功时必须 订单状态。10:处理中;30:失败。
注意:当前接口为异步商品下单接口,首次响应不会返回 20。
orderCost decimal(14,4) 成功时可返回 订单总成本,单位:元。若当前阶段无法确认,可返回 0.0000。
cards string 非必须 当前阶段建议返回空字符串。最终卡密内容请在查询订单接口中返回。
failCode int 失败时可返回 失败代码。
failReason string 失败时可返回 失败原因。

11. 响应示例

11.1 受理成功

{
  "code": 200,
  "message": "接口调用成功",
  "data": {
    "orderNo": "P91KS202605040001",
    "outTradeNo": "OS202605040001",
    "orderStatus": 10,
    "orderCost": 0.0000,
    "cards": ""
  }
}

11.2 下单失败

{
  "code": 200,
  "message": "接口调用成功",
  "data": {
    "orderNo": "P91KS202605040001",
    "outTradeNo": "",
    "orderStatus": 30,
    "failCode": 1220,
    "failReason": "订单成本超出可接受范围"
  }
}

12. 对接说明

  • productNo 请按我方提供的商品编号配置;
  • 若 productNo 尚未配置,当前项目会先保存订单并返回 orderStatus = 10,后台补齐履约配置后可手动重试;
  • 本接口成功受理后,不代表最终卡密已可交付;
  • 最终交付内容为我方系统生成的领取链接,链接域名按实际部署域名配置;
  • 该链接将在“查询订单接口”中,通过 cards 加密串返回;
  • 建议 91卡券 将此商品配置为:异步卡密商品。