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

# 总体说明

接口采用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/RestfulService/holdseat POST json http://xxxxxx.com为合作商可访问域名

# 1.1.2 业务输入参数

# (1)参数说明

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

# BookingOrderParam参数说明

参数名 是否必传 参数类型 参数说明
orderId String 美团的订单号,中转时为子单号
isAcceptNoSeat Boolean 是否接受无座 true:接受无座票 false:不接受无座票,传值为空默认不接受
isAcceptOtherSeats Boolean 是否接受其他座位,true:接受其他座位,false:不接受其他座位
chooseSeats String 选座的座位1A1B1C2A2B
seatType String 坐席类型,定义参照附录【坐席类型枚举】第二列
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 业务输出参数

# (1)参数说明

参数名 是否必传 参数类型 参数说明
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/RestfulService/trainOrder POST json http://xxxxxx.com为合作商可访问域名

# 1.2.2 业务输入参数

# (1) 参数说明

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

PayOrderParam参数说明:

参数名 是否必传 参数类型 参数说明
orderId String 美团的(子)订单号

# 1.2.3 业务输出参数

# (1) 参数说明

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

# 1.3 改签下单

# 1.3.1 接口说明

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

# 1.3.2 业务输入参数

# (1) 参数说明

参数名 是否必传 参数类型 参数说明
orderId String 美团订单号,中转时为父单号
subOrderId(新增) String 美团(子)订单号
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 业务输出参数

# (1) 参数说明

参数名 是否必传 参数类型 参数说明
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/RestfulService/confirmResign POST json http://xxxxxx.com为合作商可访问域名

# 1.4.2 业务输入参数

# (1) 参数说明

参数名 是否必传 参数类型 参数说明
serviceId String 美团改签id
orderId String 美团订单号,中转时为父单号
subOrderId(新增) String 美团(子)订单号
payEndTime String 出票截止时间,格式2020-02-19 20:25:00
ts Long 13位时间戳。若请求发起时间与平台接受请求时间相差大于10分钟,平台将直接拒绝本次请求 示例:1617085650321

# 1.4.3 业务输出参数

# (1) 参数说明

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

# 1.5 订单取消

# 1.5.1 接口说明

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

# 1.5.2 业务输入参数

# (1) 参数说明

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

# 1.5.3 业务输出参数

# (1) 参数说明

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

# 1.6 取消改签申请

# 1.6.1 接口说明

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

# 1.6.2 业务输入参数

# (1) 参数说明

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

# 1.6.3 业务输出参数

# (1) 参数说明

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

# 1.7 申请退票

# 1.7.1 接口说明

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

# 1.7.2 业务输入参数

参数名 是否必传 参数类型 参数说明
orderId String 美团订单号,中转时为父单号
subOrderId(新增) String 美团(子)订单号
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 车票类型,对应附录【车票类型枚举】中文
faceImg String 图片格式 iv:encryptData,iv:base64编码过的12位byte,encryptData: 先将图片使用AES GCM 256 加密,再通过base64编码,解密代码见附录

# 1.7.3 业务输出参数

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

# 1.8 占座/锁单异步回调

# 1.8.1 接口说明

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

# 1.8.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 是否是登录模式,如不传默认为false免登
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.8.3 业务输出参数

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

# Data

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

# 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 固定传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 是否是登录模式,如不传默认为false免登
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.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 固定传30
orderId String 美团订单id,中转订单为父单号
subOrderIds(新增) List<String> 美团子订单号
orderType(新增) String 1-直达,2-中转
partnerOrderId String 供应商订单号
login Boolean 是否是登录模式,如不传默认为false免登
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.10.3 业务输出参数

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

Data参数说明:

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

# 1.11 改签确认回调

# 1.11.1 接口说明

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

# 1.11.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts long 请求时间戳
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 是否是登录模式,如不传默认为false免登
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.11.3 业务输出参数

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

Data参数说明:

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

# 1.12 退票结果回调

# 1.12.1 接口说明

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

# 1.12.2 业务输入参数

参数名 是否必传 参数类型 参数说明
ts long 请求时间戳
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 是否是登录模式,如不传默认为false免登
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.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 固定传80
orderId String 美团订单id,中转订单为父单号
subOrderId(新增) String 美团子订单号,中转时必填
orderType(新增) String 1-直达,2-中转
orderId12306 String 12306订单号
serviceId String 服务单id(唯一标识)
totalAmount Integer 退款总金额
login Boolean 是否是登录模式,如不传默认为false免登
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.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 固定传20
orderId String 美团订单id,中转订单为父单号
subOrderIds(新增) List<String> 美团子订单号
orderType(新增) String 1-直达,2-中转
orderId12306 String 12306订单号
partnerOrderId String 供应商订单号
login Boolean 是否是登录模式,如不传默认为false免登
noticeSuccess Boolean 是否取消成功
failCode String 失败必传,参考【出票/占座失败枚举】(枚举为失败原因分类,failMsg可填详细失败原因)
failMsg String 失败详细原因

