火车票模块在提供余票查询、经停站查询等API数据查询服务同时,亦向开发者提供了预订下单、支付出票、退票、改签等API预订服务。从而帮助开发者在自己的平台上完成从查询到预订到退改一条龙服务(PS:API预订服务是作为增值服务提供给开发者,非必选接入项,开发者有自己的出票渠道亦可使用自己的)。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| fromStation | string | 是 | 出发火车站名称 |
| toStation | string | 是 | 到达火车站名称 |
| fromDate | date | 是 | 出发日期 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| trainLines | TrainLine[] | 查询到的车次列表,空表示没有满足查询条件的的列车 |
| trainCode | string | 车次,如 K257 |
| trainNo | string | 车次12306官方内部编号,如:250000K25724 (【查询经停站V2】接口中需要用到) |
| fromStation | string | 出发火车站名称 |
| toStation | string | 到达火车站名称 |
| fromTime | string | 出发时间(格式:HH:mm) |
| toTime | string | 到达时间(格式:HH:mm) |
| fromDateTime | string | 出发日期时间(格式:yyyy-MM-dd HH:mm) |
| toDateTime | string | 到达日期时间(格式:yyyy-MM-dd HH:mm) |
| arrive_days | string | 列车从出发站到达目的站的运行天数(0:当日到达,1:次日到达,2:三日到达,3:四日到达,依此类推) |
| runTime | string | 历时时间,格式HH:mm,如10:40表示历时10小时40分钟 |
| trainsType | int | 车次类型(高铁 = 1, 动车 = 2,直达 = 3,特快 = 4,快速 = 5,其他 = 99) |
| trainsTypeName | string | 车次类型名称(和trainsType对应) |
| beginStation | string | 始发站(可选) |
| beginTime | string | 始发时间(格式:HH:mm) |
| endStation | string | 终点站 |
| endTime | string | 终点时间(格式:HH:mm) |
| isSupportChooseSleeper | bool | 是否支持 选铺服务(如剩余铺位无法满足您的需求,系统将自动为您分配),PS:不是所有卧铺12306都支持 选铺服务的。硬卧和二等卧 分上、中、下三个铺位;软卧、一等卧、动卧 、高级动卧 分上、下两个铺位 |
| isSupportChooseSeat | bool | 是否支持选座,目前仅支持高铁、动车类型的车次选座,具体以12306返回为准 |
| Seats | SeatInfo[] | 席别信息 |
| seatType | int | 席别类型(商务座 = 1,特等座 = 2,一等座 = 3,二等座 = 4,高级软卧 = 5,软卧 = 6,动卧 = 7 ,硬卧 = 8,软座 = 9,硬座 = 10,一等卧 = 11,二等卧 = 12,高级动卧 = 13, 一等软座 = 14 , 二等软座 = 15, 特等软座 = 16, 包厢硬卧 = 17, 一人软包 = 18, 多功能座 = 19,优选一等座 = 20, 无座 =98,其他 = 99) |
| seatTypeName | string | 席别名称(和seatType对应) |
| ticketPrice | float | 票价。注意:当seatType为卧铺类型时(如:硬卧、软卧、高级软卧等),该值返回的是上铺价格(其他铺别价格可通过otherSeats字段获取),订单实际支付金额以实际占位价格为准 |
| leftTicketNum | int | 票数 |
| otherSeats | SleeperSeatInfo[] | 上中下卧铺价格,当seatType为卧铺类型时(如:硬卧、软卧、高级软卧等),才有值。 |
| sleeperType | int | 铺别类型( 下铺 = 1 , 中铺 = 2 , 上铺 = 3 ) |
| sleeperTypeName | string | 铺别名称 |
| ticketPrice | float | 票价 |
{
"data": {
"trainLines": [
{
"trainCode": "K289",
"trainNo": "760000K2920K",
"fromStation": "苏州",
"toStation": "昆山",
"fromTime": "04:30",
"toTime": "04:54",
"fromDateTime": "2023-12-15 04:30",
"toDateTime": "2023-12-15 04:54",
"arrive_days": "0",
"runTime": "00:24",
"trainsType": 5,
"trainsTypeName": "快速",
"beginStation": "成都西",
"beginTime": null,
"endStation": "昆山",
"endTime": null,
"isSupportChooseSleeper": true,
"note": "",
"transferQueryExtraParams": null,
"sequence": 0,
"Seats": [
{
"seatType": 98,
"seatTypeName": "无座",
"ticketPrice": 9.0,
"leftTicketNum": 0,
"otherSeats": null
},
{
"seatType": 10,
"seatTypeName": "硬座",
"ticketPrice": 9.0,
"leftTicketNum": 183,
"otherSeats": null
},
{
"seatType": 8,
"seatTypeName": "硬卧",
"ticketPrice": 55.0,
"leftTicketNum": 108,
"otherSeats": [
{
"sleeperType": 3,
"sleeperTypeName": "上铺",
"ticketPrice": 55.0
},
{
"sleeperType": 2,
"sleeperTypeName": "中铺",
"ticketPrice": 60.0
},
{
"sleeperType": 1,
"sleeperTypeName": "下铺",
"ticketPrice": 63.0
}
]
},
{
"seatType": 6,
"seatTypeName": "软卧",
"ticketPrice": 81.5,
"leftTicketNum": 4,
"otherSeats": [
{
"sleeperType": 3,
"sleeperTypeName": "上铺",
"ticketPrice": 81.5
},
{
"sleeperType": 1,
"sleeperTypeName": "下铺",
"ticketPrice": 87.5
}
]
}
]
},
{
"trainCode": "G8293",
"trainNo": "5f000G829601",
"fromStation": "苏州",
"toStation": "昆山南",
"fromTime": "22:20",
"toTime": "22:33",
"fromDateTime": "2023-12-15 22:20",
"toDateTime": "2023-12-15 22:33",
"arrive_days": "0",
"runTime": "00:13",
"trainsType": 1,
"trainsTypeName": "高铁",
"beginStation": "盐城",
"beginTime": null,
"endStation": "上海",
"endTime": null,
"isSupportChooseSleeper": false,
"note": "",
"transferQueryExtraParams": null,
"sequence": 0,
"Seats": [
{
"seatType": 98,
"seatTypeName": "无座",
"ticketPrice": 14.0,
"leftTicketNum": 0,
"otherSeats": null
},
{
"seatType": 4,
"seatTypeName": "二等座",
"ticketPrice": 14.0,
"leftTicketNum": 186,
"otherSeats": null
},
{
"seatType": 3,
"seatTypeName": "一等座",
"ticketPrice": 23.0,
"leftTicketNum": 0,
"otherSeats": null
},
{
"seatType": 1,
"seatTypeName": "商务座",
"ticketPrice": 49.0,
"leftTicketNum": 0,
"otherSeats": null
}
]
}
]
},
"success": true,
"msg": "请求成功"
}
已废弃,请使用【查询经停站V2】
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainCode | string | 是 | 车次 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| stationId | int | 途经站序号,从1开始 |
| stationName | string | 站名称 |
| arriveTime | string | 到站时间(格式:HH;mm) |
| startTime | string | 发车时间(格式:HH;mm) |
| interval | string | 列车在站台停车时间,单位为分钟 |
{
"data": [
{
"stationId": "1",
"stationName": "上海虹桥",
"arriveTime": "----",
"startTime": "07:22",
"interval": "----"
},
{
"stationId": "2",
"stationName": "苏州北",
"arriveTime": "07:46",
"startTime": "07:48",
"interval": "2"
},
{
"stationId": "3",
"stationName": "无锡东",
"arriveTime": "07:58",
"startTime": "08:00",
"interval": "2"
},
{
"stationId": "4",
"stationName": "常州北",
"arriveTime": "08:17",
"startTime": "08:19",
"interval": "2"
},
{
"stationId": "5",
"stationName": "镇江南",
"arriveTime": "08:36",
"startTime": "08:46",
"interval": "10"
},
{
"stationId": "6",
"stationName": "南京南",
"arriveTime": "09:04",
"startTime": "09:06",
"interval": "2"
},
{
"stationId": "7",
"stationName": "定远",
"arriveTime": "09:37",
"startTime": "09:39",
"interval": "2"
},
{
"stationId": "8",
"stationName": "徐州东",
"arriveTime": "10:27",
"startTime": "10:29",
"interval": "2"
},
{
"stationId": "9",
"stationName": "枣庄",
"arriveTime": "10:47",
"startTime": "10:49",
"interval": "2"
},
{
"stationId": "10",
"stationName": "济南西",
"arriveTime": "11:40",
"startTime": "11:42",
"interval": "2"
},
{
"stationId": "11",
"stationName": "天津南",
"arriveTime": "12:45",
"startTime": "12:49",
"interval": "4"
},
{
"stationId": "12",
"stationName": "北京南",
"arriveTime": "13:23",
"startTime": "13:23",
"interval": "----"
}
],
"success": true,
"msg": "请求成功"
}
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 您申请的接口账号APPKEY |
| trainCode | string | 是 | 车次,如 G1905 |
| trainNo | string | 是 | 12306车次内部编号,如:38000G19050B (也是余票查询接口返回的,和trainCode一起返回的 ) |
| fromDate | string | 是 | 出发日期(格式:yyyy-MM-dd) |
| fromStation | string | 是 | 出发站名称 |
| toStation | string | 是 | 到达站名称 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| stationId | int | 途经站序号,从1开始 |
| stationName | string | 站名称 |
| arriveTime | string | 到站时间(格式:HH;mm) |
| startTime | string | 发车时间(格式:HH;mm) |
| interval | string | 列车在站台停车时间,单位为分钟 |
{
"data": [
{
"stationId": "1",
"stationName": "天津",
"arriveTime": "16:17",
"startTime": "16:17",
"interval": "----"
},
{
"stationId": "2",
"stationName": "静海",
"arriveTime": "17:00",
"startTime": "17:03",
"interval": "3分钟"
},
{
"stationId": "3",
"stationName": "沧州",
"arriveTime": "17:45",
"startTime": "17:48",
"interval": "3分钟"
},
{
"stationId": "4",
"stationName": "泊头",
"arriveTime": "18:12",
"startTime": "18:15",
"interval": "3分钟"
},
{
"stationId": "5",
"stationName": "德州",
"arriveTime": "19:10",
"startTime": "19:40",
"interval": "30分钟"
},
{
"stationId": "6",
"stationName": "衡水",
"arriveTime": "20:29",
"startTime": "20:32",
"interval": "3分钟"
},
{
"stationId": "7",
"stationName": "石家庄北",
"arriveTime": "22:03",
"startTime": "22:09",
"interval": "6分钟"
},
{
"stationId": "8",
"stationName": "邯郸",
"arriveTime": "00:59",
"startTime": "01:02",
"interval": "3分钟"
},
{
"stationId": "9",
"stationName": "安阳",
"arriveTime": "01:47",
"startTime": "01:51",
"interval": "4分钟"
},
{
"stationId": "10",
"stationName": "鹤壁",
"arriveTime": "02:18",
"startTime": "02:28",
"interval": "10分钟"
},
{
"stationId": "11",
"stationName": "新乡",
"arriveTime": "03:07",
"startTime": "03:10",
"interval": "3分钟"
},
{
"stationId": "12",
"stationName": "郑州",
"arriveTime": "04:50",
"startTime": "05:19",
"interval": "29分钟"
},
{
"stationId": "13",
"stationName": "南阳",
"arriveTime": "09:59",
"startTime": "10:06",
"interval": "7分钟"
},
{
"stationId": "14",
"stationName": "襄阳",
"arriveTime": "11:47",
"startTime": "12:15",
"interval": "28分钟"
},
{
"stationId": "15",
"stationName": "谷城",
"arriveTime": "13:09",
"startTime": "13:12",
"interval": "3分钟"
},
{
"stationId": "16",
"stationName": "十堰",
"arriveTime": "14:13",
"startTime": "14:20",
"interval": "7分钟"
},
{
"stationId": "17",
"stationName": "白河东",
"arriveTime": "15:17",
"startTime": "15:19",
"interval": "2分钟"
},
{
"stationId": "18",
"stationName": "蜀河",
"arriveTime": "15:47",
"startTime": "15:49",
"interval": "2分钟"
},
{
"stationId": "19",
"stationName": "旬阳",
"arriveTime": "16:15",
"startTime": "16:19",
"interval": "4分钟"
},
{
"stationId": "20",
"stationName": "安康",
"arriveTime": "16:56",
"startTime": "17:04",
"interval": "8分钟"
},
{
"stationId": "21",
"stationName": "汉阴",
"arriveTime": "17:43",
"startTime": "17:45",
"interval": "2分钟"
},
{
"stationId": "22",
"stationName": "石泉县",
"arriveTime": "18:11",
"startTime": "18:13",
"interval": "2分钟"
},
{
"stationId": "23",
"stationName": "西乡",
"arriveTime": "18:44",
"startTime": "18:46",
"interval": "2分钟"
},
{
"stationId": "24",
"stationName": "城固",
"arriveTime": "19:16",
"startTime": "19:21",
"interval": "5分钟"
},
{
"stationId": "25",
"stationName": "汉中",
"arriveTime": "19:45",
"startTime": "19:53",
"interval": "8分钟"
},
{
"stationId": "26",
"stationName": "勉县",
"arriveTime": "20:21",
"startTime": "20:23",
"interval": "2分钟"
},
{
"stationId": "27",
"stationName": "阳平关",
"arriveTime": "21:21",
"startTime": "21:24",
"interval": "3分钟"
},
{
"stationId": "28",
"stationName": "广元",
"arriveTime": "22:58",
"startTime": "23:13",
"interval": "15分钟"
},
{
"stationId": "29",
"stationName": "成都西",
"arriveTime": "04:58",
"startTime": "05:36",
"interval": "38分钟"
},
{
"stationId": "30",
"stationName": "峨眉",
"arriveTime": "07:30",
"startTime": "07:30",
"interval": "----"
}
],
"success": true,
"msg": "请求成功"
}
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 您申请的APPKEY |
| fromStation | string | 是 | 出发火车站名称 |
| toStation | string | 是 | 到达火车站名称 |
| fromDate | string | 是 | 出发日期 (格式:yyyy-MM-dd, 如: 2024-09-15) |
| resultIndex | int | 否 | 页码 0: 0-10条 10:10-20条 20:20-30条 / 字段不传值查询所有 |
| customizedTransfer | ReqCustomizedTransfer 对象类型 | 否 | 可选参数,定制中转时必传(详见12306的定制中转)(PS: 所谓的定制中转,就是用户可以指定中转车站、换乘时长等条件 ) |
| transferStation | string | 是 | 中转城市/站,定制中转时中转城市/站必传 |
| fromTimeRange | string | 否 | 出发时段,可为空。单选:1:(00:00-08:00)、2:(08:00-14:00)、3:(14:00-19:00)、4:(19:00-24:00) 。比如选择出发时段(08:00-14:00)的车次,传 "2"即可 |
| transferDuration | string | 否 | 换乘时长,单选 可为空 。默认不限 ,1:10-20分钟、2:20-40分钟、3:40-60分钟:4:60-90分钟:5:90-120分钟:6:2-4小时 7:4-8小时 8:大于8小时 |
| trainClass | string | 否 | 车次类型,多选 可为空、1:普通车(如Z/T/K打头的车次)、2:高铁/动车(C/G/D打头的车次)、 3:普通车+高铁/动车,支持多选,英文逗号分隔,默认空 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| resultIndex | int | 目前已返回组合数(含之前返回的) |
| canQuery | bool | 是否有下一页 |
| transferCombinationList | TransferCombination类型的对象数组 | 中转组合列表 |
| fromStation | string | 出发火车站名称 |
| toStation | string | 到达火车站名称 |
| transferStation | string | 中转站。如果是同站换乘,中转站就一个车站,如果换站换乘则格式:站1-站2,如:武汉-汉口 |
| transferStopTime | string | 中转停留时间(接续时间),格式:01:56 ,表示1小时56分钟 |
| totalRuntime | string | 总历时,格式:08:41 ,表示8小时41分钟 |
| transferWay | string | 换乘方式(车内换座(同车换乘),同站换乘,同城换乘) |
| transferTrainLines | TrainLine[] | 中转车次信息(该字段数据类型为 车次类型对象数组,详见【车次余票查询接口】响应参数中trainLines字段注释)。PS:目前12306中转是只换乘一次的中转,所以在每个中转组合中有且只有两个火车车次,即该数组长度为2 |
{
"appKey": "换成 您申请的火车票接口APPKEY",
"fromStation": "合肥",
"toStation": "昆明",
"fromDate": "2025-01-20",
"customizedTransfer": {
"transferStation": "重庆",
"trainClass": "1,2"
}
}
{
"data": {
"resultIndex": 2,
"canQuery": false,
"transferCombinationList": [
{
"fromStation": "合肥南",
"toStation": "昆明南",
"transferStation": "重庆北-重庆西",
"transferStopTime": "02:44",
"totalRuntime": "15:02",
"transferWay": "同城换乘",
"transferTrainLines": [
{
"trainCode": "G4296",
"trainNo": null,
"fromStation": "合肥南",
"toStation": "重庆北",
"fromTime": "22:55",
"toTime": "06:21",
"fromDateTime": "2025-01-20 22:55",
"toDateTime": "2025-01-21 06:21",
"arrive_days": "1",
"runTime": "07:26",
"trainsType": 1,
"trainsTypeName": "高铁",
"beginStation": "上海虹桥",
"beginTime": null,
"endStation": "重庆北",
"endTime": null,
"isSupportChooseSleeper": false,
"isSupportChooseSeat": false,
"note": null,
"transferQueryExtraParams": "06|11|9MO|5l000G429700",
"sequence": 1,
"Seats": [
{
"seatType": 1,
"seatTypeName": "商务座",
"ticketPrice": 2623.5,
"leftTicketNum": 10,
"otherSeats": null
},
{
"seatType": 3,
"seatTypeName": "一等座",
"ticketPrice": 1328.0,
"leftTicketNum": 143,
"otherSeats": null
},
{
"seatType": 4,
"seatTypeName": "二等座",
"ticketPrice": 829.5,
"leftTicketNum": 200,
"otherSeats": null
}
]
},
{
"trainCode": "G2873",
"trainNo": null,
"fromStation": "重庆西",
"toStation": "昆明南",
"fromTime": "09:05",
"toTime": "13:57",
"fromDateTime": "2025-01-20 09:05",
"toDateTime": "2025-01-21 13:57",
"arrive_days": "0",
"runTime": "04:52",
"trainsType": 1,
"trainsTypeName": "高铁",
"beginStation": "重庆西",
"beginTime": null,
"endStation": "昆明南",
"endTime": null,
"isSupportChooseSleeper": false,
"isSupportChooseSeat": false,
"note": null,
"transferQueryExtraParams": "01|06|POM|77000G287307",
"sequence": 2,
"Seats": [
{
"seatType": 2,
"seatTypeName": "特等座",
"ticketPrice": 654.5,
"leftTicketNum": 2,
"otherSeats": null
},
{
"seatType": 4,
"seatTypeName": "二等座",
"ticketPrice": 351.5,
"leftTicketNum": 0,
"otherSeats": null
},
{
"seatType": 3,
"seatTypeName": "一等座",
"ticketPrice": 580.0,
"leftTicketNum": 161,
"otherSeats": null
}
]
}
]
},
{
"fromStation": "合肥",
"toStation": "昆明",
"transferStation": "重庆西",
"transferStopTime": "11:23",
"totalRuntime": "27:17",
"transferWay": "同站换乘",
"transferTrainLines": [
{
"trainCode": "G1886",
"trainNo": null,
"fromStation": "合肥",
"toStation": "重庆西",
"fromTime": "08:35",
"toTime": "19:21",
"fromDateTime": "2025-01-20 08:35",
"toDateTime": "2025-01-20 19:21",
"arrive_days": "0",
"runTime": "10:46",
"trainsType": 1,
"trainsTypeName": "高铁",
"beginStation": "南京南",
"beginTime": null,
"endStation": "重庆西",
"endTime": null,
"isSupportChooseSleeper": false,
"isSupportChooseSeat": false,
"note": null,
"transferQueryExtraParams": "02|20|9MO|5l000G188704",
"sequence": 1,
"Seats": [
{
"seatType": 1,
"seatTypeName": "商务座",
"ticketPrice": 2917.0,
"leftTicketNum": 1,
"otherSeats": null
},
{
"seatType": 3,
"seatTypeName": "一等座",
"ticketPrice": 1524.0,
"leftTicketNum": 0,
"otherSeats": null
},
{
"seatType": 4,
"seatTypeName": "二等座",
"ticketPrice": 951.5,
"leftTicketNum": 5,
"otherSeats": null
}
]
},
{
"trainCode": "G2841",
"trainNo": null,
"fromStation": "重庆西",
"toStation": "昆明",
"fromTime": "06:44",
"toTime": "11:52",
"fromDateTime": "2025-01-20 06:44",
"toDateTime": "2025-01-21 11:52",
"arrive_days": "0",
"runTime": "05:08",
"trainsType": 1,
"trainsTypeName": "高铁",
"beginStation": "重庆西",
"beginTime": null,
"endStation": "大理",
"endTime": null,
"isSupportChooseSleeper": false,
"isSupportChooseSeat": false,
"note": null,
"transferQueryExtraParams": "01|07|POM|77000G284104",
"sequence": 2,
"Seats": [
{
"seatType": 2,
"seatTypeName": "特等座",
"ticketPrice": 664.0,
"leftTicketNum": 0,
"otherSeats": null
},
{
"seatType": 4,
"seatTypeName": "二等座",
"ticketPrice": 357.0,
"leftTicketNum": 0,
"otherSeats": null
},
{
"seatType": 3,
"seatTypeName": "一等座",
"ticketPrice": 588.0,
"leftTicketNum": 8,
"otherSeats": null
}
]
}
]
}
]
},
"success": true,
"msg": "请求成功"
}
该接口用于获取全国所有火车站静态数据,接口调用一次即可,把信息保存在本地或入库。PS: 静态数据,切勿实时调用该接口,每天最多请求10次。(可用程序每周更新一次...)
| 参数名称 | 类型 | 必填 | 说明 |
|---|
| 参数名称 | 类型 | 说明 |
|---|---|---|
| stationName | string | 火车站名称 |
| stationShortChar | string | 火车站拼音简称 |
| stationPinYin | string | 火车站拼音全称 |
| stationCode | string | 火车站三字码 |
| cityName | string | 车站所在的地级城市名称 |
| isHot | bool | 是否热门车站(该值是我们平台自己定义和维护的,仅供参考,可自行挑选车站设为热门车站) |
{
"data": [
{
"stationName": "北京北",
"stationShortChar": "bjb",
"stationPinYin": "beijingbei",
"stationCode": "VAP",
"cityName": "北京",
"isHot": false
},
{
"stationName": "北京东",
"stationShortChar": "bjd",
"stationPinYin": "beijingdong",
"stationCode": "BOP",
"cityName": "北京",
"isHot": false
},
{
"stationName": "北京",
"stationShortChar": "bj",
"stationPinYin": "beijing",
"stationCode": "BJP",
"cityName": "北京",
"isHot": true
},
{
"stationName": "北京南",
"stationShortChar": "bjn",
"stationPinYin": "beijingnan",
"stationCode": "VNP",
"cityName": "北京",
"isHot": false
},
{
"stationName": "北京西",
"stationShortChar": "bjx",
"stationPinYin": "beijingxi",
"stationCode": "BXP",
"cityName": "北京",
"isHot": false
}
],
"success": true,
"msg": "请求成功"
}

