# 火车票登录模式标准接入接口文档

# 总体说明

接口采用http协议,utf-8编码

header添加参数(回调时需传回):

  • swimlane="泳道信息xxx",举例:swimlane=selftest-250709-110905-832
  • INF-CELL="灰度信息xxx",举例:INF-CELL=gray-release-tmc-testing

注意

  1. 优先在占座下单header头中原样获取落库,后续相关回调都可用该参数按上述格式放入header头中返回
  2. 上述参数在body中也可获取,但body中取值字段为swimlane和inf_CELL,回调还按上述格式放入header头即可

http接口返回通用参数

success值 code值 msg值
true 0 处理或操作成功
false 非0 失败信息

加解密处理:

所有请求体:

名称 类型 是否必填 示例 说明
partnerAccessKey String 是 ETHRME7LOXDT-TK 美团企业版分配给供应商的接入密钥
content String 是 UgxoCGPQIzoP 请求体内容,将请求参数JSON序列化后进行加密的结果值

文档参考:待定

密钥信息:

// test环境
partnerCode 1020002
partnerAccessKey ETHRME7LOXDT-TK
partnerSecretKey LqfXOfsKKSrtxQov3268Gg==
环境 回调域名
线上 https://bep-openapi.meituan.com
线下 https://waimai-openapi.apigw.test.meituan.com

# 1.1 占座下单

# 1.1.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/holdseat POST json http://xxxxxx.com为合作商可访问域名

# 1.1.2 业务输入参数

参数名 是否必传 参数类型 参数说明
bookingOrderParamList 是 List<BookingOrderParam> 下单入参,支持单程;中转时传入多程(每程一个元素,本期最多2程)
orderId(新增) 否 String 美团父订单号(中转时必填,单程时不填)
userName 是 String 12306账号
userPassword 是 String 12306密码
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

# BookingOrderParam参数说明

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团的订单号
isAcceptNoSeat 否 Boolean 是否接受无座 true:接受无座票 false:不接受无座票,传值为空默认不接受
isAcceptOtherSeats 是 Boolean 是否接受其他座位,true:接受其他座位,false:不接受其他座位
chooseSeats 否 String 选座的座位1A1B1C2A2B
seatType 是 String 坐席类型,定义参照附录【坐席类型枚举】第二列
quietSeat 否 Integer 选择静音车厢传1
chooseSeats 否 String 选座的坐席1A1B1C2A2B
passengerList 是 List<Passenger> 乘客信息。可以是多个乘客信息,最多5个,如:[{乘客1信息},{乘客2信息},...],也可以只有一个,[{乘客1信息}]。乘客参数见附注1。
mobilePhone 是 String 联系人手机号
orderAmount 是 Integer 订单价格,单位分
trainInfo 是 TrainInfo 车次信息

# TrainInfo参数说明

参数名 是否必传 参数类型 参数说明
trainCode 是 String 车次号
fromStationCode 否 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 否 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口

# Passenger参数说明

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,定义参照附录【证件类型枚举】
passengerName 是 String 乘客姓名
passengerId 否 String 乘客id,出票回调是传递回来
price 是 Integer 车票价格,单位分
ticketType 是 String 车票类型,成人票/儿童票,定义参照附录【车票类型枚举】
mobilePhone 是 String 手机号
email 否 String 邮箱
nationality 护照 港澳通行证 台湾通行证 必传参数 String 国家code
validDateEnd 否 String 证件有效期yyyy-MM-dd
birthday 否 String 出生日期yyyy-MM-dd
certificateSex 否 String 性别F/M

# 1.1.3 业务输出参数

参数名 是否必传 参数类型 参数说明
status 是 Integer 处理结果status
message 是 String 处理结果message
data 否 Data 接口返回实际数据

Data参数说明:

参数名 是否必传 参数类型 参数说明
partnerOrderId 是 String 供应商单号,中转订单时为总订单号
loseTime 是 String 截止支付时间,格式:yyyy-MM-dd HH:mm:ss
holdSeatType 否 Integer 占座模式,10:先支付,20:先占座,不传默认先支付
partnerOrderList(新增) 否 List<SubOrderInfo> 子供应商单号列表(中转订单返回)

SubOrderInfo:

参数名 是否必传 参数类型 参数说明
partnerOrderId 是 String 子供应商单号
orderId 是 String 子美团订单号

# 1.2 申请出票

# 1.2.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/trainOrder POST json http://xxxxxx.com为合作商可访问域名

# 1.2.2 业务输入参数

参数名 是否必传 参数类型 参数说明
payOrderParamList 是 List<PayOrderParam> 出票入参,支持单程、中转(中转时每程一个元素)
orderId(新增) 否 String 美团父订单号(中转时必填,单程时不填)
userName 否 String 12306账号
userPassword 否 String 12306密码
payEndTime 是 String 出票截止时间,格式2020-02-19 20:25:00
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

PayOrderParam参数说明:

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团的订单号
userPaySuc 否 int 1表示用户直付成功【新增】
entPayLoginId 否 string 使用因公付免密付固定账户,支付宝签约的账号,非免幂支付不设置值【新增】

# 1.2.3 业务输出参数

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status
message 是 String 处理结果message
data 否 T 接口返回实际数据

# 1.3 改签下单

# 1.3.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/resignTicket POST json http://xxxxxx.com为合作商可访问域名

# 1.3.2 业务输入参数

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团订单号,中转时为父单号
subOrderId(新增) 否 String 美团(子)订单号
userName 是 String 12306账号
userPassword 是 String 12306密码
partnerOrderId 否 String 供应商订单号
orderId12306 否 String 12306订单号
isAcceptNoSeat 否 Boolean 是否接受无座 true:接受无座票 false:不接受无座票,传值为空默认不接受
isAcceptOtherSeats 否 Boolean 是否接受其他座位,true:接受其他座位,false:不接受其他座位(改签不支持,预留字段)
chooseSeats 否 String 选座的座位1A1B1C2A2B (改签不支持,预留字段)
seatType 是 String 坐席类型,定义参照附录【坐席类型枚举】第二列
serviceId 是 long 改签id,回调时候传回来
ticketList 是 List<Ticket> 改签车票信息
trainInfo 是 TrainInfo 车次信息
orderAmount 是 Integer 改签订单价格,单位分
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

TrainInfo参数说明:

参数名 是否必传 参数类型 参数说明
trainCode 是 String 车次号
fromStationCode 否 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 否 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss

Ticket参数说明:

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id,回调时候传回来
passengerName 是 String 乘客姓名
ticketPrice 是 Integer 预估车票单价,单位:分
ticketType 是 String 车票类型,对应附录【车票类型枚举】中文
mobilePhone 是 String 手机号
email 否 String 邮箱

# 1.3.3 业务输出参数

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status
message 是 String 处理结果message
data 否 Data 接口返回实际数据

Data参数说明:

参数名 是否必传 参数类型 参数说明
partnerOrderId 是 String 供应商单号
loseTime 是 String 截止支付时间,格式:yyyy-MM-dd HH:mm:ss

# 1.4 改签出票

# 1.4.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/confirmResign POST json http://xxxxxx.com为合作商可访问域名

# 1.4.2 业务输入参数

