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

# 总体说明

接口采用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> 下单入参,支持单程
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:先占座

# 1.2 申请出票

# 1.2.1 接口说明

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

# 1.2.2 业务输入参数

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

PayOrderParam参数说明:

参数名 是否必传 参数类型 参数说明
orderId 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 美团订单号
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 美团订单号
userName String 12306账号
userPassword String 12306密码
payEndTime String 出票截止时间,格式2020-02-19 20:25:00
ts Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

# 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 美团订单号
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 美团订单id
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 美团订单id
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
orderId12306 String 12306账号
partnerOrderId String 供应商订单号
login Boolean 是否是登录模式
noticeSuccess boolean 是否占座成功
payLimitTime Long 真实占座成功必传,支付截止时间
failCode String 失败必传,参考【出票/占座失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg String 供应商侧失败的详细原因
realHoldSeat boolean 是否真实占座,如是真实占座,占座成功需要有票信息
orderAmount long 车票总金额,单位:分
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.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
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 请求时间戳
partnerCode Integer 美团给供应商分配的code
noticeBizType Integer 固定传30
orderId String 美团订单号
partnerOrderId String 供应商订单号
login Boolean 是否是登录模式
noticeSuccess boolean 出票是否成功
orderId12306 String 12306订单号(短票号)
failCode String 失败必传,参考【出票/占座失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg String 供应商侧失败的详细原因
orderAmount Integer 订单总金额,单位:分
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 请求时间戳
partnerCode Integer 美团给供应商分配的code
noticeBizType Integer 固定传60
orderId String 美团订单id
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 请求时间戳
partnerCode Integer 美团给供应商分配的code
noticeBizType Integer 固定传70
orderId String 美团订单id
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 请求时间戳
partnerCode Integer 美团给供应商分配的code
noticeBizType Integer 固定传80
orderId String 美团订单id
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
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
serviceId String 改签服务单id
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
外国护照 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;
    }
}

# 出票/占座失败枚举

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_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;
    }
}

# 改签失败枚举

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_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;
    }

}
上次更新: 11/17/2025, 9:09:26 PM