Files
mipu-open/docs/03-03_shopping-baggage.md
杨柳杰 b450b512a2 init: mipu-open 对外开放项目统一管理仓库
- 添加 mipu-api 作为 git submodule (Claude Code Skill)
- 迁移 API 文档源文件到 docs/ 目录统一维护
- 添加 Gitea Actions 工作流:tag推送自动打包docs并发布Release
- Skill 运行时自动从 mipu-open Release 下载最新文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-04 12:16:08 +08:00

265 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- mipuyun-api-doc: shopping-baggage -->
# shopping/baggage - 行李报价
## 用户使用场景
> 获取行程可支持的收费行李规格,以及各个规格的行李价格
## 性能指标
> - 通过sessionId访问或者sessionId有效响应时间<8秒。
## 请求说明
| **请求地址** | https://${endpoint}/shopping/baggage |
| --- | --- |
| **请求方法** | POST |
| **注意事项** | Header必须带压缩请求。 |
## 请求参数
### Header
| **参数名称** | **类型** | **是否必选** | **示例值** | **说明** |
| --- | --- | --- | --- | --- |
| Content-Type | String | 是 | application/json | 固定值,指定请求体格式为 JSON |
| Accept-Encoding | String | 是 | gzip, deflate, br | 必须要填写,否则服务器会拒绝。 |
| client-key | String | 是 | xxxxx | 联系我们获取生产环境key |
| client-secret | String | 是 | xxxxx | 联系我们获取生产环境secret |
###
### 请求体
```json
{
"sessionId": "66d807b0-abbc-4b57-aeff-bbf4fc29fb75",
"journeyType": "OW",
"origin": "MIL",
"destination": "CAG",
"departureDate": "20251118",
"adults": 1,
"children": 0,
"infants": 0,
"agent": "u2web",
"proxy": "myproxy-us",
"outboundFareFamily": "promo",
"inboundFareFamily": "",
"outboundSegments": [
{
"carrier": "SL",
"originAirport": "PHS",
"destinationAirport": "DMK",
"flightNumber": "SL557",
"departureDate": "20251119"
}
],
"inboundSegments": [
]
}
```
> **注意**:本接口的请求参数与 [shopping/select](03-02_shopping-select.md) 完全一致,详细的参数说明请参考 shopping/select 文档。
| **参数名称** | **类型** | **是否必选** | **示例值(默认值)** | **说明** |
| --- | --- | --- | --- | --- |
| sessionId | String | 否 | 66d807b0-abbc-4b57-aeff-bbf4fc29fb75 | 目的是为了复用前一步的shopping/search的session提升速度&成功率。如带入session请务必保障1. 出发到达/旅行日期/人数与前一步保持一致。 |
| journeyType | String | 是 | "OW" | 行程为单程还是往返程OW单程OneWayRT往返RoundTrip |
| origin | String | 是 | "CJJ" | 出发地为IATA 3字码兼容城市或者机场3字码 |
| destination | String | 是 | "SHA" | 到达地为IATA3字码兼容城市或者机场3字码 |
| departureDate | String | 是 | 20240326 | 出发日期,格式为 `YYYYMMDD`(如 2024 年 5 月 1 日为 20240501 |
| returnDate | String | 否 | 20240423仅 RT 必填) | 返程日期,格式同 departureDate仅当 journeyType=RT 时必传OW 时可传空 |
| adults | Integer | 是 | 2 | 成人,乘机人数量 |
| children | Integer | 是 | 1 | 儿童,乘机人数量 |
| infants | Integer | 是 | 0 | 婴儿,乘机人数量 |
| outboundSegments | Array<FlightSegmentRequest> | 是 | | 去程航段信息,详见 [FlightSegmentRequest](07-01_flight-segment-request.md) |
| inboundSegments | Array<FlightSegmentRequest> | 否 | | 返程航段信息往返行程为必须,详见 [FlightSegmentRequest](07-01_flight-segment-request.md) |
| outboundFareFamily | String | 是 | | 去程FareFamily的名字 |
| inboundFareFamily | String | 否 | | 回程FareFamily的名字仅往返程有值 |
| agent | String | 是 | "u2web" | 你自行定义的执行器编码Agent Code |
| proxy | String | 是 | | 本次获取航司数据采用的代理方式。如果需要指定代理国家请在代理用户后面加上国家二字码。如myproxy-USUS代表美国 |
| acceptCacheMinutes | Integer | 否 | 5 | 默认值5**如无特殊情况,本参数不建议设置或调整。**为了避免频繁请求航司设置的缓存用户可以指定缓存时长不填写为5。 |
| async | Boolean | 是 | false | 是否启用 Webhook 异步模式。<br>- **false**: 同步模式,等待完整结果返回<br>- **true**: 异步模式,立即返回 202结果通过 Webhook 回调<br><br>**异步模式说明**<br>1. 系统会同步检查是否有新鲜缓存acceptCacheMinutes如有则立即返回<br>2. 无缓存时返回 202 Accepted包含 requestId 用于追踪<br>3. 航司数据返回后,通过预先配置的 Webhook 回调通知<br><br>**注意**:使用异步模式需提前配置 `shopping_response` 类型的 Webhook |
| callbackId | String | 否 | - | 异步模式下的业务回调标识,用于客户自行匹配业务。建议格式:`baggage_{origin}_{destination}_{departureDate}_{adults}-{children}-{infants}_{flightNumber}`,最大 50 个字符 |
> **参数一致性说明**本接口的所有请求参数Header 和 请求体)与 [shopping/select](03-02_shopping-select.md) 完全相同。如果您已经熟悉 shopping/select 接口,可以直接使用相同的参数格式调用本接口。
## 返回参数
| 参数名称 | 类型 | 示例值 | 说明 |
| --- | --- | --- | --- |
| code | Integer | 0 | 系统状态码0 = 成功,非 0 为失败 |
| msg | String | null | 系统消息:成功时为 null失败时返回具体系统提示信息 |
| sessionId | String | 66d807b0-abbc-4b57-aeff-bbf4fc29fb75 | UUID: 与航司通信的session值可以用于加速后续动作如继续获取包裹选座下单。 |
| itineraries | Array\<Itinerary\> | - | 航线组合列表。由于在本接口已确定路线和FareFamily数组长度 ≤ 1 |
| ancillaries | Array\<[AncillaryGroup](#ancillarygroup)\> | {json实体} | 辅营产品分组列表(新结构,三级嵌套) |
| ancillaryList | Array | {json实体} | *(兼容旧结构)*`ancillaries` 为空时可能存在,建议优先使用 `ancillaries` |
### 异步模式响应async=true
`async=true` 且无可用缓存时,系统立即返回 202 Accepted
| 参数名称 | 类型 | 说明 |
|----------|------|------|
| code | Integer | 202表示请求已接受正在处理中 |
| msg | String | "Accepted. Please wait for the webhook callback" |
| requestId | String | 请求IDUUID用于追踪和关联 Webhook 回调 |
| status | String | "PROCESSING"(处理中) |
完整结果将通过预先配置的 Webhook 回调返回。
---
## 响应实体介绍
响应采用三级嵌套结构:**AncillaryGroup** → **AncillaryCategory****BaggageOption**
```
ancillaries (Array)
└─ AncillaryGroup ← 按航程方向 + 运价家族分组
└─ categoryList (Array)
└─ AncillaryCategory ← 按行李类别分组
└─ categoryDetail (Array)
└─ BaggageOption ← 具体行李选项及价格
```
### AncillaryGroup最外层
| 字段名 | 类型 | 说明 |
|--------|------|------|
| currency | String | 售价币种ISO 4217`CAD``EUR``USD` |
| fareFamilyType | String | 运价家族类型,如 `BASIC``SMART``PROMO` |
| journeyDirection | String | 航程方向:`outbound`(去程)/ `inbound`(回程) |
| categoryList | Array\<[AncillaryCategory](#ancillarycategory)\> | 辅营类别列表 |
### AncillaryCategory中间层
| 字段名 | 类型 | 说明 |
|--------|------|------|
| categoryCode | String | 类别代码,见 [categoryCode 说明](#categorycode-说明) |
| maxPieces | String | 该类别最多可购买件数 |
| pricingMode | String | 定价模式,见 [pricingMode 说明](#pricingmode-说明) |
| categoryDetail | Array\<[BaggageOption](#baggageoption)\> | 选项列表 |
### BaggageOption最内层
| 字段名 | 类型 | 说明 |
|--------|------|------|
| pieceNo | Integer | 第 N 件。STEP 模式下为序号1, 2, 3...FLAT/TIERED 模式下为 1 |
| weight | BigDecimal | 行李额重量KG |
| size | String | 尺寸限制,如 `"55x40x23cm"` |
| price | BigDecimal | 该选项/该件价格 |
| maxPieces | Integer | 该选项可购买数量 |
---
### 响应示例
#### 示例1FLAT + STEP 混合
```json
{
"code": 0,
"msg": null,
"sessionId": "NYW34327-f212fbacdd054dda8a509e846e300ebf",
"itineraries": [],
"ancillaries": [
{
"currency": "CAD",
"fareFamilyType": "BASIC",
"journeyDirection": "outbound",
"categoryList": [
{
"categoryCode": "CabinBaggageOverheadLocker",
"maxPieces": "1",
"pricingMode": "FLAT",
"categoryDetail": [
{ "pieceNo": 1, "weight": 10, "size": "55x40x23cm", "price": 39.00, "maxPieces": 1 },
{ "pieceNo": 1, "weight": 23, "size": "55x40x23cm", "price": 64.00, "maxPieces": 1 }
]
},
{
"categoryCode": "StandardCheckedBaggage",
"maxPieces": "5",
"pricingMode": "STEP",
"categoryDetail": [
{ "pieceNo": 1, "weight": 10, "size": "", "price": 39.00, "maxPieces": 1 },
{ "pieceNo": 1, "weight": 23, "size": "", "price": 64.00, "maxPieces": 1 },
{ "pieceNo": 2, "weight": 23, "size": "", "price": 64.00, "maxPieces": 1 },
{ "pieceNo": 3, "weight": 23, "size": "", "price": 99.00, "maxPieces": 1 }
]
}
]
},
{
"currency": "CAD",
"fareFamilyType": "BASIC",
"journeyDirection": "inbound",
"categoryList": [
{
"categoryCode": "CabinBaggageOverheadLocker",
"maxPieces": "1",
"pricingMode": "FLAT",
"categoryDetail": [
{ "pieceNo": 1, "weight": 10, "size": "55x40x23cm", "price": 35.00, "maxPieces": 1 }
]
}
]
}
]
}
```
#### 示例2TIERED 模式(按重量档位)
```json
{
"code": 0,
"msg": null,
"sessionId": "...",
"ancillaries": [
{
"currency": "CNY",
"fareFamilyType": "ECONOMY",
"journeyDirection": "outbound",
"categoryList": [
{
"categoryCode": "StandardCheckedBaggage",
"maxPieces": "1",
"pricingMode": "TIERED",
"categoryDetail": [
{ "pieceNo": 1, "weight": 20, "size": "", "price": 300.00, "maxPieces": 1 },
{ "pieceNo": 1, "weight": 25, "size": "", "price": 500.00, "maxPieces": 1 },
{ "pieceNo": 1, "weight": 30, "size": "", "price": 800.00, "maxPieces": 1 }
]
}
]
}
]
}
```
---
### categoryCode 说明
| categoryCode | 说明 |
|--------------|------|
| CabinBaggageOverheadLocker | 手提行李(头顶行李架) |
| CabinBaggageUnderSeat | 手提行李(座椅下) |
| StandardCheckedBaggage | 托运行李 |
### pricingMode 说明
| pricingMode | 说明 | 渲染建议 |
|-------------|------|----------|
| FLAT | 固定单价,每件独立产品 | 卡片网格展示,每个选项一张卡片 |
| STEP | 逐件定价,第 N 件对应不同价格 | 表格展示,按 pieceNo 分组,同 pieceNo 行用背景色合并 |
| TIERED | 按总重量档位选择,不计件 | 单选列表展示,互斥选项 |
> **提示**
> - `ancillaries` 数组按 `journeyDirection`outbound/inbound和 `fareFamilyType` 分组
> - 优先使用 `ancillaries`(新三级结构),`ancillaryList` 为兼容旧结构
> - 同一 `pricingMode` 内,`categoryDetail` 按 `pieceNo` 升序排列
> - STEP 模式下,相同 `pieceNo` 可能有多个重量/价格选项(如第 1 件可选 10kg 或 23kg