参数名 是否必传 参数类型 参数说明
serviceId 是 String 美团改签id
orderId 是 String 美团订单号,中转时为父单号
subOrderId(新增) 否 String 美团(子)订单号
userName 否 String 12306账号
userPassword 否 String 12306密码
payEndTime 是 String 出票截止时间,格式2020-02-19 20:25:00
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321
userPaySuc 否 int 1表示用户直付成功【新增】
entPayLoginId 否 string 使用因公付免密付固定账户,支付宝签约的账号,非免幂支付不设置值【新增】

# 1.4.3 业务输出参数

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status
message 是 String 处理结果message
data 否 T 接口返回实际数据

# 1.5 订单取消

# 1.5.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/cancelHoldSeat POST json http://xxxxxx.com为合作商可访问域名

# 1.5.2 业务输入参数

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团订单id,中转时为父单号
userName 否 String 12306账号
userPassword 否 String 12306密码
cancelEndTime 是 String 取消截止时间,格式2020-02-19 20:25:00
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

# 1.5.3 业务输出参数

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status
message 是 String 处理结果message
data 否 T 接口返回实际数据

# 1.6 取消改签申请

# 1.6.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/cancelResign POST json http://xxxxxx.com为合作商可访问域名

# 1.6.2 业务输入参数

参数名 是否必传 参数类型 参数说明
serviceId 是 String 美团改签id
orderId 是 String 美团订单号,中转时为父单号
subOrderId(新增) 否 String 美团(子)订单号
userName 否 String 12306账号
userPassword 否 String 12306密码
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

# 1.6.3 业务输出参数

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status
message 是 String 处理结果message
data 否 T 接口返回实际数据

# 1.7 申请退票前检查

# 1.7.1 接口说明

该接口为同步接口,不需要回调通知

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/canReturnOrder POST json http://xxxxxx.com为合作商可访问域名

# 1.7.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321
orderId 是 String 美团订单号,中转时为父单号
subOrderId(新增) 否 String 美团(子)订单号
ticketNo 是 String 占座或出票通知中供应商返回的唯一票号
loginType 是 Integer 0:免登,1:登录
applyDate 是 Long 申请时间戳
trainStartTime 是 String 发车时间,格式:yyyy-MM-dd HH:mm:ss
ticketPrice 是 Integer 票价,单位:分

# 1.7.3 业务输出参数

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status
message 是 String 处理结果message
data 否 Data 接口返回实际数据

Data参数说明:

参数名 是否必传 参数类型 参数说明
canReturn 是 Boolean 是否可退
serviceFeeCent 否 Integer 可退时必填,手续费,单位:分
refundPrice 否 Integer 可退时必填,预计退款金额,单位:分
failReason 否 String 不可退原因,canReturn为false时必填

# 1.8 申请退票

# 1.8.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/returnTickets POST json http://xxxxxx.com为合作商可访问域名

# 1.8.2 业务输入参数

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团订单号,中转时为父单号
subOrderId(新增) 否 String 美团(子)订单号
userName 是 String 12306账号
userPassword 是 String 12306密码
partnerOrderId 否 String 供应商订单号
orderId12306 否 String 12306订单号
serviceId 是 String 美团退票服务单id
trainInfo 是 TrainInfo 申请退票车次信息
refundEndTime 是 String 退票截止时间,格式2020-02-19 20:25:00
ticketInfoList 是 List<TicketInfo> 申请退的票信息
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

# TrainInfo参数说明

参数名 是否必传 参数类型 参数说明
trainCode 是 String 车次号
fromStationCode 否 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 否 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口

# TicketInfo参数说明

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id
passengerName 是 String 乘客姓名
ticketPrice 是 Integer 车票单价,单位:分
coachNo 是 String 车票车厢号,格式02车厢
seatNo 是 String 坐席号
seatType 是 String 坐席类型,对应附录【坐席类型枚举】第二列
ticketNo 否 String 12306长票号,对应唯一乘客
ticketType 是 String 车票类型,对应附录【车票类型枚举】中文

# 1.8.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 T 处理具体内容
code 是 String 处理结果code
msg 否 String 处理结果msg

# 1.9 占座异步回调

# 1.9.1 接口说明

uri method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json

# 1.9.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts 是 long 请求时间戳
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传10
orderId 是 String 美团订单id,中转订单为父单号
subOrderIds(新增) 否 List<String> 美团子订单号
orderType 是 String 1-直达,2-中转
orderId12306 否 String 12306订单号
partnerOrderId 否 String 供应商订单号
login 是 Boolean 是否是登录模式
noticeSuccess 是 boolean 是否占座成功
payLimitTime 否 Long 真实占座成功必传,支付截止时间
failCode 否 String 失败必传,参考【出票/占座失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg 否 String 供应商侧失败的详细原因
realHoldSeat 是 boolean 是否真实占座,如是真实占座,占座成功需要有票信息
orderAmount 否 long 车票总金额,单位:分
transferTrainInfo(新增) 否 List 中转占座成功后车次信息
trainInfo 否 TrainInfo 单程订单占座成功后车次信息
ticketInfoList 否 List<TicketInfo> 单程订单占座成功后车票信息

# TrainInfo

参数名 是否必传 参数类型 参数说明
trainCode 是 String 车次号
fromStationCode 否 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 否 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口

# TransferTrainInfo

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团子订单id
trainCode 是 String 车次号
fromStationCode 否 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 否 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口
ticketInfoList 是 List<TicketInfo> 占座成功后车票信息

# TicketInfo

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id
passengerName 是 String 乘客姓名
ticketPrice 是 Integer 实际车票单价,单位:分
coachNo 是 String 车票车厢号,格式02车厢
seatNo 是 String 坐席号
seatType 是 String 坐席类型,对应附录【坐席类型枚举】第二列
ticketNo 是 String 12306长票号或自定义唯一票号,对应唯一乘客
ticketType 是 String 车票类型,对应附录【车票类型枚举】中文

# 1.9.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

# Data

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.10 改签占座异步回调

# 1.10.1 接口说明

uri method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json

# 1.10.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts 是 long 请求时间戳
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传40
orderId 是 String 美团订单id,中转订单为父单号
subOrderId(新增) 否 String 美团子订单号
orderType(新增) 是 String 1-直达,2-中转
orderId12306 否 String 12306订单号
serviceId 是 String 美团改签id
changeType 否 Integer 改签类型,0 未改签,1:低改高2:平改3:高改低(非真实占座无)
realHoldSeat 是 Boolean 是否真实占座
login 是 Boolean 是否是登录模式
noticeSuccess 是 Boolean 占座是否成功
payLimitTime 否 Long 真实占座成功必传,支付截止时间
failCode 否 String 失败必传,参考【改签失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg 否 String 供应商侧失败的详细原因
changeTotalServiceFee 否 Integer 改签总手续费,改签手续费+改签差额退手续费,单位:分(非真实占座无)
changeServiceFee 否 Integer 改签手续费,单位:分(非真实占座无)
changeRefundFee 否 Integer 改签差额退款手续费,单位:分(非真实占座无)
changeTrainInfo 是 TrainInfo 改签后车次信息
changeTicketInfoList 是 List<TicketInfo> 改签后车票list

TrainInfo参数说明:

参数名 是否必传 参数类型 参数说明
trainCode 是 String 车次号
fromStationCode 是 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 是 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口

