H5单点登录接口V1.0
概述
注意事项

契约
1.对接说明
2.接口方法说明
2.1.获取令牌 (后端调用)
| 调用地址: | https://ct.ctrip.com/corpservice/authorize/getticket |
| 调用方式: | HTTPS + POST 表单 |
| 方法名: | 获取票证 |
| 描述: | 根据已设定的公司接入账户和公司接入密码获得登录令牌。在调用单点登录服务前,必须要先获取令牌,通过令牌进行登录。申请令牌时的客户接入账户必须与登录时的接入账户是一致的。令牌的只能使用一次,登录后不管成功与否,令牌都会失效,需要重新申请令牌方可再次登录。 |
| 参数: | 实体TicketModel实例化对象 |
| 参数类型: | 对象类型 |
2.2.单点登录H5SignInfo(前端调用)
| 调用地址: | https://ct.ctrip.com/m/SingleSignOn/H5SignInfo |
| 调用方式: | https + post(不支持ajax方式调用) |
| 方法名: | H5签牌信息 |
| 描述: | 根据登录令牌进行单点登录,并传递相关预订信息到携程企业商旅预订站点。获取到令牌后,通过当前服务进行登录验证。客户公司用户的身份校验合法,则会登录到指定的页面,如果身份校验失败则会返回对应的错误信息。 |
| 参数: | Form表单 |
| 参数类型: | 表单参数 |
3.接口契约说明
3.1.获取令牌
3.1.1.请求契约
| TicketModel (票证模型) | |||||
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 备注 |
| 应用密钥 | 字符串 | 接入账号 | N | 由携程方提供 | |
| AppSecurity 应用程序安全 | 字符串 | 接入密码 | N | 由携程方提供 | |
3.1.2.返回契约
| 返回Json数据 | ||||
| 字段 | 类型 | 描述 | 可为空 | 备注 |
| 令 牌 | 字符串 | 单点登录令牌 | N | |
| 法典 | Int (整数) | 0 成功;1 参数验证失败;2 接口异常; | N | |
| 消息 | 字符串 | Result不为Success时给出具体错误信息 | N | |
| 成功 | 布尔 | 是否接口调用成功 | N | True:调用成功 False:调用失败 |
3.2.单点登录H5SignInfo
3.2.1请求契约
| POST参数说明 | |||
| 参数名 | 参数类型 | 可为空 | 备注 |
| 访问用户 ID | 字符串 | N | 单点登录接入账号(同AppKey),由携程方提供 |
| 员工 ID | 字符串 | N | 员工编号(长度最长100) |
| 令 牌 | 字符串 | N | 单点登录令牌,调用以上接口获取 |
| 应用程序 ID | 字符串 | N | 公司ID,由携程方提供 |
| 签名 | 字符串 | N | 签名生成规则说明: 1.加密方式为MD5,32位小写 2.加密字段 MD5(AccessUserId+EmployeeID + CorpPayType +CostCenter1+CostCenter2+CostCenter3+MD5(AppSecurity)) 示例:MD5(“obk_test”+“test”+“public”+“costcenter1” +“costcenter2”+“costcenter3”+MD5(“XXXX”)) 加密后的值为:7aec59d0e0724318c77119aa6b051ed1 具体规则参照:MD5加密示例 |
| 背书 ID | 字符串 | Y | 审批单号,有提前审批业务时使用,长度最长30。注意:不支持紧急预订 |
| 搜索类型 | 字符串 | Y | 搜索类型(取值范围:domestic_flight国内机票, international_flight国际机票, domestic_hotel国内酒店, oversea_hotel海外酒店)(传值说明:该字段和EndorsementID字段配合使用,表示该审批单号的所属产线类型。不区分大小写) |
| WebViewEnv | 字符串 | Y | 客户端的webView环境(例如DD表示钉钉环境) |
| CorpPayType | 字符串 | Y | 预定类型 public(因公)/private(因私)/ public_only(仅因公)/private_only(仅因私),如果不传默认为因公。 |
| 公司业务模型 | 字符串 | N | 商旅业务模式枚举值: TMC 不填默认为 TMC |
| InitPage | 字符串 | N | 登录成功后的第一个页面可选值为: Home 首页 HotelSearch 酒店 FlightSearch 机票 TrainSearch 火车票 CarSearch 用车(仅支持中文版) 接送机(仅支持中文版) 接送火车(仅支持中文版) 租车 马上用车 MyOrder 订单列表页 FlightOrder 机票订单列表 HotelOrder 酒店订单列表 CorpBusOrder 汽车票订单列表 TrainOrder 火车票订单列表 CarOrder 用车订单列表 AccreditOrder 授权 航班列表 CorpBusSearch 汽车票查询(仅支持中文版) HotelList 酒店列表页(当酒店差标设定为出行人模式时,单点登录不支持跳转至酒店列表页) TrainList 火车车次列表页 CarCharterSearch (国内包车) TravelManage 管理页 OnlineReport 在线报告页 HotelTravelerChoice 酒店-出行人前选页 旅行行程 OnlineReportPersonalH5 差旅足迹 CustomerServer 在线客服 福利旅游首页 : 福利旅游首页 |
| 网站 | 字符串 | Y | 登录成功后直接跳转至订单详情页,需要与下面的 orderNumber参数同时有值。不传时单点登录成功后跳转到上面的InitPage。 可选值为: 航班(机票订单详情) Hotel(酒店订单详情) 火车票订单详情 CarCH(国内接送机订单详情) CarSD(租车订单详情) 行程 (行程详情) OnCall(随叫随到订单详情) ChartCar(包车订单详情类型) ProgressMap(马上用车订单地图页) CorpBus (汽车票订单详情) |
| 订单编号 | 字符串 | Y | 订单号。登录成功后直接跳转至对应订单详情页,需要与上面的Site同时有值。不传时单点登录成功后跳转到上面的InitPage。 |
| 回调 | 字符串 | N | 首页(https://ct.ctrip.com/webapp/home),或者返回到客户页面的URL |
browser返回 | 字符串 | Y | 用于控制哪些页面的回退不按照CallBack字段回退,而是按照默认回退。目前支持预订产品列表页: productlist 。 |
| 成本中心1 | 字符串 | Y | 成本中心1 |
| 成本中心2 | 字符串 | Y | 成本中心2 |
| 成本中心3 | 字符串 | Y | 成本中心3 |
| 成本中心4 | 字符串 | Y | 成本中心4 |
| 成本中心5 | 字符串 | Y | 成本中心5 |
| 成本中心6 | 字符串 | Y | 成本中心6 |
| 项目 | 字符串 | Y | 项目号 |
| 旅程原因 | 字符串 | Y | 出行目的 |
| 成本中心自定义 1 | 字符串 | Y | 自定义字段1 |
| 成本中心自定义 2 | 字符串 | Y | 自定义字段2 |
| 语言 | 字符串 | Y | 默认为简体中文,简体中文: zh-cn,英文: en。 |
| 字符串 | Y | 一次授权人员工编号, | |
| 字符串 | Y | 二次授权人员工编号, | |
| 字符串 | Y | 采购类型(PERSONAL表示不做差标管控,不展示差标入口,不做提前审批管控,只能用个付;) | |
| OnError 错误 | 字符串 | Y | 错误处理方式,可选值(ErrorCode 或不传) OnError = ErrorCode时,登录失败返回如下 { “结果” : true, “响应” : { “ErrorCode” : “10302001”, “ErrorMsg” : “获取UID失败”” }, “LS” : “2”, “OV” : “11”} OnError不传时,登录失败则返回空白页 ErrorCode对照表提示编码 提示信息 10301050 传入的UID和EmployeeID不能同时为空 10301016 身份校验失败。 10301017签名校验失败,可能是数据已更改。 10301048字段Signature必须是最大长度为32的字符串。 10302004 Hash验证不通过 10302005 hash验证非员工登录失败 10301023 UID不存在,请联系携程! 10302100 未知错误 10302101 {0}不能为空 10302102 {0}必须为数字 10302103 未获取到的有效的用户邮箱。 10302104 token验证失败 10301027 请提供请求数据 10302106 返回值为空 10301022 开卡失败。 10302110 子账号信息不存在 10302111 AccessUserId不能为空 10301037 token无效。 10301039 token使用次数失效。 10301008 该用户已注销,请联系携程 10301024 UID或员工编号不属于该公司,请联系携程! 10301059 UID未关联子账户 10301055 接入账户不能为空 10301056 接入密码不能为空 10301054 TokenType可以不赋值,赋值只能为0或1或2。 10301025 很抱歉,您的账户未在携程注册,请联系贵司 相关负责人,开通携程账户后方可登录。 Sorry that your account has not been registered in CTRIP Corporate online booking site. Please contact your company system manager in order to register your CTRIP account. 10301021 员工编号不能为空! 10301069 FirstName,MiddleName,LastName不能包含中文 10301070 FirstName,MiddleName,LastName不能包含特殊字符 字段必须是最大长度为的字符串。 10301100 单点登录到航班列表页不支持按政策执行人预订 10301018 接口权限未开启 10301201 单点登录到酒店列表页不支持按政策执行人预订 10301202 入住日期格式非法 10301203 离店格式非法 10301204 酒店入住日期大于等于离店日期 10301205 酒店入住日期过期 10301207 海外酒店没有传入酒店房间数 10301208 入住城市没有传入cityID或cityName 10301209 没有传入城市ID,且城市名称传入错误 10301210 根据城市名称,没有查询出城市ID 10301211 IsOverseas为T,但是城市是国内 10301212 IsOverseas为F,但是城市是海外 10301213 没有传入城市名称,且城市ID传入错误 10301214 根据城市ID,没有查询出城市名称 10301215 根据城市ID,查询出城市数据,但是城市名称根据语言环境返回为空 10301216 酒店最大入住天数不能超过28天 10301301 火车票行程类型必须是S或者D 10301305 到达日期格式非法 10301306 到达日期不能早于出发日期 |
3.2.2 机票航班列表查询参数
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 传值规则 |
| String | 航程类型 | N | 单程:, 往返: | ||
| String | 舱等类型 | Y | 国内机票不传默认不限,:经济舱, :公务或头等舱国际机票不传默认经济舱,:经济舱,:超级经济舱,:公务舱,:头等舱 | ||
| String | 航司二字码 | Y | 不传默认全部 | ||
| String | 去程出发日期 | N | 航程类型为单程往返时需必传, 格式 | ||
| 字符串 | 回程起飞日期 | N | 航程类型为往返时需必传格式注: 回程起飞日期不能晚于去程起飞日期 | ||
| 字符串 | 去程出发城市三字码 | N | 航程类型为单程往返时需必传,如深圳 SZX | ||
| 字符串 | 去程出发城市ID | N | 城市三字码或城市id选其一传入 | ||
| 字符串 | 回程到达城市三字码 | N | 航程类型为单程往返时需必传,如上海 SHA | ||
| 字符串 | 回程到达城市ID | N | 城市三字码或城市id选其一传入 | ||
| 字符串 | 是否仅查看直飞 | Y | 不传默认:仅查看直飞,:查看全部只有国际机票需要 | ||
| InitPage | 字符串 | 跳转页面 | N | 航班列表 | |
| 字符串 | 语言版本 | Y | 默认为简体中文,简体中文: zh-cn,英文: en | ||
| 最大价格 | 字符串 | Y | 按价格范围查询,可传入预期搜素价格范围的最高价 | ||
| DDate1 | 字符串 | 第一程出发日期 | Y | 航程类型为联程时需必传日期格式为:YYYY-MM-DD,如(2017-02-20) | |
| DDate2 | 字符串 | 第二程出发日期 | Y | 航程类型为联程时需必传日期格式为:YYYY-MM-DD,如(2017-02-20) | |
| DDate3 | 字符串 | 第三程出发日期 | Y | 航程类型为联程且航程数>=3时,需必传日期格式为:YYYY-MM-DD,如(2017-02-20) | |
| DDate4 | 字符串 | 第四程出发日期 | Y | 航程类型为联程且航程数>=4时,需必传日期格式为:YYYY-MM-DD,如(2017-02-20) | |
| DDate5 | 字符串 | 第五程出发日期 | Y | 航程类型为联程且航程数>=5时,需必传日期格式为:YYYY-MM-DD,如(2017-02-20) | |
| DDate6 | 字符串 | 第六程出发日期 | Y | 航程类型为联程且航程数>=6时,需必传日期格式为:YYYY-MM-DD,如(2017-02-20) | |
| 直流1 | 字符串 | 第一程出发城市三字码 | N | 城市三字码数据请联系实施经理必传字段字段长度限制为3如:SZX(深圳) | |
| 直流2 | 字符串 | 第二程出发城市三字码 | Y | 航程类型为联程是为必传字段长度限制为3如:SZX(深圳) | |
| 直流3 | 字符串 | 第三程出发城市三字码 | Y | 航程类型为联程且航程数>=3时,需必传字段长度限制为3如:SZX(深圳) | |
| 直流4 | 字符串 | 第四程出发城市三字码 | Y | 航程类型为联程且航程数>=4时,需必传字段长度限制为3如:SZX(深圳) | |
| 直流5 | 字符串 | 第五程出发城市三字码 | Y | 航程类型为联程且航程数>=5时,需必传字段长度限制为3如:SZX(深圳) | |
| 直流6 | 字符串 | 第六程出发城市三字码 | Y | 航程类型为联程且航程数>=6时,需必传字段长度限制为3如:SZX(深圳) | |
| DCityId1 | int | 第一程出发城市ID | N | 城市ID和三字码选其一使用 | |
| DCityId2 | int | 第二程出发城市ID | N | 城市ID和三字码选其一使用 | |
| DCityId3 | int | 第三程出发城市ID | N | 城市ID和三字码选其一使用 | |
| DCityId4 | int | 第四程出发城市ID | N | 城市ID和三字码选其一使用 | |
| DCityId5 | int | 第五程出发城市ID | N | 城市ID和三字码选其一使用 | |
| DCityId6 | int | 第六程出发城市ID | N | 城市ID和三字码选其一使用 | |
| ACity1 | 字符串 | 第一程到达城市三字码 | N | 必传字段字段长度限制为3如:SZX(深圳) | |
| ACity2 | 字符串 | 第二程到达城市三字码 | Y | 航程类型为联程时需必传字段长度限制为3 | |
| ACity3 | 字符串 | 第三程到达城市三字码 | Y | 航程类型为联程且航程数>=3,时需必传字段长度限制为3如:SZX(深圳) | |
| ACity4 | 字符串 | 第四程到达城市三字码 | Y | 航程类型为联程且航程数>=4,时需必传字段长度限制为3如:SZX(深圳) | |
| ACity5 | String | 第五程到达城市三字码 | Y | 航程类型为联程且航程数>=5,时需必传字段长度限制为3如:SZX(深圳) | |
| ACity6 | String | 第六程到达城市三字码 | Y | 航程类型为联程且航程数>=6,时需必传字段长度限制为3如:SZX(深圳) | |
| ACityId1 | int | 第一程到达城市ID | N | 城市ID和三字码选其一使用 | |
| ACityId2 | int | 第二程到达城市ID | N | 城市ID和三字码选其一使用 | |
| ACityId3 | int | 第三程到达城市ID | N | 城市ID和三字码选其一使用 | |
| ACityId4 | int | 第四程到达城市ID | N | 城市ID和三字码选其一使用 | |
| ACityId5 | int | 第五程到达城市ID | N | 城市ID和三字码选其一使用 | |
| ACityId6 | int | 第六程到达城市ID | N | 城市ID和三字码选其一使用 | |
| FlightNumber | String | 航程数 | Y | 联程查询时必传,非多程不必传 | |
| segmentInfo | String | 按航班号查询 | Y | 航班号指定信息查询(json格式化后进行UrlEncode)传参方式详见4.2 |
3.2.3 酒店页面跳转参数
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 传值规则 |
| IsOversea | 字符串 | 是否海外酒店 | N | T:海外酒店;F:国内酒店;其它值:非法参数 | |
| 酒店类型 | 字符串 | 酒店类型 | Y | 非必传,M:会员酒店;C:协议酒店;其它值:非法参数 | |
| corpPayType | String | 预定类型 | N | private:因私;public:因公;其它值:非法参数 | |
| CityID | String | 城市ID(数字格式) | N | ||
| CityName | String | 城市名称 | Y | 否,传入则必须跟CityID对应 | |
| CheckInDate | String | 入住日期 | N | 日期格式:yyyy-MM-dd,(例如:2016-12-08) | |
| 结帐日期 | 字符串 | 离店日期 | N | 日期格式:yyyy-MM-dd,(例如:2016-12-08) | |
| 房间号 | 字符串 | 房间数 | Y | 海外酒店,必传,国内酒店,非必传 搜索海外酒店时,房间数(大于等于1) | |
| InitPage | 字符串 | 跳转页面 | N | 酒店列表 | |
| 字符串 | 语言版本 | Y | 默认为简体中文,简体中文: zh-cn,英文: en | ||
| 字符串 | 酒店id | Y | 支持多个(使用逗号,分隔),数量不超过20个 | ||
| 酒店搜索类型 | 字符串 | 酒店id搜索规则 | Y | SORT-指定HotelIds的酒店显示在列表第一;FILTER-只显示指定HotelIds的酒店 | |
| CustomSearchKeyword | 字符串 | 自定搜索关键字 | Y | 关键字带入仅在入参首页和查询页时生效,跳转酒店列表页的场景下不生效。 | |
| AdultQuantity (成人数量) | 字符串 | 成人数量 | Y | ||
| IsHmt | 字符串 | 是否是港澳台 | Y | ||
| 地理类别 ID | 字符串 | 行政区域类型(国家:1,省份:2,城市:3,行政区:4,景区:5,商圈:6) | Y | ||
| geoCategory名称 | 字符串 | 行政区名称 | Y |
3.2.4 火车票页面跳转参数
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 传值规则 |
| TrainSearchType (火车搜索类型) | 字符串 | 搜索行程类型 | N | 单程:S;往返:D | |
| 直流 | 字符串 | 出发地 | N | 出发地名 例如:北京东 | |
| DCityId | 字符串 | 出发地城市ID | N | 与城市名二选一传入 | |
| ACity | 字符串 | 到达地 | N | 到达地名 例如:上海 | |
| ACityId | 字符串 | 到达地城市id | N | 与城市名二选一传入 | |
| Sdate | 字符串 | 出发日期 | N | 格式::yyyy-MM-dd | |
| Edate 餐厅 | 字符串 | 返程日期 | N | 格式: yyyy-MM-dd | |
| CorpPayType | 字符串 | 因公/因私 | Y | 预定类型 public(因公)/private(因私),如果不传默认为因公。 | |
| 语言 | 字符串 | 语言版本 | Y | 默认为简体中文,简体中文: zh-cn,英文: en | |
| InitPage | 字符串 | 跳转页面 | Y | 火车列表 |
3.2.5 国内和国际接送机页面跳转参数
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 传值规则 |
| 图案类型 | 字符串 | 产品的形态类型 | Y | 接 =17, 送 =18 | |
| 航班号 | 字符串 | 航班号 | Y | 例如:HO5648 | |
| Ddate | 字符串 | 起飞日期 | Y | 格式: yyyy-MM-dd | |
| InitPage | 字符串 | 跳转页面 | Y | 汽车SF |
3.2.6 国内接送火车页面跳转参数
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 传值规则 |
| 图案类型 | 字符串 | 产品的形态类型 | Y | 接 =17, 送 =18 | |
| 位置名称 | 字符串 | 车站名称 | Y | 例如: 上海虹桥站、上海南站 | |
| 位置 ID | 字符串 | 火车站ID | Y | 例如: 3156、1 | |
| InitPage | 字符串 | 跳转页面 | Y | 卡斯特 |
3.2.7包车页面跳转参数
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 传值规则 |
| 使用时间 | 字符串 | 用车时间 | Y | 格式:yyyy-MM-dd HH:mm:ss | |
| UseDuration | String | 包车天数 | Y | 整数 | |
| MapCode | String | 地图类型 | Y | BD09,GCJ02,WGS84。 | |
| DepartureCityId | String | 上车点-城市ID | Y | ||
| DepartureCityName | String | 上车点-城市名称 | Y | ||
| DepartureAddressName | String | 上车点-地址名称 | Y | ||
| DepartureLongitude | String | 上车点-经度 | Y | 数字,如121.358189 | |
| DepartureLatitude | String | 上车点-纬度 | Y | 数字,如31.226042 | |
| ArrivalCityId | String | 下车点-城市ID | Y | ||
| ArrivalCityName | String | 下车点-城市名称 | Y | ||
| ArrivalAddressName | String | 下车点-地址名称 | Y | ||
| ArrivalLongitude | 字符串 | 下车点-经度 | Y | 数字,如121.358189 | |
| 到达纬度 | 字符串 | 下车点-纬度 | Y | 数字,如31.226042 | |
| InitPage | 字符串 | 跳转页面 | N | CarCharter 搜索 |
3.2.8马上用车
| 字段 | 类型 | 描述 | 默认值 | 可为空 | 传值规则 |
| InitPage | 字符串 | 跳转页面 | Y | CarOC 系列 | |
| IsOversea | 字符串 | 是否是国际打车 | F | Y | T:国际打车;F:国内打车;其他值:非法参数 |
4.调用方法及代码示例
4.1.接口调用示例代码
4.1.1 获取令牌
| 12345 | String url = '***'; String postString = '{ \'appKey\': \'***\', \'appSecurity\': \'***\'}'; String result = PostData (url, postString); |
4.1.2 单点登录H5SignInfo
| 123456789101112131415161718192021 | <html xmlns='http://www.w3.org/1999/xhtml'> <head> <title>测试表单title>head><body> <form action='https://ct.ctrip.com/m/SingleSignOn/H5SignInfo' method='post' target= <input type='hidden' name='accessuserid' value='***' /> <input type='hidden' name='employeeid' value='' /> <input type='hidden' name='signature' value='***' /> <input type='hidden' name='initpage' value='Home' /> <input type='hidden' name='appid' value='***' /> <input type='hidden' name='endorsementID' value='1234567' /> <input type='hidden' name='token' value='***' /> <input type='hidden' name='onerror' value='errorcode' /> <input value='单点登录' type='submit' onclick='a()' /> form>body>html> |
4.1.3 单点登录H5SignInfo(get方式)
需要将【AccessUserId=xxx&Token=xxx&Appid=xxx&EmployeeId=xxx】和其他需要的参数,先base64编码,再进行url编码,
作为单点登录的【SsoData】参数。
(备注:xxx是url编码后的参数值,url编码方式是js的encodeURIComponent)
eg:【https://ct.ctrip.com/m】encodeURIComponent编码后是【https%3A%2F%2Fct.ctrip.com%2Fm】
url样例:
https://ct.ctrip.com/m/SingleSignOn/H5SignInfo?SsoData=base64 加密且url编码后的字符串
请求示例:

注意:Token已经加密后放到SsoData参数中了,不需要再在url上带一个额外的Token参数。
例如:
https://ct.ctrip.com/m/SingleSignOn/H5SignInfo?SsoData=xxxx 正确
https://ct.ctrip.com/m/SingleSignOn/H5SignInfo?SsoData=xxxx&Token=aaa 不正确
4.2 传参说明
4.2.1 segmentInfo 传参说明
[
{
“segmentNo”: “1”,
“flightNoList”: [
{
“flightNo”: “MU1234”,
“flightDate”: “2025-11-22 00:00:00”
},
{
“flightNo”: “MU1235”,
“flightDate”: “2025-12-22 00:00:00”
}
]
},
{
“segmentNo”: “2”,
“flightNoList”: [
{
“flightNo”: “MU1234”,
“flightDate”: “2025-12-23 00:00:00”
},
{
“flightNo”: “MU1235”,
“flightDate”: “2025-12-24 00:00:00”
}
]
}
]
segmentInfo : %5B%7B%22segmentNo%22%3A%221%22%2C%22flightNoList%22%3A%5B%7B%22flightNo%22%3A%22MU1234%22%2C%22flightDate%22%3A%222025-11-22+00%3A00%3A00%22%7D%2C%7B%22flightNo%22%3A%22MU1235%22%2C%22flightDate%22%3A%222025-12-22+00%3A00%3A00%22%7D%5D%7D%2C%7B%22segmentNo%22%3A%222%22%2C%22flightNoList%22%3A%5B%7B%22flightNo%22%3A%22MU1234%22%2C%22flightDate%22%3A%222025-12-23+00%3A00%3A00%22%7D%2C%7B%22flightNo%22%3A%22MU1235%22%2C%22flightDate%22%3A%222025-12-24+00%3A00%3A00%22%7D%5D%7D%5D
java: URLEncoder.encode(JsonUtil.toJson(List.of(segmentInfo1, segmentInfo2)), StandardCharsets.UTF_8)
其中segmentNo、flightNoList、flightNo、flightDate 均为必传参数,请注意。
5.WebView配置信息
| 123 | WebViewClient wvClient = new WebViewClient() {}; webView.setWebViewClient(wvClient); |
| 123456789101112131415161718192021222324252627 | WebSettings settings = getSettings();settings.setUserAgentString(userAgent);settings.setJavaScriptEnabled(true);settings.setAppCacheEnabled(true);// 可自行将路径设置为需要使用的本地缓存文件夹settings.setAppCachePath(getContext().getCacheDir().getAbsolutePath());settings.setDomStorageEnabled(true);settings.setDatabaseEnabled(true);settings.setSaveFormData(true);settings.setGeolocationEnabled(true);settings.setJavaScriptCanOpenWindowsAutomatically(true);settings.setAllowFileAccess(true);// 设置允许通过file url加载的Javascript读取其他的本地文件settings.setAllowFileAccessFromFileURLs(true);// 设置允许通过file url加载的Javascript可以访问其他的源,包括其他的文件和http/https等源。settings.setAllowUniversalAccessFromFileURLs(true);settings.setCacheMode(WebSettings.LOAD_NO_CACHE);if (Env.isDebug) { WebView.setWebContentsDebuggingEnabled(true);}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { CookieManager.getInstance().setAcceptThirdPartyCookies(this, true);}// https与http混合资源处理if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);} |
5.3 IPhoneX 头部适配
在请求头的UserAgent中添加ScreenFringe字段即可。
5.4 Native WebView中需要开启第三方Cookie支持
IOS代码
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
Andoird代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(this, true);
}
6.Android接入支付宝和微信支付
支付宝支付需要接入支付宝的SDK,微信支付不需要进行额外的接入操作。
6.1 接入支付宝SDK流程
| 12345678910 | <activity android:name='com.alipay.sdk.app.H5PayActivity' android:configChanges='orientation|keyboardHidden|navigation' android:exported='false' android:screenOrientation='behind'/><activity android:name='com.alipay.sdk.auth.AuthActivity' android:configChanges='orientation|keyboardHidden|navigation' android:exported='false' android:screenOrientation='behind'/> |
| 12345 | <uses-permission android:name='android.permission.INTERNET'/><uses-permission android:name='android.permission.READ_PHONE_STATE'/><uses-permission android:name='android.permission.ACCESS_NETWORK_STATE'/><uses-permission android:name='android.permission.ACCESS_WIFI_STATE'/><uses-permission android:name='android.permission.WRITE_EXTERNAL_STORAGE'/> |
| 12345678910111213141516171819 | -keep class com.alipay.android.app.IAlixPay{*;}-keep class com.alipay.android.app.IAlixPay$Stub{*;}-keep class com.alipay.android.app.IRemoteServiceCallback{*;}-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}-keep class com.alipay.sdk.app.PayTask{ public *;}-keep class com.alipay.sdk.app.AuthTask{ public *;}-keep class com.alipay.sdk.app.H5PayCallback { }-keep class com.alipay.android.phone.mrpc.core.** { *; }-keep class com.alipay.apmobilesecuritysdk.** { *; }-keep class com.alipay.mobile.framework.service.annotation.** { *; }-keep class com.alipay.mobilesecuritysdk.face.** { *; }-keep class com.alipay.tscenter.biz.rpc.** { *; }-keep class org.json.alipay.** { *; }-keep class com.alipay.tscenter.** { *; }-keep class com.ta.utdid2.** { *;}-keep class com.ut.device.** { *;} |
6.2 动态授权
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 | /** * 获取权限使用的 RequestCode */private static final int PERMISSIONS_REQUEST_CODE = 1002; /** * 检查支付宝 SDK 所需的权限,并在必要的时候动态获取。 * 在 targetSDK = 23 以上,READ_PHONE_STATE 和 WRITE_EXTERNAL_STORAGE 权限需要应用在运行时获取。 * 如果接入支付宝 SDK 的应用 targetSdk 在 23 以下,可以省略这个步骤。 */private void requestPermission() { // Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, PERMISSIONS_REQUEST_CODE); } else { // 所需的权限均正常获取进行跳转支付平台的操作 }} /** * 权限获取回调 */@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case PERMISSIONS_REQUEST_CODE: { // 用户取消了权限弹窗 if (grantResults.length == 0) { // 提示用户支付宝需要相关权限 return; } // 用户拒绝了某些权限 for (int x : grantResults) { if (x == PackageManager.PERMISSION_DENIED) { // 提示用户支付宝需要相关权限 return; } } // 所需的权限均正常获取进行跳转支付平台的操作 } }} |
6.3 实现微信支付和支付宝支付
如上准备工作完成后,接下来在项目中接入相关代码实现APP支付功能。
找到项目中使用的webview,设置webview的WebViewClinet,在shouldOverrideUrlLoading方法中加入如下代码:
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | WebView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 微信支付 if (url.startsWith('weixin://wap/pay')) { return awakenThirdApp(url); } // 拦截唤醒支付宝 final PayTask task = new PayTask(activity); boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() { @Override public void onPayResult(final H5PayResultModel result) { // 支付结果返回 final String url = result.getReturnUrl(); if (!TextUtils.isEmpty(url)) { WebView.loadUrl(url); // 加载url } } }); if (isIntercepted) { return true; } if (url.startsWith('alipays:') || url.startsWith('alipay')) { return awakenThirdApp(url); } return false; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return shouldOverrideUrlLoading(view, request.getUrl().toString()); } } private boolean awakenThirdApp(String url) { try { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); getContext().startActivity(intent); return true; } catch (ActivityNotFoundException e) { e.printStackTrace(); return false; } } |
至此整个接入流程就已经完成了。
7. IOS接入支付宝和微信支付
7.1 IOS接入支付宝
7.1.1 准备相关SDK
支付宝支付需要接入支付宝的 SDK,先去支支付宝的开发者下载支付相关的 SDK 集成到 项目中。相关连接:https://docs.open.alipay.com/204/105295/,按照文档导入支付宝的 SDK,配置好相关的权限。

7.1.2 增加头文件引用
在需要调用到AlipaySDK的文件中,增加头文件引用import
7.1.3 配置支付宝客户端返回url处理方法
外部存在支付宝钱包,支付宝钱包将处理结果通过url返回。
Urlscheme 要添加 alipay fromScheme 为接入app的 scheme,用于支付宝回调用。
7.1.4 调用支付API
H5中调用的接口主要是下面这个:
| 123 | [[AlipaySDK defaultService] payInterceptorWithUrl:url.absoluteString fromScheme:url.scheme callback:^(NSDictionary * result){ NSLog('%@',result); }]; |
具体项目中的实现逻辑是h5中调用。
在wkwebview的代理方法中调用如下代码:
| 123456789101112131415161718192021222324252627282930313233343536373839404142 | - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{ //新版本的H5拦截支付对老版本的获取订单串和订单支付接口进行合并,推荐使用该接口 BOOL isIntercepted = [[AlipaySDK defaultService] payInterceptorWithUrl:[request.URL absoluteString] fromScheme:@'alisdkdemo' callback:^(NSDictionary *result) { // 处理支付结果 NSLog(@'%@', result); // isProcessUrlPay 代表 支付宝已经处理该URL if ([result[@'isProcessUrlPay'] boolValue]) { // returnUrl 代表 第三方App需要跳转的成功页URL NSString* urlStr = result[@'returnUrl']; // 跳转到指定url逻辑,实现方法在下面 [self loadWithUrlStr:urlStr]; } }]; if (isIntercepted) { return NO; } else { NSString *reqUrl = request.URL.absoluteString; if ([reqUrl hasPrefix:@'alipays://'] || [reqUrl hasPrefix:@'alipay://']) { // NOTE: 跳转支付宝App BOOL bSucc = [[UIApplication sharedApplication] openURL:request.URL]; if (!bSucc) { // 提示未安装支付宝 } return NO; } } return YES;}// 在当前webview加载指定url - (void)loadWithUrlStr:(NSString*)urlStr{ if (urlStr.length > 0) { dispatch_async(dispatch_get_main_queue(), ^{ NSURLRequest *webRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlStr] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30]; [self.webView loadRequest:webRequest]; }); }} |
7.2 IOS接入微信支付
7.2.1 设置 info.plist
在 LSApplicationQueriesSchemes,添加 weixin 。

7.2.2 WKWebView 的代理方法添加处理代码
| 123456789 | - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{ NSURL *url= navigationAction.request.URL; if([url.scheme isEqualToString:@'weixin']) { [[UIApplication sharedApplication] openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } decisionHandler(WKNavigationActionPolicyAllow);} |
8. 常见问题
8.1 微信企业App(定制环境)接入单点登录
需要设置信任域名,
域名
ct.ctrip.com
secure.trip.com
secure.ctrip.com
https端口 443
8.2 在商旅中定位或打卡会有弹窗提示
使用定位功能需要获取系统相关权限,必定会有弹窗提示
8.3 客户使用schema唤起支付宝支付(alipays:// )无法唤起
支付宝现在支持的schema是 alipay://,不带s的.
8.4 微信支付失败
提示如下:
请确认请求头中,包含对应的Referer且值为“https://secure.ctrip.com”。
如下所示:Headers.put(“Referer”, “https://secure.ctrip.com”);
版本
| 版本号 | 编写日期 | 更改内容 |
| V1.0 版本 | 2015/9/21 | 初稿 |
| V1.1 版 | 2015/10/21 | 添加错误代码 |
| 3.0 版 | 2016/5/12 | 统一文档格式 |
| 3.1 版 | 2016/5/16 | 删除版本记录,更新ErrorCode信息 |
| V3.2 版 | 2016/5/19 | 调整样式、适应开发API接口文档系统展示 |
| V3.3 版 | 2016/5/23 | 去除RelatedJourney字段描述 |
| 3.4 版 | 2016/6/1 | 调整HTML调用示例和注意事项格式 |
| V3.5 版 | 2016/6/14 | 添加附录 |
| 3.6 版 | 2016/6/15 | 修改关联审批单号长度最长30,请求契约添加Name字段 |
| 3.7 版 | 2016/8/3 | Demo代码中添加onError |
| 3.8 版 | 2016/8/4 | 添加时序图 |
| 3.9 版 | 2016/8/5 | 修改文档字体、代码样式 |
| 4.0 版 | 2016/9/27 | 修改参数类型 |
| 4.1 版 | 2016/10/17 | 修改单点登录H5SignInfo接口协议为Https |
| 4.2 版 | 2016/12/1 | 自动开卡添加英文名字段(FirstName,MiddleName,LastName) |
| 4.4 版 | 2016/12/29 | 添加CorpPayType,site,orderNumber字段 |
| 4.5 版 | 2017/01/03 | 添加接口文档注意事项 |
| 4.6 版 | 2017/03/22 | 添加Language语言版本字段,修改site字段用车订单详情 |
| 4.7 版 | 2017/03/27 | 修改接口服务地址域名 |
| 4.8 版 | 2017/05/10 | 修改获取令牌接口和单点登录签名规则说明 |
| V5.0 版本 | 2017/11/06 | 增加用车 |
| V5.1 版本 | 2017/11/08 | 添加EmployeeID字段长度校验 |
| V5.2 版 | 2018/04/25 | 单点登录跳机票航班列表 |
| V5.7 | 2018/11/19 | 修改酒店HotelType为非必传 |
| V5.8 | 2019/04/30 | 新增OnError节点的错误编码信息 |
| V5.9 版本 | 2019/05/10 | 新增支付宝和微信跳转接入说明 |
| V6.1 | 2019/09/02 | 新增CorpBusOrder(汽车票订单列表)、CorpBusOrder(汽车票订单列表)及CorpBus(汽车票订单详情) |
| 6.3 版 | 2019/11/05 | 新增新成本中心、出行目的、项目号字段 |
| V6.5 版本 | 2020/12/21 | 新增带入查询参数跳转火车票列表页 |
| V6.6 版本 | 2020/12/24 | 新增带入查询参数跳转接送机/接送火车列表页 |
| V6.7 版本 | 2021/01/08 | 新增常见问题 |
| V6.8 版本 | 2023/3/24 | 修改火车产品日期格式为:yyyy-MM-dd |
| V6.9 版本 | 2023/5/6 | 添加管理页和在线报告initPage |