# 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 partnerId是代理商code

# 1.15.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 是否是登录模式,如不传默认为false免登
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 接口说明

url uri method 参数类型 说明
http://agentgateway-train.meituan.com/{partnerId}/ticketGateQuery xxx/ticketGateQuery POST json

# 1.16.2 业务输入参数

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

# 1.16.3 业务输出参数

名称 是否必传 类型 描述
status Integer 0:成功,非0:失败
msg String 查询失败原因
data QueryCheckInData 查询结果

QueryCheckInData参数说明:

名称 类型 必填 描述
result Integer Y 查询状态 (查询成功/查询失败)
ticketGate String Y 检票口

# 1.17 订单详情查询

# 1.17.1 接口说明

url uri method 参数类型 说明
http://agentgateway-train.meituan.com/{partnerId}/orderDetailQuery xxx/orderDetailQuery POST json

# 1.17.2 业务输入参数

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

# 1.17.3 业务输出参数

名称 是否必传 类型 描述
status Integer 0:成功,非0:失败
msg String 查询失败原因
data TrainOrderDetailDTO 查询结果

TrainOrderDetailDTO参数说明:

参数名 是否必传 类型 描述
orderId String 美团订单号,中转时为父单号
partnerId String 供应商id
partnerOrderId String 供应商订单号
orderStatus Integer 订单状态 2 待出票 3 出票成功 4 出票失败 5 已取消 8 待占座 9 占座成功 10 占座失败
orderId12306 String 12306订单号(取票号)
contactName String 联系人
contactPhone String 联系电话
outTicketTime String 出票时间,格式:yyyy-MM-dd HH:mm:ss
createTime String 订单创建时间,格式:yyyy-MM-dd HH:mm:ss
trainOrderTravelList List<OrderTravel> 车次,票等详细信息

OrderTravel参数说明:

参数名 是否必传 类型 描述
orderId(新增) String 美团子订单号
trainInfo TrainInfoDTO 车次信息
ticketInfoList List<TrainTicketAllInfoDTO> 具体出票退改相关信息

TrainInfoDTO参数说明:

参数名 是否必传 参数类型 参数说明
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 检票口

TrainTicketAllInfoDTO参数说明:

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

# 附录

# 证件类型枚举

证件类型 枚举值
二代身份证 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存在待支付订单"),
    /** 人脸核验不通过 */
    FACE_VERIFICATION_FAILED(30303, "人脸核验不通过"),
    /** 访问用户过多 */
    TOO_MANY_USERS(30304, "访问用户过多"),
    
    // ========== 其他原因 ==========
    /** 系统繁忙 */
    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 static byte[] decryptWithAesGcm(String encryptedText, String secretKey) throws Exception {
        // 1. 验证输入参数
        if (encryptedText == null || encryptedText.isEmpty()) {
            throw new IllegalArgumentException("加密文本不能为空");
        }

        if (secretKey == null || secretKey.isEmpty()) {
            throw new IllegalArgumentException("密钥不能为空");
        }

        // 2. 分离IV和密文
        String[] parts = encryptedText.split(":");
        if (parts.length != 2) {
            throw new IllegalArgumentException("密文格式不正确,应为 'IV:密文' 格式");
        }

        // 3. Base64解码IV和密文
        byte[] iv = Base64.getDecoder().decode(parts[0]);
        byte[] cipherText = Base64.getDecoder().decode(parts[1]);

        // 4. 验证IV长度
        if (iv.length != IV_LENGTH) {
            throw new IllegalArgumentException("IV长度不正确,应为 " + IV_LENGTH + " 字节");
        }

        // 5. Base64解码密钥
        byte[] keyBytes = Base64.getDecoder().decode(secretKey);

        // 6. 创建密钥规范
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

        // 7. 创建GCM参数规范
        GCMParameterSpec gcmSpec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);

        // 8. 获取Cipher实例并初始化
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec);

        // 9. 执行解密操作
        return cipher.doFinal(cipherText);
    }
上次更新: 8/18/2026, 3:21:42 PM