此接口用于创单占座,创单结果同步返回,占座结果以异步反馈的结果为准 。只有占座成功方可进行“确认出票”(即支付)操作,占座失败交易关闭。下单前请确保用户12306账号登录成功,否则会占位失败。下单人数不能大于所选坐席的余票数,否则会占位失败。一单最多下9人。
占座成功后请及时支付,目前12306订单支付时限规则:30分钟以上的车次订单支付时限是10分钟,30分钟以内的车次支付时限为2分钟。超时未支付订单将自动取消。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| customerOrderNo | string | 否 | 商户订单号(即你们自己平台的本地订单号,用于双方订单关联映射。单号值必须唯一,否则会被系统判定为重复下单进行拦截) |
| contactName | string | 是 | 订单联系人 |
| contactMobile | string | 是 | 订单联系人手机号(后续订单出票、退改相关通知短信都是发送至此号码上,请务必填写正确、能联系上的手机号) |
| trainCode | string | 是 | 车次 |
| fromStation | string | 是 | 出发火车站名称 |
| toStation | string | 是 | 到达火车站名称 |
| fromDateTime | datetime | 是 | 出发日期时间,精确到分钟(如:2018-04-20 10:54) |
| toDateTime | datetime | 是 | 到达日期时间,精确到分钟(如:2018-04-20 14:13) |
| trainAccount | string | 是 | 用户12306登录账户-密文 |
| trainPassword | string | 是 | 用户12306登录密码-密文 |
| isChooseSeats | bool | 是 | 是否电子选座, true:选, false:不选, 目前仅支持高铁、动车类型车次选座,以12306为准,默认false |
| chooseSeats | string | 否 | 选座信息(选座个数要和乘客数量一致,如:1A1D2B2C2F 其中数字代表第几排 12306只能从2排10个位置中选择) |
| chooseSleeper | string | 是 | 选铺信息:三位阿拉伯数字组成 ( 第一位:下铺张数 100; 第二位:中铺张数 010; 第三位:上铺张数 000 ) ,如:203:代表2张下铺0张中铺3张上铺,不选:空或000 |
| isAcceptStanding | bool | 否 | 是否要无座字段,true要无座(不传时默认不要无座) |
| callBackUrl | string | 否 | 订单状态变更异步回调地址,回调详见:订单状态推送通知说明 |
| refundTicketCallbackUrl | string | 否 | 退票结果异步回调地址,回调详见:订单状态推送通知说明 |
| passengers | passenger[] | 是 | 乘客列表(数组) |
| name | string | 是 | 乘客姓名 |
| cardType | int | 是 | 证件类型( 身份证 = 1,护照 = 2, 港澳居民来往内地通行证 = 3 , 台湾居民来往大陆通行证 = 4 ,外国人永久居留身份证 = 8 ,港澳台居民居住证 = 9 ) |
| cardNo | string | 是 | 证件号码 |
| mobile | string | 是 | 乘客手机号(仅下单用,平台不会发送通知短信到乘客手机上,如需发送请开发者自行实现) |
| ticketType | int | 是 | 火车票票种( 成人票 = 1,儿童票 = 2, 学生票 = 3, 残军票 = 4) |
| seatType | int | 是 | 席别类型(商务座 = 1,特等座 = 2,一等座 = 3,二等座 = 4,高级软卧 = 5,软卧 = 6,动卧 = 7 ,硬卧 = 8,软座 = 9,硬座 = 10,一等卧 = 11,二等卧 = 12,高级动卧 = 13, 一等软座 = 14 , 二等软座 = 15, 特等软座 = 16, 包厢硬卧 = 17, 一人软包 = 18, 多功能座 = 19,优选一等座 = 20, 无座 =98,其他 = 99) |
| birthday | string | 否 | 出生日期(格式:yyyy-MM-dd , 当cardType = 2,3,4,8时必填) |
| cardValidEndDate | string | 否 | 证件有效期截止日期(格式:yyyy-MM-dd , 选填) |
| sex | int | 否 | 性别(男 = 1 , 女 = 2 , 当cardType = 2,3,4,8时必填) |
| countryCode | string | 否 | 国家/地区 代码(当cardType = 2,8时必填。可向平台索取所有国家/地区代码静态数据) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| orderNo | string | 火车票订单号 |
{
"appKey": "您申请的APPKEY",
"customerOrderNo": "1804257654",
"contactName": "李伟",
"contactMobile": "18754683215",
"trainCode": "G7240",
"fromStation": "上海",
"toStation": "合肥南",
"fromDateTime": "2020-04-20 10:54",
"toDateTime": "2020-04-20 14:13",
"trainAccount":"12306用户名-密文",
"trainPassword":"12306登录密码-密文",
"isChooseSeats": false,
"chooseSeats": null,
"callBackUrl": "订单状态异步回调地址",
"passengers": [
{
"name": "张文涛",
"cardType": 2,
"cardNo": "7418563",
"mobile": "18956251378",
"ticketType": 1,
"seatType": 4
},
{
"name": "许文强",
"cardType": 2,
"cardNo": "7418563",
"mobile": "18247568923",
"ticketType": 1,
"seatType": 4
}
]
}
{
"data": {
"orderNo": "TO2020041913272061601607"
},
"success": true,
"msg": "请求成功"
}
此接口是指我方得到订票占座成功(成功分配到了座位席别信息)的反馈后,在订单支付时限内(PS:30分钟以上的车次订单支付时限是10分钟,30分钟以内的车次支付时限为2分钟。超时未支付订单将自动取消)发出确认出票请求,系统将自动从钱包账户余额里扣除相应的订单金额,扣除成功方可出票。 此接口同步返回订单支付结果(故不再并且也无需异步通知支付结果),支付成功不等于出票成功,具体出票结果会异步回调通知,以订单状态为准。
从2025-03-01 凌晨开始,该接口 仅扣取订单总票款,订单总的出票服务费将在出票成功后从【火车票服务费】余额账户中自动扣取。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| orderNo | string | 是 | 火车票订单号 |
| payAmount | decimal | 否 | 支付金额,为空(null)不校验,传值就会和订单总金额比对,一致才能代扣成功(传值时就参与签名,为null时不参与签名) |
| sign | string | 是 | 签名校验值,md5(secretKey+orderNo+payAmount+secretKey),secretKey为请求密钥,开通账户时即可获得,加密结果转为32位小写。【注意:加密前的拼接原串不包含'+'】 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示确认成功;false表示确认失败,msg为取消失败原因。出票结果以异步回调结果为准 |
{
"appKey": "您申请的APPKEY",
"orderNo": "1804257654",
"payAmount": 127,
"sign":"17fb3f159a93cf6a5d0275565d1a0954"
}
{
"data": true,
"success": true,
"msg": "请求成功"
}
只有占位成功状态下才允许取消操作,逾期(超过支付时限,一般为下单后30分钟内)未支付的订单,系统将自动取消。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| orderNo | string | 是 | 订单号 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示取消成功;false表示取消失败,msg为取消失败原因 |
//取消成功返回:
{
"data": true,
"success": true,
"msg": "请求成功"
}
//取消失败返回:
{
"data": null,
"success": false,
"msg": "只有占位中和占位成功状态下才允许取消,当前订单状态为:出票中"
}
此接口只适合在线购票成功,未取票的客票退票申请。如果客户已在线下取票,只能在车站窗口办理退票,平台在收到12306退款后,将退回账户余额中。
允许提交退票申请的乘客客票状态如下
原票允许提交退票的客票状态ticketStatus值有:出票成功 = 8,改签占位失败 = 32,改签确认出票失败 = 35,改签已取消 = 37 ,退票失败 = 22
改签后的新票允许提交退票的客票状态ticketStatus值有:改签确认出票成功 = 34, 退票失败 = 22
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | appkey,由系统分配,账户唯一标识。 |
| orderNo | string | 是 | 火车票订单号 |
| tickets | TicketInfo[] | 是 | 退票的客票信息(12306暂不支持批量退票操作,多张票退票请分多次提交。PS:该字段数组格式主要为了以后的扩展,暂时只支持传单个数组元素) |
| name | string | 是 | 乘客姓名 |
| ticketNo | string | 是 | 票号(如果是改签票需传改签后的新票号,原票改签成功后原票号就无法再申请退票,系统自动根据票号判断是原票退票还是改签票退票) |
| cardType | int | 是 | 证件类型 |
| cardNo | string | 是 | 证件号 |
| remark | string | 否 | 退票申请备注信息,可不填 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | false 表示申请失败,msg为失败原因 ;true表示申请成功(非退票成功),具体退票结果会通过异步回调通知,亦可查询订单详情获取最新状态。 |
{
"appKey": "您申请的APPKEY",
"orderNo": "TO2020041913272061601607",
"tickets": [
{
"name": "许文强",
"ticketNo":"E7315002701020001",
"cardType": 1,
"cardNo": "***************"
}
],
"remark":"行程取消了"
}
{
"data": true,
"success": true,
"msg": "请求成功"
}
申请改签接口将自动进行改签占座操作,改签占座成功后还需要调用“确认改签接口”才会最终改签成功。
改签占位成功后请及时确认改签操作,目前12306订单占位成功后确认支付时限规则:30分钟以上的车次订单支付时限是10分钟,30分钟以内的车次支付时限为2分钟。超时未确认支付订单将自动取消。
允许提交改签的客票状态ticketStatus值有:出票成功 = 8,退票失败 = 22,改签占位失败 = 32,改签确认出票失败 = 35,改签已取消 = 37
一张火车票只能成功改签一次。改签后的车票票只能乘坐或办理退票不得二次改签。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| orderNo | string | 是 | 火车票订单号 |
| changePsgTicketNos | string | 是 | 申请改签的乘客票号,多名乘客票号以‘|’隔开 |
| fromStation | string | 是 | 改签后的出发火车站名称 |
| toStation | string | 是 | 改签后的到达火车站名称 |
| trainCode | string | 是 | 改签后的车次 |
| seatType | int | 是 | 改签后的席别(商务座 = 1,特等座 = 2,一等座 = 3,二等座 = 4,高级软卧 = 5,软卧 = 6,动卧 = 7 ,硬卧 = 8,软座 = 9,硬座 = 10,一等卧 = 11,二等卧 = 12,高级动卧 = 13, 一等软座 = 14 , 二等软座 = 15, 特等软座 = 16, 包厢硬卧 = 17, 一人软包 = 18, 多功能座 = 19,优选一等座 = 20, 无座 =98,其他 = 99) |
| fromDateTime | dateime | 是 | 改签后的出发时间(精确到分钟) |
| toDateTime | datetime | 是 | 改签后的到达时间(精确到分钟) |
| isChooseSeats | bool | 是 | 是否电子选座, true:选, false:不选, 目前仅支持高铁、动车类型车次选座,以12306为准,默认false |
| chooseSeats | string | 否 | 选座信息(选座个数要和乘客数量一致,如:1A1D2B2C2F 其中数字代表第几排 12306只能从2排10个位置中选择) |
| chooseSleeper | string | 是 | 选铺信息:三位阿拉伯数字组成 ( 第一位:下铺张数 100; 第二位:中铺张数 010; 第三位:上铺张数 000 ) ,如:203:代表2张下铺0张中铺3张上铺,不选:空或000 |
| isAcceptStanding | bool | 否 | 是否要无座字段,true要无座(不传时默认不要无座) |
| remark | string | 是 | 改签备注信息 |
| callBackUrl | string | 否 | 改签单状态变更异步回调地址,回调详见:订单状态推送通知说明 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| data | string | 改签单号 |
{
"data": "TO2020041913272061601607C5384",
"success": true,
"msg": "请求成功"
}
系统将根据【查询订单详情】接口中,获取到的改签单的needPayAmount字段判断是否需要支付,需要支付的系统将自动扣款,扣款成功后开始操作改签。(PS: 当needPayAmount>0 即改签需要支付时,贵司需确保再调用该接口之前,已收到用户支付的改签款)
| needPayAmount | float | 改签待支付金额(大于0表示需要支付) (新增字段) |
改签成功后,系统将根据改签单的totalPriceDiff字段判断该改签单在改签成功后是否需要给用户退款,需要退款的,系统将自动退款。
| totalPriceDiff | float | 改签待退款金额 (此值大于0表示需要退款) |
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| orderNo | string | 是 | 订单号 |
| chaNo | string | 是 | 改签单号 |
| payAmount | float | 否 | 改签支付金额(即 改签单待支付金额 needPayAmount字段值 ,传入将验证支付金额;传值时就参与签名,为null时不参与签名) |
| sign | string | 是 | 签名校验值,md5(secretKey+chaNo+payAmount+secretKey),secretKey为请求密钥,开通账户时即可获得。加密结果转为32位小写 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示成功;false表示失败(msg为失败原因) |
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| chaNo | string | 是 | 改签单号 |
| remark | string | 是 | 备注 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示成功;false表示失败(msg为失败原因) |
//取消成功返回:
{
"data": true,
"success": true,
"msg": "请求成功"
}
//取消失败返回:
{
"data": null,
"success": false,
"msg": "只有占位中和占位成功状态下才允许取消操作,当前订单状态为:出票成功"
}
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 接口账户appKey |
| orderNo | string | 是 | 火车票订单号 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| orderNo | string | 火车票订单号 |
| orderAmount | float | 订单总金额,占座成功后才有值(= 票价总额 + 出票手续费总额 + 保险总额 ) |
| ticketAmount | float | 订单所有乘客票价总金额 |
| insuranceAmount | float | 订单购买保险总金额 |
| serviceFeeAmount | float | 订单总的出票服务费 |
| serviceFeePerTicket | float | 单张票的出票服务费 |
| customerOrderNo | string | 商户订单号 |
| orderNo12306 | string | 12306订单号 |
| trainCode | string | 车次 |
| fromStation | string | 出发站 |
| toStation | string | 到达站 |
| fromDateTime | string | 出发日期(精确到分钟) |
| toDateTime | string | 到达日期(精确到分钟) |
| orderStatus | int | 火车票订单状态(占位中=1,占位成功=2,占位失败=3,已取消=5,出票中=7,出票成功=8,出票失败=9) |
| orderStatusName | string | 火车票订单状态名称(和orderStatus一一对应) |
| payStatus | int | 支付状态,对应枚举PayStatus值(0未支付 1已支付) |
| paymentType | int | 支付方式(对应枚举PaymentType值:0未支付 1钱包支付 2支付宝 3微信 , 接口目前只支持1钱包余额支付) |
| realPayAmount | float | 实付款金额(和订单金额一直,支付成功才有值) |
| payTime | datetime | 支付时间 |
| transactionNo | string | 支付交易单号(对应交易记录里一笔交易,用于查账) |
| ticketTime | datetime | 出票时间 |
| isChooseSeats | bool | 是否电子选座, true:选, false:非选, 目前仅支持GDC车次选座,以12306为准 |
| chooseSeats | string | 选座信息(选座个数要和乘客数量一致,如:1A1D2B2C2F) |
| isSnatchOrder | bool | 是否为抢票订单 |
| snatchDeadLine | datetime | 抢票截止时间(精确到分) |
| insuranceCodes | string | 保险产品编号(有值,则表示此单购买保险,多款保险竖线|分割,下单时传入的) |
| contactName | string | 联系人姓名 |
| contactMobile | string | 联系人手机号 |
| outTicketFail_RefundSuccessTime | datetime | 出票失败,退款成功时间(出票失败退款成功才有值) |
| outTicketFail_RefundTransactionNo | string | 出票失败,退款交易单号(出票失败退款成功才有值) |
| outTicketFail_RefundAmount | float | 出票失败,退款金额(和实际支付金额一致)(出票失败退款成功才有值) |
| outTicketFail_RefundTransactionMethods | int | 退款交易方式(出票失败退款成功才有值) |
| payLimitTime | datetime | 支付时限参考时间 |
| unFinishedReason | string | 订单未完成(出票)原因 |
| ticketEntrance | string | 检票口 |
| createTime | string | 下单时间 |
| trainTickets | trainTicketInfo[] | 订单乘客客票信息(数组) |
| passengerId | int | 乘客ID(系统自动生成的唯一标识) |
| name | string | 乘机人姓名 |
| ticketNo | string | 票号,占座成功才有值 |
| cardType | int | 证件类型( 身份证 = 1,护照 = 2, 港澳居民来往内地通行证 = 3 , 台湾居民来往大陆通行证 = 4 ,外国人永久居留身份证 = 8 ,港澳台居民居住证 = 9 ) |
| cardTypeName | string | 证件类型名称 |
| cardNo | string | 证件号 |
| mobile | string | 手机号 |
| ticketType | int | 火车票票种( 成人票 = 1,儿童票 = 2, 学生票 = 3, 残军票 = 4) |
| ticketTypeName | string | 票种类型名称 |
| seatType | int | 火车票座位席别(商务座 = 1,特等座 = 2,一等座 = 3,二等座 = 4,高级软卧 = 5,软卧 = 6,动卧 = 7 ,硬卧 = 8,软座 = 9,硬座 = 10,一等卧 = 11,二等卧 = 12,高级动卧 = 13, 一等软座 = 14 , 二等软座 = 15, 特等软座 = 16, 包厢硬卧 = 17, 一人软包 = 18, 多功能座 = 19,优选一等座 = 20, 无座 =98,其他 = 99 |
| seatTypeName | string | 席别名称 |
| ticketStatus | int | 乘客客票状态(占位中=1,占位成功=2,占位失败=3,已取消=5,出票中=7,出票成功=8,出票失败=9,退票中=20,退票成功=21,退票失败=22,已退票未退款 = 23 ,改签占位中=30,改签占位成功=31,改签占位失败=32,改签确认出票中=33,改签确认出票成功=34,改签确认出票失败=35,改签已取消=37 ) |
| ticketStatusName | string | 客票状态名称 |
| seatNo | string | 座位号 |
| ticketPrice | float | 票价 |
| insuranceAmount | float | 当前乘客购买保险金额 |
| policyNos | string | 保单号,多个英文逗号分隔 (购保且出保成功后才会有值) |
| refundTicketPoundage | string | 退票手续费(退票成功才有值) |
| refundTicketAmount | float | 退票退款金额(退票成功才有值) |
| refundSuccessTime | datetime | 退票退款成功时间(退款成功才有值) |
| refundTransactionNo | string | 退票退款交易单号(退款成功才有值) |
| refundFailReason | string | (退票)退款失败原因,当退票失败时可通过此值查看失败原因(只有当ticketStatus客票状态值为:退票失败=22 时才会有值,可能为空。在退票失败回调参数中也有此值,详见回调接口中failMsg字段) |
| trainChaOrder | ChangeOrderDetail[] | 改签单详情,数组,一个原订单可能有多个改签单(每张票只能成功改签一次,改签失败的可以重新申请改签) |
| chaNo | string | 火车票改签单号(改签申请成功返回的改签单标识,对应一次改签申请) |
| chaOrderStatus | int | 改签单状态值(改签占位中=30,改签占位成功=31,改签占位失败=32,改签确认出票中=33,改签确认出票成功=34,改签确认出票失败=35,改签已取消=37 ) |
| chaOrderStatusName | string | 改签单状态名称 |
| trainCode | string | 改签后车次号 |
| fromStation | string | 改签后出发站 |
| toStation | string | 改签后到达站 |
| fromDateTime | datetime | 改签后出发日期(精确到分钟) |
| toDateTime | datetime | 改签后到达日期(精确到分钟) |
| isChooseSeats | bool | 改签是否电子选座, true:选, false:非选, 目前仅支持GDC车次选座,以12306为准 |
| chooseSeats | string | 改签选座信息(选座个数要和乘客数量一致,如:1A1D2B2C2F) |
| priceChangeType | int | 改签票价变动类型(对应枚举ChaPriceChangeType值:0=待确定,1=新票款高于原票款,2=新票款等于原票款,3=新票款低于原票款 ) |
| priceChangeTypeInfo | string | 改签票款异动信息(与PriceChangeType对应) |
| realPayAmount | float | 高改时,实际支付总金额 |
| payTime | datetime | 高改时,支付时间 |
| totalPriceDiff | float | 改签待退款金额 (此值大于0表示需要退款) |
| diffRate | float | 改签差额退票手续费率,默认 0,如 0,0.05 |
| diffRefundFeeAmount | float | 改签差额退票手续费合计(新增字段) |
| changRate | float | 改签手续费费率 ,默认 0,如 0 , 0.15 (新增字段) |
| changFeeAmount | float | 改签手续费合计 (新增字段) |
| needPayAmount | float | 改签待支付金额(大于0表示需要支付) (新增字段) |
| chaRefundType | int | 改签单退款类型(对应枚举ChaOderRefundType值 1改签失败已支付改签金额退款 2改签成功低改差价退款 3、改签成功高改原票款退款 ) |
| refundAmount | float | 改签失败退款或低改退差价或高改退原票款的退款金额 |
| refundTime | datetime | 改签失败退款或低改退差价或高改退原票款的退款时间 |
| refundTransactionNo | string | 改签失败退款或低改退差价或高改退原票款的退款交易流水号 |
| refundTransactionMethods | int | 退款交易方式 |
| remark | string | 改签备注 |
| unFinishedReason | string | 改签单未完成(出票)原因 |
| ticketEntrance | string | 改签单的检票口 |
| applayChangeTime | datetime | 申请改签时间 |
| trainTickets | trainTicketInfo[] | 改签单的客票信息(数据结构和原订单客票信息一样) |
{
"data": {
"orderNo": "T24012512251820419",
"orderAmount": 31.00,
"ticketAmount": 26.00,
"insuranceAmount": 0.00,
"serviceFeeAmount": 5.00,
"serviceFeePerTicket": 2.50,
"customerOrderNo": "123456000",
"orderNo12306": "EF48476727",
"trainCode": "G7199",
"fromStation": "苏州北",
"toStation": "昆山南",
"fromDateTime": "2024-01-27 06:57:00",
"toDateTime": "2024-01-27 07:08:00",
"orderStatus": 8,
"orderStatusName": "出票成功",
"payStatus": 1,
"paymentType": 1,
"realPayAmount": 31.00,
"payTime": "2024-01-25 12:27:02",
"transactionNo": "202401251227022926631687",
"ticketTime": "2024-01-25 12:27:15",
"isChooseSeats": false,
"chooseSeats": null,
"isSnatchOrder": false,
"snatchDeadLine": null,
"insuranceCodes": null,
"contactName": "",
"contactMobile": "18262017321",
"outTicketFail_RefundSuccessTime": null,
"outTicketFail_RefundTransactionNo": null,
"outTicketFail_RefundAmount": null,
"outTicketFail_RefundTransactionMethods": 0,
"payLimitTime": "2024-01-25 12:35:36",
"unFinishedReason": null,
"ticketEntrance": "检票口2B",
"createTime": "2024-01-25 12:25:18",
"trainTickets": [
{
"passengerId": 15155,
"name": "张飞",
"ticketNo": "EF48476727103001A",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********96X",
"mobile": "157****0587",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 4,
"seatTypeName": "二等座",
"ticketStatus": 34,
"ticketStatusName": "改签确认出票成功",
"seatNo": "03车厢,01A座",
"ticketPrice": 13.00,
"insuranceAmount": 0.00,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
},
{
"passengerId": 45646,
"name": "李三",
"ticketNo": "EF48476727103001B",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********958",
"mobile": "182****2185",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 4,
"seatTypeName": "二等座",
"ticketStatus": 34,
"ticketStatusName": "改签确认出票成功",
"seatNo": "03车厢,01B座",
"ticketPrice": 13.00,
"insuranceAmount": 0.00,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
}
],
"trainChaOrder": [
{
"chaNo": "T24012512251820419C3779",
"chaOrderStatus": 34,
"chaOrderStatusName": "改签确认出票成功",
"trainCode": "K289",
"fromStation": "苏州",
"toStation": "昆山",
"fromDateTime": "2024-01-30 04:30:00",
"toDateTime": "2024-01-30 04:58:00",
"isChooseSeats": false,
"chooseSeats": null,
"priceChangeType": 3,
"priceChangeTypeInfo": "退票手续费:4.0元,退票费率:10%,实际退还票款:3.0元,改签费用:1.0元,改签费率:5%",
"realPayAmount": null,
"payTime": null,
"totalPriceDiff": 3.00,
"diffRate": 0.10,
"diffRefundFeeAmount": 4.00,
"changRate": 0.05,
"changFeeAmount": 1.00,
"needPayAmount": 0.00,
"chaRefundType": 2,
"refundAmount": 3.00,
"refundTime": "2024-01-25 13:07:22",
"refundTransactionNo": "202401251307220086631754",
"refundTransactionMethods": 1,
"remark": "行程有变",
"unFinishedReason": null,
"ticketEntrance": null,
"confirmChangeLimitTime": "2024-01-25 13:13:26",
"applayChangeTime": "2024-01-25 13:02:46",
"trainTickets": [
{
"passengerId": 15155,
"name": "张飞",
"ticketNo": "EF484767274060066",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********96X",
"mobile": "157****0587",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 10,
"seatTypeName": "硬座",
"ticketStatus": 34,
"ticketStatusName": "改签确认出票成功",
"seatNo": "06车厢,066号",
"ticketPrice": 9.00,
"insuranceAmount": 0.0,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
},
{
"passengerId": 45646,
"name": "李三",
"ticketNo": "EF484767274010023",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********958",
"mobile": "182****2185",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 10,
"seatTypeName": "硬座",
"ticketStatus": 34,
"ticketStatusName": "改签确认出票成功",
"seatNo": "01车厢,023号",
"ticketPrice": 9.00,
"insuranceAmount": 0.0,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
}
]
},
{
"chaNo": "T24012512251820419C8250",
"chaOrderStatus": 37,
"chaOrderStatusName": "改签已取消",
"trainCode": "G7199",
"fromStation": "苏州北",
"toStation": "昆山南",
"fromDateTime": "2024-01-30 06:57:00",
"toDateTime": "2024-01-30 07:08:00",
"isChooseSeats": false,
"chooseSeats": null,
"priceChangeType": 2,
"priceChangeTypeInfo": "改签票款差价:0.0元,改签费用:1.0元,改签费率:5%",
"realPayAmount": null,
"payTime": null,
"totalPriceDiff": 0.00,
"diffRate": 0.00,
"diffRefundFeeAmount": 0.00,
"changRate": 0.05,
"changFeeAmount": 1.00,
"needPayAmount": 1.00,
"chaRefundType": null,
"refundAmount": null,
"refundTime": null,
"refundTransactionNo": null,
"refundTransactionMethods": 0,
"remark": "行程有变",
"unFinishedReason": "已取消改签申请",
"ticketEntrance": null,
"confirmChangeLimitTime": "2024-01-25 12:44:10",
"applayChangeTime": "2024-01-25 12:33:45",
"trainTickets": [
{
"passengerId": 15155,
"name": "张飞",
"ticketNo": "EF48476727203001D",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********96X",
"mobile": "157****0587",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 4,
"seatTypeName": "二等座",
"ticketStatus": 37,
"ticketStatusName": "改签已取消",
"seatNo": "03车厢,01D号",
"ticketPrice": 13.00,
"insuranceAmount": 0.0,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
},
{
"passengerId": 45646,
"name": "李三",
"ticketNo": "EF48476727203001F",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********958",
"mobile": "182****2185",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 4,
"seatTypeName": "二等座",
"ticketStatus": 37,
"ticketStatusName": "改签已取消",
"seatNo": "03车厢,01F号",
"ticketPrice": 13.00,
"insuranceAmount": 0.0,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
}
]
},
{
"chaNo": "T24012512251820419C8549",
"chaOrderStatus": 37,
"chaOrderStatusName": "改签已取消",
"trainCode": "G3163",
"fromStation": "苏州",
"toStation": "昆山南",
"fromDateTime": "2024-01-30 19:42:00",
"toDateTime": "2024-01-30 19:54:00",
"isChooseSeats": false,
"chooseSeats": null,
"priceChangeType": 1,
"priceChangeTypeInfo": "收取新票款:38.0元,退还原票款:26.0元,改签费用:1.0元,改签费率:5%",
"realPayAmount": null,
"payTime": null,
"totalPriceDiff": 26.00,
"diffRate": 0.00,
"diffRefundFeeAmount": 0.00,
"changRate": 0.05,
"changFeeAmount": 1.00,
"needPayAmount": 39.00,
"chaRefundType": null,
"refundAmount": null,
"refundTime": null,
"refundTransactionNo": null,
"refundTransactionMethods": 0,
"remark": "行程有变",
"unFinishedReason": "已取消改签申请",
"ticketEntrance": null,
"confirmChangeLimitTime": "2024-01-25 13:00:07",
"applayChangeTime": "2024-01-25 12:49:26",
"trainTickets": [
{
"passengerId": 15155,
"name": "张飞",
"ticketNo": "EF48476727306015A",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********96X",
"mobile": "157****0587",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 4,
"seatTypeName": "二等座",
"ticketStatus": 37,
"ticketStatusName": "改签已取消",
"seatNo": "06车厢,15A号",
"ticketPrice": 19.00,
"insuranceAmount": 0.0,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
},
{
"passengerId": 45646,
"name": "李三",
"ticketNo": "EF48476727306015B",
"cardType": 1,
"cardTypeName": "身份证",
"cardNo": "3411***********958",
"mobile": "182****2185",
"ticketType": 1,
"ticketTypeName": "成人票",
"seatType": 4,
"seatTypeName": "二等座",
"ticketStatus": 37,
"ticketStatusName": "改签已取消",
"seatNo": "06车厢,15B号",
"ticketPrice": 19.00,
"insuranceAmount": 0.0,
"policyNos": null,
"refundTicketPoundage": null,
"refundTicketAmount": null,
"refundSuccessTime": null,
"refundTransactionNo": null,
"refundFailReason": null
}
]
}
]
},
"success": true,
"msg": "请求成功"
}
没有12306账号的,可以通过此接口快速注册账号。注册时需先用注册手机号 发送短信999至12306获取验证码,提交注册信息时需提交该验证码(见请求参数字段:msgCode)。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 是 | 用 户 名-密文 |
| trainPassword | string | 是 | 密码-密文(ps:密码要求:不少于6位,必须且只能包含字母,数字,下划线中的两种或两种以上!) |
| name | string | 是 | 姓名 |
| cardType | int | 是 | 证件类型( 身份证 = 1,护照 = 2, 港澳居民来往内地通行证 = 3 , 台湾居民来往大陆通行证 = 4 ,外国人永久居留身份证 = 8 ,港澳台居民居住证 = 9 ) |
| cardNo | string | 是 | 证件号 |
| mobile | string | 是 | 手机号 |
| passengerType | int | 是 | 旅客类型(成人 = 1,儿童 = 2, 学生 = 3, 残疾军人、伤残人民警察= 4) |
| string | 是 | 邮箱(当cardType为3和4时必填) | |
| sex | int | 是 | 性别:未知 = 0 , 男 = 1 , 女 = 2 (当cardType非1和9时必填。) |
| countryCode | string | 是 | 国家地区,示例:CN(当cardType等于2和8时必填。) |
| cardValidEndDate | string | 是 | 证件有效期截止日期 格式:yyyy-MM-dd(当cardType非1和9时必填。) |
| birthday | string | 是 | 出生日期,格式:yyyy-MM-dd(当cardType非1和9时必填。) |
| msgCode | string | 是 | 短信验证码(注册请求之前使用注册手机号发短信999至12306获取) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| regSubmitIsPass | bool | 是否注册成功(true 注册成功, false 注册失败) |
| note | string | 提示消息 |
{
"appKey": "您申请的APPKEY",
"trainAccount":"用户名",
"trainPassword":"密码",
"name": "张三",
"cardType": "1",
"cardNo": "123456",
"mobile": "15000000000",
"passengerType": 1
}
注册成功示例:
{
"data": {
"regSubmitIsPass": true,
"note": "您已完成注册,本网站将在24小时内对您的身份信息进行核验,通过后即可购票"
},
"success": true,
"msg": "请求成功"
}
注册失败示例:
{
"data": {
"regSubmitIsPass": false,
"note": "该注册名已存在"
},
"success": true,
"msg": "请求成功"
}
{
"data": {
"regSubmitIsPass": false,
"note": "您输入的手机号码已被其他注册用户(*杰)使用,请确认是否本人注册。如果此手机号是本人注册,您可使用此手机号进行登录,或返回登录页点击忘记密码进行重置密码;如果手机号不是您注册的,您可更换手机号码或致电12306客服协助处理。"
},
"success": true,
"msg": "请求成功"
}
建议最长不超过10小时,需发起一次重新登录
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 是 | 12306账号-密文(跟在url后传参【像接口示例那种】需要utf8 urlencode ; 放在请求体里不需要) |
| trainPassword | string | 是 | 12306密码-密文(跟在url后传参【像接口示例那种】需要utf8 urlencode ; 放在请求体里不需要) |
| lastDigits | string | 否 | 登录账号绑定的证件号后4位 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| isPass | bool | 是否通过(true:通过;false:失败) |
| errorMsg | string | 失败提示消息 |
验证通过响应示例:
{
"data": {
"isPass": true,
"errorMsg": "已通过"
},
"success": true,
"msg": "请求成功"
}
验证失败响应示例:
{
"data": {
"isPass": false,
"errorMsg": "请您用手机尾号2467发送短信666至12306"
},
"success": true,
"msg": "请求成功"
}
目前仅用于 登录短信验证
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 是 | 12306账号-密文(跟在url后传参【像接口示例那种】需要utf8 urlencode ; 放在请求体里不需要) |
| trainPassword | string | 是 | 12306密码-密文(跟在url后传参【像接口示例那种】需要utf8 urlencode ; 放在请求体里不需要) |
| msgCode | string | 是 | 验证码 |
| validateType | int | 是 | 验证类型: 1注册验证 ; 2登录验证(PS: 1注册验证 已废弃 ,直接在 账号注册接口中通过【msgCode字段】一步完成了) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示验证成功;false表示验证失败,msg为验证失败原因。 |
{
"data": true,
"success": true,
"msg": "请求成功"
}
{
"data": null,
"success": false,
"msg": "验证码错误"
}
http post json请求,请求头部需设置下:Content-Type:application/json
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 是 | 12306账号-密文 |
| trainPassword | string | 是 | 12306密码-密文 |
| photos | List<string> | 是 | 照片集合,至少1张,最多2张。(先将每张照片文件 通过 文件流 读取到字节数组中,再将 byte[] 通过Base64转成字符串)PS: 照片要求: 图片文件大小控制在:100k以内,对于文件较大图片可以等比缩放压缩处理,不能带眼镜 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true 认证成功;false认证失败 |
{
"appKey": "您申请的APPKEY",
"trainAccount": "12306账户 密文",
"trainPassword": "12306密码-密文",
"photos": [
"Base64字符串"
]
}
成功示例:
{
"data": true,
"success": true,
"msg": "请求成功"
}
失败示例:
{
"data": false,
"success": false,
"msg": "人脸认证失败"
}
判断常旅客的 身份核验状态和手机核验状态 以此接口返回的为准。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 是 | 12306账号-密文(跟在url后传参【像接口示例那种】需要utf8 urlencode ; 放在请求体里不需要) |
| trainPassword | string | 是 | 12306密码-密文(跟在url后传参【像接口示例那种】需要utf8 urlencode ; 放在请求体里不需要) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| data | 常旅列表 | 数组 |
| id | int | 序号 |
| name | string | 姓名 |
| cardType | int | 证件类型( 身份证 = 1,护照 = 2, 港澳居民来往内地通行证 = 3 , 台湾居民来往大陆通行证 = 4 ,外国人永久居留身份证 = 8 ,港澳台居民居住证 = 9 ) |
| cardNo | string | 证件号 |
| mobile | string | 手机号 |
| passengerType | int | 旅客类型(成人 = 1,儿童 = 2, 学生 = 3, 残疾军人、伤残人民警察= 4) |
| birthday | string | 出生日期 |
| sex | int | 性别(未知 = 0 , 男 = 1 , 女 = 2) |
| country | string | 国籍:CN |
| identityVerifyStatus | int | 身份核验状态( 0未通过 1已通过 2未知 3 待核验 4 请报验 5 预通过) |
| mobileVerifyStatus | int | 手机核验状态(0待核验 1核验通过) |
| isUserSelf | bool | 乘客是否账号用户本人 |
{
"data": [
{
"id": 1691138393,
"name": "张小华",
"cardType": 1,
"cardNo": "2308***********029",
"mobile": "15012341234",
"passengerType": 1,
"birthday": "****-**-**",
"sex": 2,
"country": "CN",
"email": "",
"address": "",
"identityVerifyStatus": 1,
"mobileVerifyStatus": 1,
"isUserSelf": false
}
],
"success": true,
"msg": "请求成功"
}
1、同一账号下最多有15个常旅客,
2、常旅客添加成功后(身份核验状态为已核验的)一个月之内无法删除的。
3、判断常旅客的 身份核验状态和手机核验状态 以‘获取常旅客’接口返回的为准。
4、如果需要修改的当前常旅客是12306账号本人的话,是无法通过该接口修改的,切记,切记,,,此时需使用“修改账号本人信息”接口修改账号本人信息。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 是 | 账号-密文 |
| trainPassword | string | 是 | 密码-密文 |
| id | int | 是 | 序号(0表示新增此常旅客;>0表示修改此常旅客,该值由 获取常旅接口返回的) |
| name | string | 是 | 姓名 |
| cardType | int | 是 | 证件类型( 身份证 = 1,护照 = 2, 港澳居民来往内地通行证 = 3 , 台湾居民来往大陆通行证 = 4 ,外国人永久居留身份证 = 8 ,港澳台居民居住证 = 9 ) |
| cardNo | string | 是 | 证件号 |
| mobile | string | 是 | 手机号 |
| passengerType | int | 是 | 旅客类型(成人 = 1,儿童 = 2, 学生 = 3, 残疾军人、伤残人民警察= 4) |
| birthday | string | 否 | 出生日期(格式:yyyy-MM-dd , 当cardType = 2,3,4,8时必填) |
| countryCode | string | 否 | 国家/地区 代码(当cardType = 2,8时必填。可向平台索取所有国家/地区代码静态数据) |
| cardValidEndDate | string | 否 | 证件有效期截止日期(格式:yyyy-MM-dd , 当cardType = 2,3,4,8时必填) |
| sex | int | 否 | 性别(男 = 1 , 女 = 2 , 当cardType = 2,3,4,8时必填) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| identityVerifyStatus | int | 身份核验状态( 0未通过 1已通过 2未知 3 待核验 4 请报验 5 预通过) |
| mobileVerifyStatus | int | 手机核验状态(0待核验 1核验通过) |
| verificationCode | string | 当手机待核验时,返回的验证码(发送此验证码至‘12306’完成手机核验即可,只需核验一次) |
{
"appKey": "您申请的APPKEY",
"trainAccount":"用户",
"trainPassword":"密码",
"id": 0,
"name": "张三",
"cardType": "1",
"cardNo": "**************",
"mobile": "150*********",
"passengerType": 1
}
{
"data": {
"identityVerifyStatus": 1,
"mobileVerifyStatus": 0,
"verificationCode": "41039186"
},
"success": true,
"msg": "请求成功"
}
1、12306乘客人中的本人信息,目前只允许修改 旅客类型 这一个字段。
2、该接口只能用于修改12306账号本人信息的,修改账户中其他常旅客信息的话,请使用“增/改常旅”接口。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 您申请的APPKEY |
| trainAccount | string | 是 | 账号-密文 |
| trainPassword | string | 是 | 密码-密文 |
| passengerType | int | 是 | 旅客类型(成人 = 1,儿童 = 2, 学生 = 3, 残疾军人、伤残人民警察= 4) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true修改成功;false修改失败(msg 为失败原因) |
{
"appKey": "您申请的APPKEY",
"trainAccount":"用户",
"trainPassword":"密码",
"passengerType": 1
}
{
"data": true,
"success": true,
"msg": "请求成功"
}
新添加的常旅客(且身份核验状态为已核验的)在一个月之内是无法删除的。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 是 | 账号-密文 |
| trainPassword | string | 是 | 密码-密文 |
| name | string | 是 | 姓名 |
| cardType | int | 是 | 证件类型( 身份证 = 1,护照 = 2, 港澳居民来往内地通行证 = 3 , 台湾居民来往大陆通行证 = 4 ,外国人永久居留身份证 = 8 ,港澳台居民居住证 = 9 ) |
| cardNo | string | 是 | 证件号 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示删除成功;false表示删除失败,msg为删除失败原因。 |
{
"appKey": "您申请的APPKEY",
"trainAccount":"用户",
"trainPassword":"密码",
"name": "张三",
"cardType": "1",
"cardNo": "**************",
}
{
"data": null,
"success": false,
"msg": "张三2021年10月15日前不允许删除!"
}
{
"data": null,
"success": true,
"msg": "请求成功"
}
该接口请求成功后,账户手机号会收到一条12306发送的短信验证码,然后通过调用‘找回密码-回填验证码’接口 回填验证码成功即可(PS:验证码有效期只有60秒)
收到的短信内容如下:
【12306】验证码:456350,切勿转发。12306网站用户正在申请找回密码服务。如非本人操作,请忽略本短信。
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appkey | string | 是 | 接口账号 |
| requestID | string | 是 | 请求ID(调用方自行生成,比如可以用时间戳,代表一次找回密码请求,每次请求值须唯一,千万千万要记住每次请求该值必须唯一,不然下一步回填验证码时即使所有信息都正确,但因为该值使用的是之前用过的也会请求失败,正确的做法时,每次调用该接口时,都把该参数重置成唯一值,如当前时间戳) |
| cardType | int | 是 | 证件类型( 身份证 = 1,护照 = 2, 港澳居民来往内地通行证 = 3 , 台湾居民来往大陆通行证 = 4 ,外国人永久居留身份证 = 8 ,港澳台居民居住证 = 9 ) |
| cardNo | string | 是 | 证件号 |
| mobile | string | 是 | 手机号 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true验证码已发送;false表示请求失败,msg为失败原因。 |
{
"data": true,
"success": true,
"msg": "请求成功"
}
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 接口账户 |
| requestID | string | 是 | 请求id,需和上一步(找回密码-获取验证码)请求时的requestID相同,代表两者是同一个请求。 |
| trainPassword | string | 是 | 新密码-密文(PS:密码需至少6位字母、数字或符号且只能包含字母,数字,下划线中的两种或两种以上!) |
| verificationCode | string | 是 | 短信验证码,上一步(找回密码-获取验证码)收到的 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示找回密码成功,false为失败,msg为请求失败原因 |
{
"appKey": "您申请的APPKEY",
"requestID": "dcf1d40f58d04a47ba91e89833788165",
"trainPassword": "登录密码-密文",
"verificationCode": "177560"
}
(PS:需要指定Content-Type 为"application/json; charset=utf-8")
{
"data": true,
"success": true,
"msg": "请求成功"
}
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 接口账户 |
| trainAccount | string | 是 | 12306账号-密文 |
| oldTrainPassword | string | 是 | 原密码-密文 |
| newTrainPassword | string | 是 | 新密码-密文 |
| confirmTrainPassword | string | 是 | 确认新密码-密文 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示验证码已发送成功;false表示请求失败,msg为失败原因。 |
{
"appKey": "您申请的APPKEY",
"trainAccount": "x2mQh9UH4YM3GxH+0UIdRw==",
"oldTrainPassword": "V6Sne4lXqv08WD0j2xfdQQ==",
"newTrainPassword": "Wmv70Z79f//uT+/ggruPuQ==",
"confirmTrainPassword": "Wmv70Z79f//uT+/ggruPuQ=="
}
{
"data": true,
"success": true,
"msg": "请求成功"
}
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 接口账户 |
| trainAccount | string | 是 | 12306账号-密文 |
| oldTrainPassword | string | 是 | 原密码-密文 |
| newTrainPassword | string | 是 | 新密码-密文 |
| confirmTrainPassword | string | 是 | 确认新密码-密文 |
| verificationCode | string | 是 | 短信验证码(上一步收到的) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | true表示密码重置成功;false表示请求失败,msg为失败原因。 |
{
"appKey": "您申请的APPKEY",
"trainAccount": "x2mQh9UH4YM3GxH+0UIdRw==",
"oldTrainPassword": "V6Sne4lXqv08WD0j2xfdQQ==",
"newTrainPassword": "Wmv70Z79f//uT+/ggruPuQ==",
"confirmTrainPassword": "Wmv70Z79f//uT+/ggruPuQ==",
"verificationCode":"028307"
}
{
"data": true,
"success": true,
"msg": "请求成功"
}
该接口是我方通过12306官网公布的退票费收费规则,再根据用户传入的车次出发时间和当前(北京)时间两个入参动态计算出来的,仅供参考,不保证100%准确,贵司技术也可自行根据12306客规自行计算,最终退票费多少请以12306实际收取为准。
12306退票费收费规则详见:https://mobile.12306.cn/otsmobile/h5/otsbussiness/info/orderWarmTips.html
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| appKey | string | 是 | 接口账号appKey |
| type | int | 是 | 类型: 0= 非跨境 , 1=广深港跨境车票 退票手续费 , 2=中老铁路跨境 (PS:因为不同类型,12306的退票费收取规则不同) |
| trainFromDateTime | string | 否 | 车次发车时间 |
| chaTrainFromDateTime | string | 否 | 改签票新车次发车时间(改签需要同时传:原车发车时间即trainFromDateTime字段值 和 该字段值) |
| ticketPrice | decimal | 否 | 票价,可为空,,传值的话,接口就返回具体的退票手续费,传空的话,只返回退票费率(即百分比) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| currentValue | int | 当前退票百分比(单位是%),如20代表退票费20%,只有当入参传了车次发车时间才会返回值 |
| ticketPrice | decimal | 票价,接口入参传入的,原样返回 |
| currentRefundPoundage | decimal | 当前退票手续费,当入参同时传了车次发车时间和票价时,后端才能计算和返回该值 |
| refundAmount | decimal | 退款金额,当入参同时传了车次发车时间和票价时,后端才能计算和返回该值 |
| ruleItemList | TrainRefundRuleItem[] | 退票费规则明细(对象数组类型) |
| title | string | 标题,如:48小时≤退票时间<8天 |
| valueText | string | 退票费显示文本,如 票价5% |
| value | int | 退票费百分比值(单位是%),如值5代表退票费5% |
| isCurrentRange | bool | 是否当前时间段(即接口调用那一刻,车票的退票费是不是属于该区间段),,,只有当入参传了车次发车时间该值才有可能是true |
{
"data": {
"currentValue": 20,
"ticketPrice": 100.0,
"currentRefundPoundage": 20.0,
"refundAmount": 80.0,
"ruleItemList": [
{
"title": "退票时间≥8天",
"valueText": "免费",
"value": 0,
"isCurrentRange": false
},
{
"title": "48小时≤退票时间<8天",
"valueText": "票价5%",
"value": 5,
"isCurrentRange": false
},
{
"title": "24小时≤退票时间<48小时",
"valueText": "票价10%",
"value": 10,
"isCurrentRange": false
},
{
"title": "退票时间<24小时",
"valueText": "票价20%",
"value": 20,
"isCurrentRange": true
}
]
},
"success": true,
"msg": "请求成功"
}
该接口方法同步返回此次申请是否接收成功,,至于此次申请是否开票成功,需通过【电子发票申请回调接口】得知
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 否 | 乘客本人的12306登录账号-传密文(账号密码 和 乘客姓名证件信息passenger字段 必传一个 ) |
| trainPassword | string | 否 | 乘客本人的12306登录密码-传密文(账号密码 和 乘客姓名证件信息passenger字段 必传一个 ) |
| passenger | Passenger | 否 | 乘客姓名证件信息(不传账号密码时,该字段必填) |
| name | string | 是 | 乘客姓名(passenger->name字段) |
| cardType | int | 是 | 乘客证件类型(passenger->cardType字段) |
| cardNo | string | 是 | 乘客证件号(passenger->cardNo字段) |
| cardValidEndDate | string | 否 | 乘客证件有效期 ,格式yyyy-MM-dd,当证件类型是外国人永久居住证时 该字段必填(passenger->cardValidEndDate字段) |
| requestID | string | 是 | 请求唯一值,回调时原样返回(调用方自行生成,每次申请必须确保值唯一) |
| string | 否 | 邮箱(电子发票发送接收邮箱) | |
| purchaserType | int | 是 | 抬头类型 1:个人 2:企业 3:个人换开 4:企业换开 |
| purchaserName | string | 是 | 发票抬头(必填) |
| taxCode | string | 是 | 税号(纳税人识别号),当purchaserType=2/4时,必填 |
| photo | string | 是 | 人脸照,必填(先将照片文件 通过 文件流 读取到字节数组中,再将 byte[] 通过Base64转成字符串即可)PS: 照片要求: 图片文件大小控制在:100k以内,对于文件较大图片可以等比缩放压缩处理,不能带眼镜 |
| tickets | TrainTicket[] | 是 | 车票信息(对象数组) |
| ticketId | string | 是 | 票唯一标识,自行生成一个唯一值就行(唯一值,回调时会返回)(对象数组tickets的元素属性) |
| invoiceType | int | 是 | 电子发票类型( 2:票价,3:改签手续费,4:退票手续费)(对象数组tickets的元素属性) |
| fromStationName | string | 是 | 出发站名称(对象数组tickets的元素属性) |
| toStationName | string | 是 | 到达站名称(对象数组tickets的元素属性) |
| trainCode | string | 是 | 车次号(对象数组tickets的元素属性) |
| orderNo12306 | string | 是 | 12306 E字单号 |
| seatNo | string | 是 | 坐席详情(示例:03车厢,18D座) |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| success | bool | 返回true,仅代表申请接收成功,是否开票成功需通过【电子发票申请回调接口】得知 |
| msg | string | 当申请失败即success=false时,返回失败原因 |
方式一、使用账号密码+人脸方式:
{
"appKey": "您申请的appKey",
"trainAccount": "12306用户名-密文",
"trainPassword": "12306登录密码-密文",
"requestID": "自定义请求唯一标识",
"email": "123@qq.com",
"purchaserType": 1,
"purchaserName": "张三",
"taxCode": "",
"photo": "人脸照的Base64加密串",
"tickets": [
{
"ticketId": "自定义客票唯一标识",
"invoiceType": 2,
"fromStationName": "合肥南",
"toStationName": "汉口",
"trainCode": "G598",
"orderNo12306": "E929425786",
"seatNo": "04车厢,12A号"
}
]
}
方式二、使用乘客姓名证件信息+人脸方式:
{
"appKey": "您申请的appKey",
"passenger": {
"name": "姓名",
"cardType": 1,
"cardNo": "证件号"
},
"requestID": "自定义请求唯一标识",
"email": "123@qq.com",
"purchaserType": 1,
"purchaserName": "张三",
"taxCode": "",
"photo": "人脸照的Base64加密串",
"tickets": [
{
"ticketId": "自定义客票唯一标识",
"invoiceType": 2,
"fromStationName": "合肥南",
"toStationName": "汉口",
"trainCode": "G598",
"orderNo12306": "E929425786",
"seatNo": "04车厢,12A号"
}
]
}
{
"data": true,
"success": true,
"msg": "请求成功"
}
接口回调请求地址由贵司提供,请联系我司技术人员配置
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| requestID | string | 是 | 【电子发票申请接口】请求时传入的唯一值 |
| success | bool | 是 | 代表本次开票操作所有前置条件是否全部成功 |
| msg | string | 是 | 当本次开票操作前置条件失败时,失败原因,如:很抱歉,您当日的人脸核验次数过多,请明日再试 |
| tickets | TrainTicket[] | 是 | 票信息(对象数组) |
| ticketId | string | 是 | 票唯一标识(唯一值,回调时会返回) |
| success | bool | 是 | 是否开票成功 |
| msg | string | 是 | 开票失败时,失败原因 |
| fromStationName | string | 是 | 出发站站名 |
| toStationName | string | 是 | 到达站站名 |
| trainCode | string | 是 | 车次 |
| seatNo | string | 是 | 坐席详情(格式:06车厢,07D号) |
| carriageNo | string | 是 | 车厢号(如:06) |
| seatType | int | 是 | 座位等级类型(商务座 = 1,特等座 = 2,一等座 = 3,二等座 = 4,高级软卧 = 5,软卧 = 6,动卧 = 7 ,硬卧 = 8,软座 = 9,硬座 = 10,一等卧 = 11,二等卧 = 12,高级动卧 = 13, 一等软座 = 14 , 二等软座 = 15, 特等软座 = 16, 包厢硬卧 = 17, 一人软包 = 18, 多功能座 = 19,优选一等座 = 20, 无座 =98,其他 = 99) |
| seatTypeName | string | 是 | 座位等级名称(和seatType对应) |
| passengerName | string | 是 | 乘客姓名 |
| passengerCardNo | string | 是 | 乘客证件号码 |
| trainDate | string | 是 | 发车日期,格式:yyyy-MM-dd |
| startTime | string | 是 | 发车时间,格式:HH:mm |
| arriveDate | string | 是 | 到达日期,格式:yyyy-MM-dd |
| arriveTime | string | 是 | 到达时间,格式:HH:mm |
| purchaserName | string | 是 | 发票抬头 |
| taxCode | string | 是 | 税号(纳税人识别号) |
| electronicInvoiceType | int | 是 | 电子发票类型(2:票价,3:改签手续费,4:退票手续费) |
| invoicePrice | string | 是 | 发票金额 |
| electronicTicketNumber | string | 是 | 电子客票号 ,,电子发票上的内容,财务需要就使用,不需要忽略即可 |
| invoiceNumber | string | 是 | 发票号码 |
| ofdFileDownloadUrl | string | 是 | OFD文件下载地址(有效期为50分钟) |
| pdfFileDownloadUrl | string | 是 | PDF文件下载地址(有效期为50分钟) |
| redInvoiceNumber | string | 是 | 红冲发票号 |
| redOfdFileDownloadUrl | string | 是 | 红冲发票OFD文件下载地址(有效期为50分钟) |
| redPdfFileDownloadUrl | string | 是 | 红冲发票PDF文件下载地址(有效期为50分钟) |
| 参数名称 | 类型 | 说明 |
|---|
success
| 参数名称 | 类型 | 必填 | 说明 |
|---|---|---|---|
| trainAccount | string | 否 | 乘客本人的12306登录账号-传密文(账号密码 和 乘客姓名证件信息passenger字段 必传一个 ) |
| trainPassword | string | 否 | 乘客本人的12306登录密码-传密文(账号密码 和 乘客姓名证件信息passenger字段 必传一个 ) |
| passenger | Passenger | 否 | 乘客姓名证件信息(不传账号密码时,该字段必填) |
| name | string | 是 | 乘客姓名(passenger->name字段) |
| cardType | int | 是 | 乘客证件类型(passenger->cardType字段) |
| cardNo | string | 是 | 乘客证件号(passenger->cardNo字段) |
| cardValidEndDate | string | 是 | 乘客证件有效期 ,格式yyyy-MM-dd,当证件类型是外国人永久居住证时 该字段必填(passenger->cardValidEndDate字段) |
| electronicInvoiceType | string | 是 | 1:待开发票查询 2:已开发票查询 (必填) |
| startDate | string | 否 | 查询开始时间(yyyy-MM-dd)未传时默认为180天前的日期,最早2024-11-01(乘车日期) |
| endDate | string | 否 | 查询结束时间(yyyy-MM-dd)未传时默认为14天后的日期(乘车日期) |
| orderNo12306 | string | 否 | 12306E字单号(不传,返回所有待开/已开票信息) |
| photoInfo | string | 是 | 人脸照,必填(先将照片文件 通过 文件流 读取到字节数组中,再将 byte[] 通过Base64转成字符串即可)PS: 照片要求: 图片文件大小控制在:100k以内,对于文件较大图片可以等比缩放压缩处理,不能带眼镜 |
| 参数名称 | 类型 | 说明 |
|---|---|---|
| electronicInvoices | ElectronicInvoiceDto[] | 电子客票信息(对象数组) |
| fromStationName | string | 出发站名称 |
| toStationName | string | 到达站名称 |
| trainCode | string | 车次号 |
| orderNo12306 | string | 12306 E字单号 |
| seatNo | string | 坐席详情(格式:06车厢,07D号) |
| carriageNo | string | 车厢号(如:06) |
| seatType | int | 座位等级类型(商务座 = 1,特等座 = 2,一等座 = 3,二等座 = 4,高级软卧 = 5,软卧 = 6,动卧 = 7 ,硬卧 = 8,软座 = 9,硬座 = 10,一等卧 = 11,二等卧 = 12,高级动卧 = 13, 一等软座 = 14 , 二等软座 = 15, 特等软座 = 16, 包厢硬卧 = 17, 一人软包 = 18, 多功能座 = 19,优选一等座 = 20, 无座 =98,其他 = 99) |
| seatTypeName | string | 座位等级名称(和seatType对应) |
| passengerName | string | 乘客姓名 |
| passengerCardNo | string | 乘客证件号好(带*脱敏) |
| trainDate | string | 发车日期,格式:yyyy-MM-dd |
| startTime | string | 发车时间,格式:HH:mm |
| arriveDate | string | 到达日期,格式:yyyy-MM-dd |
| arriveTime | string | 到达时间,格式:HH:mm |
| electronicInvoiceStatus | int | 开票状态枚举值 1:已领取纸质发票 2:未开具 3:开具中 4:开具完成 5:换开中 6:换开完成 |
| electronicInvoiceStatusName | string | 开票状态名称,和electronicInvoiceStatus对应 |
| electronicInvoiceType | int | 电子发票类型(1:普通票,2:改签票,3:改签手续费,4:退票手续费) |
| invoicePrice | decimal | 开票金额 |
| electronicTicketNumber | string | 电子客票号 ,,电子发票上的内容,财务需要就使用,不需要忽略即可 |
| invoiceNumber | string | 发票号码(已开发票查询 且 传了E字单号时才会返回值) |
| ofdFileDownloadUrl | string | 发票ofd格式文件下载地址(已开发票查询 且 传了E字单号时才会返回值) |
| pdfFileDownloadUrl | string | 发票pdf格式文件下载地址(已开发票查询 且 传了E字单号时才会返回值) |
| redinvoiceNumber | string | 红冲发票号(已开发票查询 且 传了E字单号时才会返回值) |
| redOfdFileDownloadUrl | string | 红冲发票ofd文件下载地址(已开发票查询 且 传了E字单号时才会返回值) |
| redPdfFileDownloadUrl | string | 红冲发票pdf文件下载地址(已开发票查询 且 传了E字单号时才会返回值) |
账号密码+人脸模式:
{
"appKey": "您申请的appKey",
"trainAccount":"12306用户名-密文",
"trainPassword":"12306登录密码-密文",
"electronicInvoiceType": "1",
"photo": "人脸照的Base64加密串"
}
乘客姓名证件+人脸模式:
{
"appKey": "您申请的appKey",
"passenger": {
"name": "姓名",
"cardType": 1,
"cardNo": "证件号"
},
"electronicInvoiceType": "1",
"photo": "人脸照的Base64加密串"
}
{
"data": {
"electronicInvoices": [
{
"fromStationName": "武汉",
"toStationName": "合肥南",
"trainCode": "G650",
"orderNo12306": "E903102785",
"seatNo": "06车厢,07D号",
"carriageNo": "06",
"seatType": 4,
"seatTypeName": "二等座",
"passengerName": "张三",
"passengerCardNo": "3411***********990",
"trainDate": "2025-09-13",
"startTime": "20:55",
"arriveDate": "2025-09-13",
"arriveTime": "22:37",
"electronicInvoiceStatus": 2,
"electronicInvoiceStatusName": "未开具",
"electronicInvoiceType": 1,
"invoicePrice": 134.0,
"electronicTicketNumber": "6580084566091490455752025",
"invoiceNumber": null,
"file": null,
"ofdFileDownloadUrl": null,
"pdfFileDownloadUrl": null,
"redinvoiceNumber": null,
"redOfdFileDownloadUrl": null,
"redPdfFileDownloadUrl": null
},
{
"fromStationName": "合肥南",
"toStationName": "汉口",
"trainCode": "G598",
"orderNo12306": "E929427625",
"seatNo": "04车厢,12A号",
"carriageNo": "04",
"seatType": 4,
"seatTypeName": "二等座",
"passengerName": "张三",
"passengerCardNo": "3411***********990",
"trainDate": "2025-09-12",
"startTime": "09:50",
"arriveDate": "2025-09-12",
"arriveTime": "11:34",
"electronicInvoiceStatus": 2,
"electronicInvoiceStatusName": "未开具",
"electronicInvoiceType": 1,
"invoicePrice": 133.0,
"electronicTicketNumber": "1942377074691298857472025",
"invoiceNumber": null,
"file": null,
"ofdFileDownloadUrl": null,
"pdfFileDownloadUrl": null,
"redinvoiceNumber": null,
"redOfdFileDownloadUrl": null,
"redPdfFileDownloadUrl": null
}
]
},
"success": true,
"msg": "请求成功"
}
联系我们
| 内容 | 详细 | |
| 售前咨询: | 15021905015 | |
| 客服热线: | 17306152795 | |
| 在线客服QQ: | 1437759532 | |
| 测试工具: | 推荐使用PostMan | |
| 技术支持: | info@panhe.net |
Copyright© 2018-2025 上海磐河信息科技有限公司 版权所有 沪ICP备18026112号-1
联系人:张经理 kf@panhe.net 联系电话:150-2190-5015