TicketInfo参数说明:

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id
passengerName 是 String 乘客姓名
ticketPrice 是 Integer 车票单价,单位:分
coachNo 是 String 车票车厢号,格式02车厢
seatNo 是 String 坐席号
seatType 是 String 坐席类型,对应附录【坐席类型枚举】第二列
ticketNo 是 String 12306长票号或自定义唯一票号,对应唯一乘客
ticketType 是 String 车票类型,对应附录【车票类型枚举】中文
changeServiceFee 否 Integer 改签手续费,单位:分
changeRefundFee 否 Integer 改签差额退款手续费,单位:分

# 1.10.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.11 出票结果回调

# 1.11.1 接口说明

uri method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json

# 1.11.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts 是 long 请求时间戳
entPayType 否 string 0是普通订单,默认为0。1是通过企业码链接支付,但是走了个人付,2是通过企业码链接支付,走因公账户支付,3是企业码免密企业付【新增】
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传30
orderId 是 String 美团订单id,中转订单为父单号
subOrderIds(新增) 否 List<String> 美团子订单号
orderType 是 String 1-直达,2-中转
partnerOrderId 否 String 供应商订单号
login 是 Boolean 是否是登录模式
noticeSuccess 是 boolean 出票是否成功
orderId12306 是 String 12306订单号(短票号)
failCode 否 String 失败必传,参考【出票/占座失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg 否 String 供应商侧失败的详细原因
orderAmount 是 Integer 订单总金额,单位:分
transferTrainInfo 否 List 中转车次信息
trainInfo 是 TrainInfo 单程订单车次信息
ticketInfoList 是 List<TicketInfo> 单程订单车票信息格式同下单一致,内容为实际出票的数据

TrainInfo参数说明:

参数名 是否必传 参数类型 参数说明
trainCode 是 String 车次号
fromStationCode 否 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 否 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口

TicketInfo参数说明:

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id
passengerName 是 String 乘客姓名
ticketPrice 是 Integer 车票单价,单位:分
coachNo 是 String 车票车厢号,格式02车厢
seatNo 是 String 坐席号
seatType 是 String 坐席类型,对应附录【坐席类型枚举】第二列
ticketNo 是 String 12306长票号或自定义唯一票号,对应唯一乘客
ticketType 是 String 车票类型,对应附录【车票类型枚举】中文

# 1.11.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.12 改签确认回调

# 1.12.1 接口说明

method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json

# 1.12.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts 是 long 请求时间戳
entPayType 否 string 0是普通订单,默认为0。1是通过企业码链接支付,但是走了个人付,2是通过企业码链接支付,走因公账户支付,3是企业码免密企业付【新增】
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传60
orderId 是 String 美团订单id,中转订单为父单号
subOrderId(新增) 否 String 美团子订单号
orderType(新增) 是 String 1-直达,2-中转
orderId12306 否 String 12306订单号
serviceId 是 String 美团改签id
changeType 是 Integer 改签类型,0 未改签,1:低改高2:平改3:高改低
login 是 Boolean 是否是登录模式
noticeSuccess 是 Boolean 改签确认是否成功
failCode 否 String 失败必传,参考【改签失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg 否 String 供应商侧失败的详细原因
changeTotalServiceFee 是 Integer 改签总手续费,改签手续费+改签差额退手续费,单位:分
changeServiceFee 是 Integer 改签手续费,单位:分
changeRefundFee 是 Integer 改签差额退款手续费,单位:分
changeTrainInfo 是 TrainInfo 改签后车次信息
changeTicketInfoList 是 List<TicketInfo> 改签后车票list

TrainInfo参数说明:

参数名 是否必传 参数类型 参数说明
trainCode 是 String 车次号
fromStationCode 是 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 是 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口

TicketInfo参数说明:

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id
passengerName 是 String 乘客姓名
ticketPrice 是 Integer 车票单价,单位:分
coachNo 是 String 车票车厢号,格式02车厢
seatNo 是 String 坐席号
seatType 是 String 坐席类型,对应附录【坐席类型枚举】第二列
ticketNo 是 String 12306长票号或自定义唯一票号,对应唯一乘客
ticketType 是 String 车票类型,对应附录【车票类型枚举】中文
changeServiceFee 是 Integer 改签手续费,单位:分
changeRefundFee 是 Integer 改签差额退款手续费,单位:分

# 1.12.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.13 退票结果回调

# 1.13.1 接口说明

uri method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json

# 1.13.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts 是 long 请求时间戳
entPersonalPay 否 boolean 预订或改签使用过企业码链接支付,但是走了个人付。可能存在预订使用支付链接企业码因公付,但是改签获取链接后支付时选择了个人付【新增】
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传70
orderId 是 String 美团订单id,中转订单为父单号
subOrderId(新增) 否 String 美团子订单号
orderType(新增) 是 String 1-直达,2-中转
orderId12306 否 String 12306订单号
serviceId 是 String 退票服务单id
needRefund 是 Boolean 是否需要退款
refundTotalPrice 否 Integer 退票退款总金额,单位:分
login 是 Boolean 是否是登录模式
noticeSuccess 是 Boolean 退票是否成功
failCode 否 String 失败必传,参考【退票失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg 否 String 供应商侧失败的详细原因
ticketInfoList 否 List<TicketInfo> 退票信息列表

TicketInfo参数说明:

参数名 是否必传 参数类型 参数说明
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id
passengerName 是 String 乘客姓名
ticketPrice 是 Integer 车票单价,单位:分
coachNo 是 String 车票车厢号,格式02车厢
seatNo 是 String 坐席号
seatType 是 String 坐席类型,对应附录【坐席类型枚举】第二列
ticketNo 是 String 12306长票号或自定义唯一票号,对应唯一乘客
ticketType 是 String 车票类型,对应附录【车票类型枚举】中文
refundPrice 是 Integer 退票金额,单位:分
refundServiceFee 是 Integer 退票手续费,单位:分
printReceipt 否 Integer 是否已经打印报销凭证 0没有打印 1打印,应对新的变化
offlineReturnDate 否 String 报销凭证返回最晚日期,格式2020-02-23,应对新的变化

# 1.13.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.14 线下退款通知

# 1.14.1 接口说明

uri method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json

# 1.14.2 业务输入参数

参数名 是否必传 类型 描述
ts 是 long 请求时间戳
entPersonalPay 否 boolean 预订或改签使用过企业码链接支付,但是走了个人付。可能存在预订使用支付链接企业码因公付,但是改签获取链接后支付时选择了个人付。所以一张票只要发生过通过企业码支付链接的个人付都传true【新增】
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传80
orderId 是 String 美团订单id,中转订单为父单号
subOrderId(新增) 是 String 美团子订单号,中转时必填
orderType(新增) 是 String 1-直达,2-中转
orderId12306 否 String 12306订单号
serviceId 是 String 服务单id(唯一标识)
totalAmount 是 Integer 退款总金额
login 是 Boolean 是否是登录模式
offlineRefundDetailList 是 List<OfflineRefundDetail> 线下退具体详情

OfflineRefundDetail参数说明:

参数名 是否必传 类型 描述
certificateNo 是 String 证件号码
certificateType 是 String 证件类型,对应附录
passengerId 否 String 乘客id
passengerName 是 String 乘客姓名
ticketNo 是 String 12306长票号或自定义唯一票号,对应唯一乘客
amount 是 Integer 退款金额,单位:分
refundType 否 Integer 0:线下退票退款,1:线下改签退款
changeTicketInfo 否 TrainChangeTicketInfo 如果是线下改签,改签后的车次及票信息

