标准外采开放接口

本接口用于出票供应商主动拉单:系统按出票规则生成外采任务,供应商定时拉取待出票任务,确认接单,出票后回传票号、PNR 和价格。

当前版本 v1.0 只覆盖出票业务,不包括改签和退票。如果希望由平台主动调用供应商接口,请参阅[第三方自动出票供应商协议](/docs/agent/supplier-protocol)。

对接流程

  1. 系统根据出票规则生成外采任务,状态为 PENDING;
  2. 供应商调用拉单接口获取待出票任务;
  3. 供应商调用接单接口确认处理,并绑定自己的订单号;
  4. 供应商完成出票后调用回调接口,回传结果;
  5. 系统回填采购单、票号、出票状态和订单日志。

基础信息

项目约定
接口前缀{baseUrl}/prod-api/externalProcurement/openapi/v1/issue/orders
请求格式Content-Type: application/json
鉴权Header 中传 X-External-Token: 供应商Token

/prod-api 是生产 Nginx 的 API 前缀。如果网关已自动补该前缀,不要重复拼接。Token 由我方分配,供应商只能访问自己渠道下的任务。

统一响应

{ "code": 0, "msg": "success", "data": {} }
code说明
0成功
401Token 为空、无效或账号未启用
404外采任务不存在,或不属于当前供应商
500参数错误、状态不支持、业务处理失败

任务状态

状态含义说明
PENDING待接单供应商可拉取
ACCEPTED已接单供应商已确认接单
PROCESSING出票中供应商处理中
ISSUED出票完成终态
FAILED出票失败终态
CANCELLED已取消终态

终态任务不能再次接单。已出票的任务重复回调 ISSUED 时按幂等处理。

拉取待出票订单

POST /externalProcurement/openapi/v1/issue/orders/pull

拉取当前供应商渠道下状态为 PENDING 的任务。

{ "limit": 20 }
字段类型必填说明
limitnumber否单次拉取数量,默认 20,最大 100

响应 data 是任务数组:

{
  "code": 0,
  "msg": "success",
  "data": [
    {
      "procurementNo": "EP202605270001",
      "orderSerialNo": "SO202605270001",
      "purchaseChannelCode": "STANDARD_EXTERNAL_ISSUE",
      "supplierOrderNo": null,
      "status": "PENDING",
      "orderType": "ISSUE",
      "tripType": "ONEWAY",
      "currency": "HKD",
      "totalPrice": 918.27,
      "contact": { "name": "张三", "mobile": "13800000000", "email": "test@example.com" },
      "passengers": [
        {
          "passengerId": 10001,
          "name": "ZHANG/MEIMEI",
          "ageType": "ADT",
          "birthday": "1990-01-01",
          "gender": "F",
          "cardType": "PP",
          "cardNum": "EQ119181",
          "cardExpired": "2030-01-01",
          "cardIssuePlace": "CN",
          "nationality": "CN"
        }
      ],
      "segments": [
        {
          "segmentId": 20001,
          "routeNo": 1,
          "depAirport": "HKG",
          "arrAirport": "BKK",
          "depTime": "2026-06-01 10:30:00",
          "arrTime": "2026-06-01 13:00:00",
          "fltNum": "HX765",
          "cabin": "Y",
          "carrier": "HX",
          "baggage": 20,
          "baggageNumber": 1
        }
      ],
      "createdAt": "2026-05-27T01:00:00"
    }
  ]
}

确认接单

POST /externalProcurement/openapi/v1/issue/orders/accept

{ "procurementNo": "EP202605270001", "supplierOrderNo": "407900" }
字段类型必填说明
procurementNostring是我方外采任务号
supplierOrderNostring是供应商订单号

接单成功后任务变为 ACCEPTED。幂等规则:

  • 同一任务用同一 supplierOrderNo 重复接单,按同一次接单处理;
  • 同一任务已绑定其他 supplierOrderNo 时拒绝;
  • 任务已是 ISSUED、FAILED、CANCELLED 时不能接单。

查询任务详情

GET /externalProcurement/openapi/v1/issue/orders/{procurementNo}

响应结构与拉单接口中的单个任务对象相同。

出票结果回调

POST /externalProcurement/openapi/v1/issue/orders/callback

出票成功、失败或处理中状态变化时调用。

{
  "procurementNo": "EP202605270001",
  "supplierOrderNo": "407900",
  "status": "ISSUED",
  "pnr": "W73YFC",
  "bigPnr": "MUABCD",
  "totalPrice": 918.27,
  "currency": "HKD",
  "tickets": [
    {
      "passengerId": 10001,
      "ticketNo": "1601234567890",
      "ticketPrice": 752.98,
      "tax": 165.29,
      "payPrice": 918.27
    }
  ],
  "message": "出票成功"
}
字段类型必填说明
procurementNostring是我方外采任务号
supplierOrderNostring否供应商订单号,已接单任务建议必传
statusstring是PROCESSING、ISSUED、FAILED、CANCELLED
pnr / bigPnrstring否PNR 与航司大编码,出票成功时建议传
totalPrice / currencynumber / string否采购总价与币种
ticketsarray出票成功必传票号明细
messagestring否处理说明或失败原因

tickets[] 字段:

字段必填说明
passengerId否我方乘客 ID,优先用于匹配
passengerName / certNo否无 passengerId 时用于匹配乘客
ticketNo是票号
pnr / bigPnr否乘客级 PNR / 大编码,非空时优先于订单级
ticketPrice / sellingPrice / tax / buildPrice / fuelPrice / payPrice否票面、销售、税费、机建、燃油、实付

回调处理规则:

  • ISSUED:回填采购信息、票号、出票时间,并把订单推进为出票完成;
  • FAILED:只更新任务失败状态和原因,不会把订单改为出票成功;
  • CANCELLED / PROCESSING:更新任务状态;
  • 回调中的 supplierOrderNo 与已绑定的订单号不一致时拒绝。