TrainChangeTicketInfo参数说明:

参数名 是否必传 类型 描述
trainCode 是 String 车次号
fromStationCode 是 String 出发站三字码
fromStationName 是 String 出发站名称
toStationCode 是 String 到达站三字码
toStationName 是 String 到达站名称
startTime 是 String 出发时间,格式:yyyy-MM-dd HH:mm:ss
arriveTime 是 String 到达时间,格式:yyyy-MM-dd HH:mm:ss
ticketEntrance 否 String 检票口
seatType 是 String 坐席类型,对应附录【坐席类型枚举】第二列
coachNo 是 String 车票车厢号,格式02车厢
seatNo 是 String 座位号
price 是 Integer 票价,单位:分
changeTicketFee 否 Integer 改签差额退票手续费
time 是 String 改签时间,格式:yyyy-MM-dd HH:mm:ss

# 1.14.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.15 下单占座取消通知

# 1.15.1 接口说明

uri method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json

# 1.15.2 业务输入参数

参数名 是否必传 类型 描述
ts 是 long 请求时间戳
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传20
orderId 是 String 美团订单id,中转订单为父单号
subOrderIds(新增) 否 List<String> 美团子订单号
orderType 是 String 1-直达,2-中转
orderId12306 否 String 12306订单号
partnerOrderId 否 String 供应商订单号
login 是 Boolean 是否是登录模式
noticeSuccess 是 Boolean 是否取消成功
failCode 否 String 失败必传,参考【出票/占座失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg 否 String 供应商侧失败的详细原因

# 1.15.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.16 改签取消通知

# 1.16.1 接口说明

uri method 参数类型 说明
/api/sqt/open/train/supply/receive-notice POST json partnerId是代理商code

# 1.16.2 业务输入参数

参数名 是否必传 类型 描述
ts 是 long 请求时间戳
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传50
orderId 是 String 美团订单id,中转订单为父单号
subOrderId(新增) 否 String 美团子订单号
orderType(新增) 是 String 1-直达,2-中转
serviceId 是 String 改签服务单号
orderId12306 否 String 12306订单号
partnerOrderId 否 String 供应商订单号
login 是 Boolean 是否是登录模式
noticeSuccess 是 Boolean 是否取消成功
failCode 否 String 失败必传,参考【改签失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg 否 String 供应商侧失败的详细原因

# 1.16.3 业务输出参数

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

参数名 是否必传 参数类型 参数说明
success 是 boolean 是否处理成功

# 1.17中转联程(12306方案)查询接口

# 1.17.1 接口说明

uri method 参数类型 说明
http://xxxxxx.com/RestfulService/12306/trainList POST json

# 1.17.2 接口入参

名称 类型 必填 描述
ticketDate string Y 发车日期 yyyy-MM-dd
fromStation string Y 出发站
midStation string N 中转站
toStation string Y 终点站
pageIndex int N 页数 从 0 开始,10 个方案 1 页

# 1.17.3 接口同步返回

参数名 是否必传 参数类型 参数说明
data 否 Data 具体结果
status 是 Integer 处理结果code
msg 否 String 处理结果msg

Data参数说明:

名称 类型 必填 描述
hasNextPage Bool Y 是否有下一页,当返回 false,则没有方案了
trains List<LcTrainItems> Y 车次信息

# LcTrainItems参数说明

名称 类型 必填 描述
index Int Y 方案编号
fromDate1 String Y 第一程出发日期 yyyy-MM-dd
toDate1 String Y 第一程到达日期 yyyy-MM-dd
fromTime1 String Y 第一程发车时间 HH:mm
toTime1 String Y 第一程到达时间 HH:mm
usedMinutes1 Int Y 第一程历时时间
trainNo1 String Y 第一程车次(正常看到车次号)
trainNoCode1 String N 车次编号(长编号)
fromStation1 String Y 第一程发站
toStation1 String Y 第一程到站
fromStationCode1 string Y 第一程发站编码
toStationCode1 string Y 第一程到站编码
canChooseBed1 Int N 1 表示可以选铺
quickPassFlag1 String N 1 快速进站
seatDetails1 List<SeatDetail> Y 坐席列表
fromDate2 String Y 第二程发车日期 yyyy-MM-dd
toDate2 String Y 第二程到达日期 yyyy-MM-dd
fromTime2 String Y 第二程发车时间 HH:mm
toTime2 String Y 第二程到达时间 HH:mm
usedMinutes2 Int N 第二程历时时间
trainNo2 String Y 第二程车次(正常看到车次号)
trainNoCode2 String N 车次编号(长编号)
fromStation2 String Y 第二程发站
toStation2 String Y 第二程到站
fromStationCode2 string Y 第二程发站编码
toStationCode2 string Y 第二程到站编码
quickPassFlag2 String N 1 快速进站
canChooseBed2 Int N 1 表示可以选铺
seatDetails2 List<SeatDetail> Y 坐席列表
usedMinutes Int N 全程时长(分钟)
changeTime Int N 换乘时间(分钟)
day Int N 跨越天数
scretstr String N 12306 此次方案的秘钥串

# SeatDetail参数说明

名称 类型 必填 描述
seatName String Y 坐席名称
price Decimal Y 票价
seatCnt String Y 余票数量
downPrice Decimal Y 下铺价格
midPrice Decimal Y 中铺价格
upPrice Decimal Y 上铺价格

# 1.18 订单详情查询

# 1.18.1 接口说明

url uri method 参数类型 说明
http://xxxxxx.com/loginRestfulService/orderDetailQuery xxx/loginRestfulService/orderDetailQuery POST json

# 1.17.2 业务输入参数

参数名 是否必传 类型 描述
orderId 是 String 美团订单号
ts 是 Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

# 1.17.3 业务输出参数

名称 是否必传 类型 描述
status 是 int 0 表示成功 -1 表示失败
message 是 string 失败原因描述
data 否 dataDto 详情内容

# dataDto参数说明

参数名 是否必传 类型 描述
orderList 否 List<orderDto> 订单信息
refundList 否 List<refundDto> 退款信息

# orderDto参数说明

参数名 是否必传 类型 描述
arriveTime 否 string 到达时间,格式 HH:mm
fromStationName 否 string 出发站名称
createDate 否 string 下单时间,格式 yyyy-MM-dd HH:mm:ss
eOrderNumber 否 string 12306订单号(E开头)
departTime 否 string 出发时间,格式 HH:mm
orderTotalPrice 否 decimal 订单总票价,单位:元
ticketTotalCount 否 int 车票数量
toStationName 否 string 到达站名称
trainNo 否 string 车次,例:D618
trainDate 否 string 乘车日期,格式 yyyy-MM-dd
ticketList 否 List<ticketDto> 车票列表

# ticketDto参数说明

参数名 是否必传 类型 描述
arriveDate 否 string 到达日期,格式 yyyy-MM-dd
arriveTime 否 string 到达时间,格式 HH:mm
coachNo 否 string 车厢号
departTime 否 string 出发时间,格式 HH:mm
eticketFlag 否 string 电子客票标识,Y/N
checkInfo 否 string 检票口信息
fromStationCode 否 string 出发站编码
fromStationName 否 string 出发站名称
passengerIdNo 否 string 乘车人证件号码(脱敏)
passengerIdTypeCode 否 string 证件类型名称枚举
passengerName 否 string 乘车人姓名(部分脱敏)
changeFlag 否 string 改签标识
returnFlag 否 string 退票标识,Y/N
seatName 否 string 座位名称,如"03C号"
seatNo 否 string 座位号
seatTypeName 否 string 座席类型名称,如"二等座"
eOrderNumber 否 string 订单号
ticketNo 否 string 票号
ticketPrice 否 decimal 票价,单位:元
ticketStatusName 否 string 车票状态名称,如"已出票"
ticketTypeName 否 string 票类型名称
toStationCode 否 string 到达站编码
toStationName 否 string 到达站名称
extTicketNo 否 string 电子客票号
trainNo 否 string 车次
trainDate 否 string 乘车日期,格式 yyyy-MM-dd

# refundDto参数说明

参数名 是否必传 类型 描述
bankCode 否 string 银行编码
banktradeNo 否 string 银行交易流水号
originName 否 string 原状态名称
passengerName 否 string 乘车人姓名(部分脱敏)
status 否 string 退款处理状态名称
ticketTypeName 否 string 票类型名称
payNo 否 string 支付流水号:M2026052523818456
tradeAmount 否 decimal 退款金额,单位:元
ticketNo 否 string 长票号
tradeDate 否 string 交易日期,格式 yyyy-MM-dd HH:mm:ss
tradeNo 否 string 交易流水号
tradeStatus 否 int 交易状态,1-已退
tradeType 否 string 交易类型,01-退款

# 1.18 加入企业码公付(新增)

# 1.18.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/RestfulService/entPay/addUser POST json http://xxxxxx.com为合作商可访问域名

使用员工支付宝加入企业码代付企业账号,员工支付时,选择企业码支付。

具体流程说明:

  1. 先调用此接口将员工支付宝添加到企业码代付企业(没有具体显示名称,通用:火车票)
  2. 员工打开joinUrl,同意加入支付宝企业码
  3. 后续该员工通过自购接口购票占座成功后
  4. 调用【用户直付12306获取支付表单接口】获取直付链接,弹出支付宝收银台,选择【因公付(火车票)】付款(款项走企业码代付企业扣费,非员工个人账户支付)
  5. 客人支付成功后,调用【确认出票】接口中字段userPaySuc传1
  6. 等待出票结果即可。注意:出票结果通知新增字段:0表示企业码支付(代付) 1表示用户直付 2表示企业码公付支付

# 1.18.2 业务输入参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
loginId 是 String 支付宝登录账号
name 是 String 支付宝登录姓名
freePay 是 boolean true表示企业码免密支付、false表示普通企业码支付
type 否 String 0表示使用支付宝登录名假如,1表示使用手机号加入
signReturnUrl 否 String 签约回调地址:参考链接 https://opendocs.alipay.com/pre-open/0jnx4i?pathHash=67c52b7b

# 1.18.3 业务输出参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
status 是 Integer 处理结果status,0是成功,加入失败非0
message 是 String 处理结果message,失败时描述原因
data 否 Data 接口返回实际数据

Data参数说明:

参数名 是否必传 参数类型 参数说明
code 是 Integer 0表示邀请加入成功 1表示已加入 3表示已激活 -1表示加入失败
joinUrl 是 String 成功时有值,员工使用支付宝打开该链接加入企业,加入企业后,就支付火车票了。建议生成二维码让员工扫码比较便捷
freePayUrl 否 String 免密付签约地址,企业码免密支付时必须有值
freePayUrlWeb 否 String 免密付签约地址,企业码免密支付时必须有值,网页端的授权链接

# 1.19 删除企业码公付(新增)

# 1.19.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/RestfulService/entPay/delUser POST json http://xxxxxx.com为合作商可访问域名

使用员工支付宝移除企业码代付企业账号

# 1.19.2 业务输入参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
loginId 是 String 支付宝登录账号
name 是 String 支付宝登录姓名
freePay 是 boolean true表示企业码免密支付、false表示普通企业码支付

# 1.19.3 业务输出参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
status 是 Integer 处理结果status,0表示成功
message is String 处理结果message,失败时需要进行原因描述
data 否 Data 接口返回实际数据

Data参数说明:

参数名 是否必传 参数类型 参数说明
code 是 Integer 0表示成功 -1表示失败

# 1.20 查询企业码员工状态(新增)

# 1.20.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/RestfulService/entPay/checkUserStatus POST json http://xxxxxx.com为合作商可访问域名

查询企业码员工状态,只有2个状态都是成功状态才能进行企业码免密公付

# 1.20.2 业务输入参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
loginId 是 String 支付宝登录账号
type 否 Integer 0 因公付 1 因公免密付

# 1.20.3 业务输出参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
status 是 Integer 处理结果status,0表示成功
message 是 String 处理结果message,失败时需要原因描述
data 否 Data 接口返回实际数据

Data参数说明:

参数名 是否必传 参数类型 参数说明
status 是 Integer 员工加入因公付企业码状态 0表示未激活,1表示已激活
fStatus 是 Integer 员工签约免密付状态 0表示未签约 1表示已签约

# 1.21 用户直付12306获取支付表单接口(新增)

# 1.21.1 接口说明

url method 参数类型 说明
http://xxxxxx.com/loginRestfulService/getPayForm POST json http://xxxxxx.com为合作商可访问域名

客人申请获取支付表单接口,同步返回支付表单链接,进行支付。

客人付完成后,调用确认出票接口【申请出票】(或者确认改签接口 改签出票】),新增参数字段:userPaySuc=1表示用户直付成功

支付成功后回调APP说明:https://opendocs.alipay.com/pre-open/0jnx4i?pathHash=67c52b7b

# 1.21.2 业务输入参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团订单号,中转时为父单号
subOrderId(新增) 否 String 美团(子)订单号
bank 是 String weixin 微信 / union 银联 / ali 支付宝
isChange 是 Boolean True获取改签支付表单
serviceId 否 String 改签时必填,改签时申请的改签ID
limitPub 否 Integer 0表示不限制,1表示限制客户不能使用企业码代付公付(只能个人付)

# 1.21.3 业务输出参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status,0表示成功
message 是 String 处理结果message ,失败时需要原因描述
data 否 Data 接口返回实际数据

Data参数说明:

参数名 是否必传 参数类型 参数说明
orderId 是 String 美团订单号
serviceId 是 String 美团服务单号
form 是 String -1失败可重试;-2失败不可重试;1获取中;0 返回表单
payUrl 否 String 直付链接
checkPayUrl 否 String 支付结果检查Url,直接访问该链接,若返回"正在处理支付数据"或"恭喜您,支付已成功",即可判断已支付

# 1.22 停运主动通知(新增)

# 1.22.1 接口说明

method 参数类型 说明 /api/sqt/open/train/supply/receive-notice POST json

# 1.22.2 接口入参

名称 类型 必填 描述
ts 是 long 请求时间戳
partnerCode 是 Integer 美团给供应商分配的code
noticeBizType 是 Integer 固定传90
orderIds List<string> N 合作方订单号
trainDate String Y 乘车日期,格式 yyyy-MM-dd
trainNo String Y 车次
fromStationName String Y 出发站名称
toStationName String Y 到达站名称

# 1.22.3 接口同步返回

参数名 是否必传 参数类型 参数说明
status 是 String 处理结果status,0表示成功
message 是 String 处理结果message ,失败时需要原因描述
data 否 Data 接口返回实际数据,这个为空,直接根据status判断即可

# 附录

# 证件类型枚举

证件类型 枚举值
二代身份证 1
外国护照 A
中国护照 B
港澳居民来往内地通行证 C
台湾居民来往大陆通行证 G
港澳居民居住证 K
台湾居民居住证 P
外国人永久居留证 H

# 坐席类型枚举

public enum SeatTypeEnum {
    YZ("硬座", "1", "1"),
    YWS("硬卧上", "2", "3"),
    YWZ("硬卧中", "3", "3"),
    YWX("硬卧下", "4", "3"),
    RZ("软座", "5", "2"),
    RWS("软卧上", "6", "4"),
    RWZ("软卧中", "7", "4"),
    RWX("软卧下", "8", "4"),
    SWZ("商务座", "9", "9"),
    DGNZ("多功能座", "10", "Q"),
    EDBZ("二等包座", "11", "S"),
    TDZ("特等座", "12", "P"),
    YDZ("一等座", "13", "M"),
    EDZ("二等座", "14", "O"),
    GJRW("高级软卧", "42", "6"),
    GJRWS("高级软卧上", "15", "6"),
    GJRWX("高级软卧下", "16", "6"),
    WZ("无座", "17", "W"),
    YRRB("一人软包", "18", "H"),
    ERRB("二人软包", "19", "H"),
    DW("动卧", "20", "F"),
    GJDR("高级动卧", "21", "A"),
    BXYW("包厢硬卧", "22", "5"),
    YW("硬卧", "23", "3"),
    RW("软卧", "24", "4"),
    YDRZ("一等软座", "25", "7"),
    EDRZ("二等软座", "26", "8"),
    TDRZ("特等软座", "27", "E"),
    BXYWS("包厢硬卧上", "28", "5"),
    BXYWZ("包厢硬卧中", "29", "5"),
    BXYWX("包厢硬卧下", "30", "5"),
    BXRZ("包厢软座", "31", "D"),
    YDW("一等卧", "32", "I"),
    EDW("二等卧", "33", "J"),
    HBYZ("混编硬座", "34", "B"),
    HBRZ("混编软座", "35", "K"),
    YDWS("一等卧上", "36", "I"),
    YDWZ("一等卧中", "37", "I"),
    YDWX("一等卧下", "38", "I"),
    EDWS("二等卧上", "39", "J"),
    EDWZ("二等卧中", "40", "J"),
    EDWX("二等卧下", "41", "J"),
    DWS("动卧上","43","F"),
    DWX("动卧下","44","F"),
    GJDRS("高级动卧上","45","A"),
    GJDRX("高级动卧下","46","A"),
    YWDYZ("硬卧代硬座","47", "1"),
    YWDEDZ("卧代二等座", "48", "O"),
    RWDRZ("软卧代软座", "49", "2"),
    WDYDZ("卧代一等座", "50", "M"),
    HBYWDYZ("混编硬卧代硬座", "51", "B"),
    UNKNOW("未知", "99", "-1");

    private static Map<String, SeatTypeEnum> nameMap;
    private static Map<String, SeatTypeEnum> codeMap;
    private static Map<String, SeatTypeEnum> highPriceMap;

    private String seatName;
    private String seatCode;//这个字段是坐席类型code
    private String seatCode12306;

    private SeatTypeEnum(String seatName, String seatCode, String seatCode12306) {
        this.seatName = seatName;
        this.seatCode = seatCode;
        this.seatCode12306 = seatCode12306;
    }
}

# 车票类型枚举

public enum TicketTypeEnum {
    ADULT_TICKET("成人票", "1"),
    STUDENT_TICKET("学生票", "3"),
    CHILD_TICKET("儿童票", "2");

    private String name;
    private String code;//这个字段是车票类型code字段

    private TicketTypeEnum(String name, String code) {
        this.name = name;
        this.code = code;
    }
}

# 出票/占座失败枚举(新增支付账号被12306限制code码)

public enum TrainOrderTicketFailEnum {
    // ========== 乘车人原因 ==========
    /** 存在冲突行程 */
    PASSENGER_CONFLICT_TRIP(10001, "存在冲突行程"),
    /** 证件信息有误 */
    PASSENGER_ID_INFO_ERROR(10002, "证件信息有误"),
    /** 限制高消费 */
    PASSENGER_HIGH_CONSUMPTION_LIMIT(10003, "限制高消费"),
    /** 不可进京 */
    PASSENGER_BEIJING_RESTRICTED(10004, "不可进京"),

    // ========== 车次原因 ==========
    /** 车次暂未起售 */
    TRAIN_NOT_ON_SALE(10101, "车次暂未起售"),
    /** 车次已停售 */
    TRAIN_SALE_STOPPED(10102, "车次已停售"),
    /** 所选新车次已停运 */
    TRAIN_SUSPENDED(10103, "所选新车次已停运"),
    /** 出/到站已封站 */
    STATION_CLOSED(10104, "出/到站已封站"),
    /** 无票或余票不足 */
    NO_TICKET_OR_INSUFFICIENT(10105, "无票或余票不足"),
    /** 车次不存在 */
    TRAIN_NOT_EXIST(10106, "车次不存在"),
    /** 指定坐席位置无法满足 */
    SEAT_NOT_SUITABLE(10107, "指定坐席位置无法满足"),

    // ========== 供应商角度原因 ==========
    /** 紧急单,来不及处理 */
    SUPPLIER_URGENT_ORDER(10201, "紧急单,来不及处理"),
    /** 票机故障或车站临检,暂时无法处理 */
    SUPPLIER_EQUIPMENT_FAULT(10202, "票机故障或车站临检,暂时无法处理"),
    /** 乘车人姓名与票机默认不一致 */
    SUPPLIER_NAME_MISMATCH(10203, "乘车人姓名与票机默认不一致"),
    /** 价格不符 */
    SUPPLIER_PRICE_MISMATCH(10204, "价格不符"),
    /** 客户要求取消 */
    SUPPLIER_CUSTOMER_CANCEL(10205, "客户要求取消"),

    // ========== 12306原因 ==========
    /** 12306系统升级中 */
    SYSTEM_12306_UPGRADING(10301, "12306系统升级中"),
    /** 12306存在待支付订单 */
    SYSTEM_12306_PENDING_ORDER(10302, "12306存在待支付订单"),
    /** 当日取消次数已达上限,建议明日或线下办理预定 */
    SYSTEM_12306_DAILY_CANCEL_LIMIT(10303, "当日取消次数已达上限,建议明日或线下办理预订"),

    SYSTEM_12306_PAY_ACCOUNT_LIMIT(10304, "支付账号被12306限制,建议明日或线下办理预订"),

    // ========== 其他原因 ==========
    /** 系统繁忙 */
    SYSTEM_BUSY(10401, "系统繁忙"),
    /** 其他原因 */
    OTHER_REASON(10402, "其他");

    private final int code;
    private final String message;

    TrainOrderTicketFailEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 根据错误码获取枚举
     *
     * @param code 错误码
     * @return 对应的枚举值,未找到则返回null
     */
    public static TrainOrderTicketFailEnum getByCode(int code) {
        for (TrainOrderTicketFailEnum failEnum : values()) {
            if (failEnum.getCode() == code) {
                return failEnum;
            }
        }
        return null;
    }
}

# 改签失败枚举(新增支付账号被12306限制code码)

public enum TrainRescheduleFailEnum {
    // ========== 乘车人原因 ==========
    /** 存在冲突行程 */
    PASSENGER_CONFLICT_TRIP(20001, "存在冲突行程"),
    /** 限制高消费 */
    PASSENGER_HIGH_CONSUMPTION_LIMIT(20002, "限制高消费"),
    /** 不可进京 */
    PASSENGER_BEIJING_RESTRICTED(20003, "不可进京"),

    // ========== 新车次原因 ==========
    /** 车次暂未起售 */
    NEW_TRAIN_NOT_ON_SALE(20101, "车次暂未起售"),
    /** 车次已停售 */
    NEW_TRAIN_SALE_STOPPED(20102, "车次已停售"),
    /** 所选新车次已停运 */
    NEW_TRAIN_SUSPENDED(20103, "所选新车次已停运"),
    /** 出/到站已封站 */
    NEW_TRAIN_STATION_CLOSED(20104, "出/到站已封站"),
    /** 无票或余票不足 */
    NEW_TRAIN_NO_TICKET_OR_INSUFFICIENT(20105, "无票或余票不足"),
    /** 指定坐席位置无法满足 */
    NEW_TRAIN_SEAT_NOT_SUITABLE(20106, "指定坐席位置无法满足"),

    // ========== 原车次/票原因(改签特有) ==========
    /** 车次具有原退含义,无法改签 */
    ORIGINAL_TRAIN_REFUND_MEANING(20201, "车次具有原退含义,无法改签"),
    /** 变更到站需不晚于原票开车前48小时办理 */
    ORIGINAL_TRAIN_48H_LIMIT(20202, "变更到站需不晚于原票开车前48小时办理"),
    /** 已过改签时间,无法改签 */
    ORIGINAL_TRAIN_RESCHEDULE_TIME_EXPIRED(20203, "已过改签时间,无法改签"),
    /** 已取票,无法改签 */
    ORIGINAL_TRAIN_TICKET_COLLECTED(20204, "已取票,无法改签"),
    /** 已改签,无法重复改签 */
    ORIGINAL_TRAIN_ALREADY_RESCHEDULED(20205, "已改签,无法重复改签"),
    /** 已退票,无法改签 */
    ORIGINAL_TRAIN_ALREADY_REFUNDED(20206, "已退票,无法改签"),
    /** 已在改签中无法改签 */
    ORIGINAL_TRAIN_RESCHEDULING_IN_PROGRESS(20207, "已在改签中无法改签"),
    /** 无法办理推迟乘车日期的改签(发车前48h以内改签) */
    ORIGINAL_TRAIN_DELAY_RESCHEDULE_LIMIT(20208, "无法办理推迟乘车日期的改签(发车前48h以内改签)"),
    /** 原票信息(车次、车厢、座位、证件、票价)不符 */
    ORIGINAL_TRAIN_INFO_MISMATCH(20209, "原票信息(车次、车厢、座位、证件、票价)不符"),
    /** 跨境车票无法代改 */
    ORIGINAL_TRAIN_CROSS_BORDER(20210, "跨境车票无法代改"),
    /** 此类车票无法批量改签 */
    ORIGINAL_TRAIN_NO_BATCH_RESCHEDULE(20211, "此类车票无法批量改签"),
    /** 查无信息,可能已退票或改签 */
    ORIGINAL_TRAIN_NO_INFO_FOUND(20212, "查无信息,可能已退票或改签"),

    // ========== 供应商角度原因 ==========
    /** 紧急单,来不及处理 */
    SUPPLIER_URGENT_ORDER(20301, "紧急单,来不及处理"),
    /** 票机故障或车站临检,暂时无法处理 */
    SUPPLIER_EQUIPMENT_FAULT(20302, "票机故障或车站临检,暂时无法处理"),
    /** 乘车人姓名与票机默认不一致 */
    SUPPLIER_NAME_MISMATCH(20303, "乘车人姓名与票机默认不一致"),
    /** 价格不符 */
    SUPPLIER_PRICE_MISMATCH(20304, "价格不符"),
    /** 客户要求取消 */
    SUPPLIER_CUSTOMER_CANCEL(20305, "客户要求取消"),

    // ========== 12306原因 ==========
    /** 12306系统升级中 */
    SYSTEM_12306_UPGRADING(20401, "12306系统升级中"),
    /** 12306存在待支付订单 */
    SYSTEM_12306_PENDING_ORDER(20402, "12306存在待支付订单"),
    /** 当日取消次数已达上限,建议明日或线下办理改签 */
    SYSTEM_12306_DAILY_CANCEL_LIMIT(20403, "当日取消次数已达上限,建议明日或线下办理改签"),

    SYSTEM_12306_PAY_ACCOUNT_LIMIT(20404, "支付账号被12306限制,建议明日或线下办理改签"),

    // ========== 其他原因 ==========
    /** 系统繁忙 */
    SYSTEM_BUSY(20501, "系统繁忙"),
    /** 其他原因 */
    OTHER_REASON(20502, "其他");

    private final int code;
    private final String message;

    TrainRescheduleFailEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 根据错误码获取枚举
     *
     * @param code 错误码
     * @return 对应的枚举值,未找到则返回null
     */
    public static TrainRescheduleFailEnum getByCode(int code) {
        for (TrainRescheduleFailEnum failEnum : values()) {
            if (failEnum.getCode() == code) {
                return failEnum;
            }
        }
        return null;
    }
}

# 退票失败枚举

public enum TrainRefundFailEnum {
    // ========== 乘车人原因 ==========
    /** 存在冲突行程 */
    PASSENGER_CONFLICT_TRIP(30001, "存在冲突行程"),
    /** 限制高消费 */
    PASSENGER_HIGH_CONSUMPTION_LIMIT(30002, "限制高消费"),
    /** 不可进京 */
    PASSENGER_BEIJING_RESTRICTED(30003, "不可进京"),

    // ========== 原车次/票原因(退票特有) ==========
    /** 已过退票时间,无法退票 */
    ORIGINAL_TRAIN_REFUND_TIME_EXPIRED(30101, "已过退票时间,无法退票"),
    /** 已取票,无法退票 */
    ORIGINAL_TRAIN_TICKET_COLLECTED(30102, "已取票,无法退票"),
    /** 已改签,无法退票 */
    ORIGINAL_TRAIN_ALREADY_RESCHEDULED(30103, "已改签,无法退票"),
    /** 已退票,无法重复退票 */
    ORIGINAL_TRAIN_ALREADY_REFUNDED(30104, "已退票,无法重复退票"),
    /** 车次停运,无法代退票 */
    ORIGINAL_TRAIN_SUSPENDED_NO_REFUND(30105, "车次停运,无法代退票"),
    /** 车次晚点,无法代退票 */
    ORIGINAL_TRAIN_DELAYED_NO_REFUND(30106, "车次晚点,无法代退票"),
    /** 原票信息(车次、车厢、座位、证件、票价)不符 */
    ORIGINAL_TRAIN_INFO_MISMATCH(30107, "原票信息(车次、车厢、座位、证件、票价)不符"),
    /** 跨境车票无法代退 */
    ORIGINAL_TRAIN_CROSS_BORDER(30108, "跨境车票无法代退"),
    /** 查无信息,可能已退票或改签 */
    ORIGINAL_TRAIN_NO_INFO_FOUND(30109, "查无信息,可能已退票或改签"),

    // ========== 供应商角度原因 ==========
    /** 紧急单,来不及处理 */
    SUPPLIER_URGENT_ORDER(30201, "紧急单,来不及处理"),
    /** 票机故障或车站临检,暂时无法处理 */
    SUPPLIER_EQUIPMENT_FAULT(30202, "票机故障或车站临检,暂时无法处理"),
    /** 乘车人姓名与票机默认不一致 */
    SUPPLIER_NAME_MISMATCH(30203, "乘车人姓名与票机默认不一致"),
    /** 价格不符 */
    SUPPLIER_PRICE_MISMATCH(30204, "价格不符"),
    /** 客户要求取消 */
    SUPPLIER_CUSTOMER_CANCEL(30205, "客户要求取消"),

    // ========== 12306原因 ==========
    /** 12306系统升级中 */
    SYSTEM_12306_UPGRADING(30301, "12306系统升级中"),
    /** 12306存在待支付订单 */
    SYSTEM_12306_PENDING_ORDER(30302, "12306存在待支付订单"),

    // ========== 其他原因 ==========
    /** 系统繁忙 */
    SYSTEM_BUSY(30401, "系统繁忙"),
    /** 其他原因 */
    OTHER_REASON(30402, "其他");

    private final int code;
    private final String message;

    TrainRefundFailEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    /**
     * 根据错误码获取枚举
     *
     * @param code 错误码
     * @return 对应的枚举值,未找到则返回null
     */
    public static TrainRefundFailEnum getByCode(int code) {
        for (TrainRefundFailEnum failEnum : values()) {
            if (failEnum.getCode() == code) {
                return failEnum;
            }
        }
        return null;
    }
}

# 出退改针对账号原因导致失败的相关枚举

public enum TrainAccountOperateStatus {
    // 成功状态
    SUCCESS(0, "登录成功"),

    // 系统错误类 (40001-40003)
    SYSTEM_ERROR_RETRY(40001, "系统繁忙,请稍后进行重试"),
    SYSTEM_MAINTENANCE(40002, "12306系统维护,请稍后进行重试"),
    OPERATION_FAILED(40003, "操作失败,不可重试"),

    // 账号相关错误类 (40101-40109)
    INVALID_CREDENTIALS(40101, "账户用户名及密码错误"),
    ACCOUNT_LOCKED(40102, "账户被锁定,请前往12306app解封"),
    VERIFICATION_PHOTO_REQUIRED(40103, "账号异常,请通过人脸照片进行核验"),
    VERIFICATION_VIDEO_REQUIRED(40104, "账号异常,请通过人脸视频进行核验"),
    VERIFICATION_SMS_REQUIRED(40105, "账号异常,请通过短信进行核验"),
    SMS_VERIFICATION_FAILED(40106, "账号异常,短信验证码核验失败,请重新回填"),
    PHOTO_VERIFICATION_FAILED(40107, "账号异常,人脸照片核验失败,请重新核验"),
    VIDEO_VERIFICATION_FAILED(40108, "账号异常,人脸视频核验失败,请重新核验"),
    DAILY_VERIFICATION_LIMIT(40109, "账号异常,当日已无法核验,请第二天重试"),

    // 乘车人相关错误类 (40201-40209)
    PASSENGER_PHONE_VERIFICATION_FAILED(40201, "乘车人手机号核验未通过,请进行检查"),
    PASSENGER_ID_VERIFICATION_FAILED(40202, "乘车人身份信息未核验通过,请进行检测或联系12306咨询"),
    PASSENGER_MODIFICATION_FAILED_LIMIT(40203, "添加修改失败,常用乘车人数量已超过上限,请删除乘客后重试"),
    PASSENGER_MODIFICATION_FAILED_DUPLICATE(40204, "添加修改失败,常用乘车人存在重复,请重新检查"),
    PASSENGER_DELETE_FAILED_MAIN(40205, "删除失败,主乘车人不能删除"),
    PASSENGER_DELETE_FAILED_INVALID(40206, "删除失败,该乘客不允许删除"),
    PASSENGER_DELETE_FAILED_NOT_EXIST(40207, "删除失败,该乘车人不存在"),
    PASSENGER_DELETE_FAILED_TIME_LIMIT(40208, "删除失败,由于添加时间限制,该乘客不允许删除"),
    PASSENGER_MODIFY_FAILED_MAIN(40209, "修改失败,主乘车人不能修改"),

    // 其他错误类 (40301)
    OTHER_ERROR(40301, "其他原因");

    private final int code;
    private final String desc;


    public static TrainAccountOperateStatus getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (TrainAccountOperateStatus status : values()) {
            if (status.getCode() == code) {
                return status;
            }
        }
        return null;
    }


    /**
     * 判断是否为成功状态
     *
     * @return true-成功,false-失败
     */
    public boolean isSuccess() {
        return SUCCESS.equals(this);
    }

    /**
     * 判断是否是登录相关的失败
     *
     * @param code 错误码
     * @return true-登录相关失败,false-非登录相关失败
     */
    public static boolean isLoginStatus(Integer code) {
        if (code == null) {
            return false;
        }
        TrainAccountOperateStatus status = getByCode(code);
        if (status == null) {
            return false;
        }

        // 账号相关错误类 (40101-40109) 都属于登录相关失败
        return status == INVALID_CREDENTIALS ||
                status == ACCOUNT_LOCKED ||
                status == VERIFICATION_PHOTO_REQUIRED ||
                status == VERIFICATION_VIDEO_REQUIRED ||
                status == VERIFICATION_SMS_REQUIRED ||
                status == SMS_VERIFICATION_FAILED ||
                status == PHOTO_VERIFICATION_FAILED ||
                status == VIDEO_VERIFICATION_FAILED ||
                status == DAILY_VERIFICATION_LIMIT;
    }

    /**
     * 判断是否是乘车人相关的失败
     *
     * @param code 错误码
     * @return true-乘车人相关失败,false-非乘车人相关失败
     */
    public static boolean isPassengerStatus(Integer code) {
        if (code == null) {
            return false;
        }
        TrainAccountOperateStatus status = getByCode(code);
        if (status == null) {
            return false;
        }

        // 乘车人相关错误类 (40201-40209) 都属于乘车人相关失败
        return status == PASSENGER_PHONE_VERIFICATION_FAILED ||
                status == PASSENGER_ID_VERIFICATION_FAILED ||
                status == PASSENGER_MODIFICATION_FAILED_LIMIT ||
                status == PASSENGER_MODIFICATION_FAILED_DUPLICATE ||
                status == PASSENGER_DELETE_FAILED_MAIN ||
                status == PASSENGER_DELETE_FAILED_INVALID ||
                status == PASSENGER_DELETE_FAILED_NOT_EXIST ||
                status == PASSENGER_DELETE_FAILED_TIME_LIMIT ||
                status == PASSENGER_MODIFY_FAILED_MAIN;
    }

}
上次更新: 9/22/2026, 4:55:12 PM