携程接口对接

在我们的项目中有时需要跟携程做对接,携程接口有以下几大类:

单点登录

        单点登录又包括PC单点登录,H5单点登录,SAML单点登录等接口

人事数据对接

        人事数据接口包括组织架构,人事批量对接,人员角色配置,判断员工是否开卡等接口

审批对接

        审批接口包括提前审批,订单授权,基础数据等接口

数据对接

        数据对接包括订单取数,补单查询,订单取数订单号查询,结算明细,航班动态查询,行程详情查询,出差申请查询,费用报销查询等接口

数据推送接口

        数据推送包括时间推送,订单状态推送,票号状态推送,航变推送,结算交易流水推送、

 

接下来就以人事批量接口为例,讲一下携程接口如何调用

人事批量对接

概述:

人事批量对接接口用于实现单个公司批量的人事对接功能,该接口采用webservice的方式来实现,由携程提供标准的web service 接口

注意事项:

1.该接口采用域名方式调用,切勿采用IP方式调用

2.接口调用顺序,先调用获取ticket接口,再调用人事信息批量更新接口

3.人事信息批量接口为异步更新,模式,并非实时更新

4.批量人事接口接收的人事信息条数不能大于500条,单次人事信息条数不能大于100条

接口方法说明

1.获取Ticket

生产环境服务地址: https://ct.ctrip.com/SwitchAPI/Order/Ticket
测试环境服务地址: https://cta.fat.ctripqa.com/SwitchAPI/Order/Ticket
调用方式: https + post
方法名: Ticket
描述: 进行商旅身份认证获取Ticket(有效时间为2个小时。如2个小时内有使用该ticket, 那么有效时间将往后延迟2小时。如2小时之内未使用该ticket,则需要重新获取ticket.)
参数: appKey ,appSecurity
参数类型: String

请求契约

字段 类型 描述 默认值 可为空 备注
appKey String 接入账号 N 由携程分配给客户公司
appSecurity String 接入密码 N 由携程分配给客户公司

返回契约

TicketResponse
字段 类型 描述 默认值 可为空 备注
Ticket String 生成的Ticket N 用于后续接口访问
Status ResponseStatus 返回状态 N 见下表描述
ResponseStatus
字段 类型 描述 默认值 可为空 备注
Success Boolean 是否调用成功 N true:调用成功false:调用失败
Message String 推送错误消息 Y  
ErrorCode Int 错误编号 N 正确为0,其他编号为错误

2.人事信息批量更新

生产环境服务地址:

SOAP地址:https://ct.ctrip.com/corpservice/CorpCustService.asmx

Restful地址:https://ct.ctrip.com/corpservice/CorpCustService/SaveCorpCustInfoList

测试环境服务地址:

SOAP地址:https://cta.fat.ctripqa.com/corpservice/CorpCustService.asmx

Restful地址:https://cta.fat.ctripqa.com/corpservice/CorpCustService/SaveCorpCustInfoList

调用方式: SOAP或者https + post
方法名: SaveCorpCustInfoList
描述: 将批量处理的人事信息赋值到实体AuthenticationListRequstà返回AuthenticationInfoListResponse对象
参数: 实体AuthenticationListRequst实例化对象
参数类型: 对象类型

请求契约

AuthenticationListRequest
字段 默认值 类型 可为空 描述
Language zh-CN(简体中文) 枚举值 Y 错误信息语言版本zh-CN 简体中文en-US 英文
Appkey Varchar(20) N 公司登陆ID(obk账户名),由携程方提供
Ticket Varchar(20) N 身份验证Token口令
CorporationID varchar(20) N 公司ID,由携程方提供
AuthenticationInfoList List<AuthencationInfo> N 验证实体,见下方表格
AuthenticationInfo
字段 默认值 类型 可为空 描述
Sequence 0 int Y 人事对接数据序号,用于与response返回结果中的Sequence编号匹配,不传则response返回0.(建议用户输入不重复的值,方便返回出错时定位问题。)
Authentication AuthencationEntity N 人事更新实体
AuthencationEntity 
字段分类 字段 默认值 类型 可为空 描述
个人属性 Uid char(20)     Y

员工的携程卡号 

携程卡号和员工编号必须要有一个,并保持唯一

EmployeeID varchar(100) Y

员工编号

携程卡号和员工编号必须要有一个

针对自动开卡逻辑说明如下:该公司如果是定制卡号段且按员工顺序开卡:

1、传递的EmployeeID长度请提前咨询对应的项目经理;

2、传递的EmployeeID必须为数字;(长度不够的在前面补0);

Name varchar(80) Y 中国大陆籍用户姓名  例:张三 (外籍和港澳台无需传递),可参照Q&A机票购买姓名须知
NameENFirstName varchar(30) Y 护照英文名_F(外籍和港澳台同胞需要传递,NameENFirstName不传递,单独传递NameENMiddleName时,会返回错误代码1050),英文名需由字母组成。可参照Q&A机票购买姓名须知
NameENLastName varchar(30) Y 护照英文名_L(外籍和港澳台同胞需要传递),英文名需由字母组成。可参照Q&A机票购买姓名须知
Nationality char(2) Y 国籍
Gender char(1) Y 性别(M:男,F:女)
Birthday varchar(20) Y 用户生日,格式:yyyy-MM-dd
NickName varchar(20) Y 昵称
MobilePhone varchar(20) Y

手机号码。当CountryCode为86或空时,视为中国境内手机号码,支持11位数字。

注:手机号码异常,仅手机号该字段不落地保存,其余字段如正常则该条人事数据正常落地

CountryCode int Y 国家码。(已开通短信国家见附录三,对应国家区号)
Email varchar(60) Y 联系邮箱(不支持大小写敏感的邮箱,发送开通信时默认使用小写字母邮箱进行发送)
Address varchar(200) Y 地址
PostCode varchar(20) Y 邮编
ContactTel varchar(50) Y 联系电话
ContactFax varchar(50) Y 联系传真
IdCardNo varchar(20) Y

身份证号

Personal ID No.

PassPortNo varchar(20) Y

护照号

Passport No.

TwoWayPermitNo varchar(20) Y 港澳通行证
MTPNo varchar(20) Y 台胞证
HomeReturnNo varchar(20) Y 回乡证
TaiwanPassNo         varchar(20) Y 台湾通行证
StudentNo varchar(20) Y 学生证
MilitaryNo varchar(20) Y 军人证
SeamanNo varchar(20) Y 国际海员证
ForeignersResidenceNo varchar(20) Y 外国人永久居留证
TravelNo varchar(20) Y 旅行证
CertificateNo varchar(200) Y 其它证件号 
UserCardInfos List<UserCardInfoEntity> Y 卡号证件信息可选数据(如果可选数据有值,后台采用全量覆盖的方式更新)
UserFFPInfos List<UserFFPInfoEntity> Y 常旅客卡信息可选数据(如果可选数据有值,后台采用全量覆盖的方式更新)
工作属性 Valid char(1) Y 在职情况 (A-在职,I-离职)
Rank varchar(50) Y 职级
RankName varchar(200) Y 职级名称(中文)注:职级的中文名跟英文名,只能传递其中一个。如果需要使用该字段,需提前联系实施经理在携程后台进行配置)
RankNameEn varchar(200) Y 职级名称(英文)注:职级的中文名跟英文名,只能传递其中一个。(该字段暂时没有开放)
WorkCity varchar(20) Y 工作所在城市 
Dept1 varchar(100) Y 部门1,如需清空该字段,传字符串"null"
Dept2 varchar(100) Y 部门2,如需清空该字段,传字符串"null"  
Dept3 varchar(100) Y 部门3,如需清空该字段,传字符串"null"
Dept4 varchar(100) Y 部门4,如需清空该字段,传字符串"null"
Dept5   varchar(100) Y 部门5,如需清空该字段,传字符串"null"
Dept6   varchar(100) Y 部门6,如需清空该字段,传字符串"null"
Dept7  varchar(100) Y 部门7,如需清空该字段,传字符串"null"
Dept8   varchar(100) Y 部门8,如需清空该字段,传字符串"null"
Dept9   varchar(100) Y 部门9,如需清空该字段,传字符串"null"
Dept10   varchar(100) Y 部门10,如需清空该字段,传字符串"null"
CostCenter varchar(100) Y 成本中心编号
CostCenter2       varchar(100)       Y 成本中心编号2 
CostCenter3       varchar(100)       Y 成本中心编号3 
CostCenter1EN varchar(100) Y 对应成本中心编号1英文
CostCenter2EN varchar(100) Y 对应成本中心编号2英文
CostCenter3EN varchar(100) Y 对应成本中心编号3英文
IsCostCenter1Optional bool Y 成本中心1是否下拉,true=是,false=否;true则读取成本中心可选数据;false则读取成本中心编号1的中英文内容。
IsCostCenter2Optional bool Y 成本中心2是否下拉,true=是,false=否;true则读取成本中心可选数据;False则读取成本中心编号2的中英文内容。
IsCostCenter3Optional bool Y 成本中心3是否下拉,true=是,false=否;true则读取成本中心可选数据;false则读取成本中心编号3的中英文内容。
CostCenterList List<CostCenterEntity> Y 成本中心可选数据(如果可选数据有值,只会覆盖同一成本中心类型数据,即同一成本中心类型先删除后新增的方式进行更新)
配置属性 SubAccountName varchar(100) Y 子账户的名称,由携程提供的对应的账户信息。新用户必须提供
CorpCardType char(1) Y

代订类型:C(个人卡),B(代订卡):代订范围默认整个公司,D(虚卡):不发送开通信,为虚卡时邮箱可为空;

备注:

1、个人卡和代订卡的对应的卡种类型为实卡

2、默认待定类型为个人卡,卡种类型为实卡

ResRange char(1) Y 代订范围:当前用户可代订范围  C:公司、F:主账户及其他、S:子账户及其他、O:其他(根据代订关系配置);(当代订类型为B(代订卡)时,代订范围不能为空)
IsAuthorizedOptional bool Y 授权人是否可选,true=是,false=否;true 则读取授权人可选设置数据;false则读取默认授权人信息
ConfirmPersonList List<ConfirmPersonEntity> Y 授权人可选数据(如果可选数据有值,根据(产品类型+授权次别)组合的方式进行覆盖,即根据(产品类型+授权次别)先删除后新增的方式进行更新)
AuthPWD varchar(20) Y 授权密码(密码授权客户) 
FltSend_Mod char(1) Y

机票配送方式,

A- 定期配送,

B-携程保管,

C-其它方式,无

D-使用公司配送设置,

E-使用主帐户设置

IsBookClass char(1) Y 国内机票两舱是否可预订:T:是,F:否
IntlBookClassBlock varchar(200) Y

国际屏蔽舱位控制:

C(公务),

F(头等),

Y(经济),

SY(超经)。

可传多个值,每个用英文";"隔开(如:C;F;SY)

如需清空该字段,传字符串"null"

IsSendEMail false bool Y 是否发送开通邮件,true=是,false=否;空,默认为false。如有开通自动开卡功能的客户,这个字段传"true",否则将无法收到开卡成功邮件,导致用户无法得知卡号和密码信息。为虚卡时不发送邮件,该值设置无效。
AuthEmailLanguage CN Varchar(2) Y 授权邮件短信语言版本CN:中文,EN:英文
ConcurAccount varchar(50) Y Concur账户
CorpEmailSendRules List<CorpEmailSendRuleEntity> Y 机票酒店Email发送配置
CorpTicketReservations List<CorpTicketReservationEntity> Y 代订关系配置
UseTRFlag int Y

设置不可帮非员工预订产品类型,多个则将其对应数字相加1(国内机票),2(国际机票),4(酒店),8(用车),16(火车票)例如:17,不可帮非员工预订国内机票和火车票

如需清空该字段,传值-1

FltClassStandard char(1)   Y 国内机票RC记录舱位标准 C(商务),F(头等),Y(经济)
FltRateStandard decimal(8,4) Y 国内机票RC记录折扣标准 取值(0~1,只允许最大4位小数)
SuperiorEID String Y 上级领导EID
CustID String Y 客户提供的组织部门ID
IsServedCard char(1) Y 是否是招待卡:T:是,F:否
CanBookTrainSeat Varchar(100) Y Online火车票可选席别,见附录二。传值按英文分号分割,如1;3;4;13;15;16 

 

IsTrainOtherSeatCanBook   char(1)   火车票可选席别外是否可订 T:是,F:否
ReservationFlightHD int Y 国内机票可预订最高折扣
FlightHighRateAirline varchar(100) Y 国内机票最高折扣指定航司
CostCenterEntity
字段 默认值 类型 可为空 描述
CostCenterType varchar(20) N 成本中心类型,只可传输C1(成本中心1)、C2(成本中心2)、C3(成本中心3)三个类型字段
CostCenterContent nvarchar(50) N 成本中心中文内容,对应每个成本中心1、2、3的中文内容(最大长度50)
CostCenterContentEN varchar(100) Y 成本中心英文内容,对应每个成本中心1、2、3的英文内容
IsDefault bool Y 是否默认成本中心,每个成本中心类型可以传输多个成本中心内容,可设置其中一条成本中心内容为默认值。字段赋值:true或false或不传(默认false)
ConfirmPersonEntity
字段 默认值 类型 可为空 描述
ProductType varchar(20) N 产品类型,仅可传输N(国内机票)、I(国际机票)、H(酒店)、T(火车票)、C(用车)
AuthorizedTime Int N 授权次别,1(代表一次授权)、2(代表二次授权)
ConfirmPerson varchar(100) N 授权人(必须在携程账户内有邮箱)员工编号或邮箱,仅可传输员工编号或Email,二者选其一。
ConfirmPersoncc varchar(100) Y 抄送授权人(必须在携程账户内有邮箱)员工编号或邮箱,仅可传输员工编号或Email,二者选其一。
IsDefault bool Y

是否默认,同类型产品同次别授权,可设置其中一条授权人UID为默认授权人。字段赋值:true或false或不传(默认false)

 

UserCardInfoEntity
字段 默认值 类型 可为空 描述
CardNo varchar(50) N 证件号码
CardType Int(4) N

证件类型(不允许重复)

1:身份证

2:护照

3:学生证

4:军人证

7:回乡证

8:台胞证

10:港澳通行证

20:外国人永久居留证

21:旅行证

22:台湾通行证

99:其他

IDCardTimelimit varchar(30) Y 证件有效期
PassportType char(1) Y

护照类型(当CardType=2时必填)

P:因私

I:因公

D:外交

UserFFPInfoEntity
字段 默认值 类型 可为空 描述
Airline Char(2) N 航线
FFPNo varchar(40) N 常旅客卡卡号
CorpEmailSendRuleEntity
字段 默认值 类型 可为空 描述
EmailSendNode Char(1) N

邮件发送节点:机票发送节点:暂缓确认:D;成交确认:S;退票确认:R;改签确认:G(仅国内机票);Itinerary和Invoice确认单:I酒店发送节点:确认客户:C;授权确认:A;已成交:S;Itinerary和Invoice确认单:I;

注意:

(1)机票发送节点:D,S,R,G,这四个节点,国内跟国际必须同时有值(BusinessType=1和2捆绑传输)。

(2)当同一业务类型(BusinessType),同一发送节点发送多条信息时,将以最后一条信息为准。

ReceiverEMail varchar (255) Y

接收人邮件地址(可接受多个邮箱地址,用英文分号隔开)

(不支持大小写敏感的邮箱,携程发送邮件默认使用小写字母邮箱进行发送)

EmailSendRuleLanguage CN Char(2) N 语言(CN/EN)
IsSendCardHolder F Char(1) N 是否发送持卡人(T/F)
IsSendContactor F Char(1) N 是否发送订单联系人(T/F)
BusinessType Int N 业务类型,1-国内机票、2-国际机票、4-酒店
EmailSendRuleValid T Char(1) N

邮件规则是否有效(T/F);

注意:(1)机票发送节点:D,S,R,G,这四个节点,国内跟国际IsSendCardHolder,IsSendContactor,EmailSendRuleValid 这三个配置项的值,必须一致。

CorpTicketReservationEntity
字段 默认值 类型 可为空 描述
ResUid varchar (20) Y 被代订人Uid (被代订人Uid,Eid 不能同时为空)
ResEid varchar (20) Y 被代订人Eid(被代订人Uid,Eid 不能同时为空)
ResValid T Char(1) N 代订关系是否有效(T/F)

注意事项:不可空元素请务必提供,其他选项根据实际需要进行提供;请不要填入并传递未使用元素;如果同时传入UiD和EmployeeID,系统以UiD作为准;EmployeeID不能更新,如需要更新,请重新开卡。

 

3.2.2返回契约

AuthenticationResponseList
字段 默认值 类型 描述
Result String 接口调用结果Success: 更新成功;Failed:更新失败;Contains errors:部分数据未更新成功;
ErrorMessageList List< ErrorMessage> 每条数据更新结果
ErrorMessage
字段 默认值 类型 描述
Sequence int 编号人事对接数据编号,用于与request中的Sequence序号匹配,Sequence默认值为0
ErrorCode string 错误代码(参考文档说明)
Message string 错误信息(参考文档说明)

代码示例

1.获取Ticket

public static Tuple<Boolean, String> GetTicket(String appKey, String appSecurity)
        {
            if (String.IsNullOrEmpty(appKey) || String.IsNullOrEmpty(appSecurity))
            {
                return new Tuple<bool, string>(false, "AppKey和AppSecurity不可为空");
            }

            String ticket = String.Empty;
            string url = "https://www.corporatetravel.ctrip.com/switchapi/platform.svc/rest/ticket";
            string postString = "{\"appKey\":\"" + appKey + "\",\"appSecurity\":\"" + appSecurity + "\"}";
            string result = PostData(url, postString);
            if (String.IsNullOrEmpty(result))
            {
                return new Tuple<bool, string>(false, "获取携程Ticket失败,请稍后重试!");
            }

            var responseEntity = Newtonsoft.Json.JsonConvert.DeserializeObject<Response4ApprovalTicket>(result);
            if (responseEntity.TicketResult.Status.Success)
            {
                ticket = responseEntity.TicketResult.Ticket;
                return new Tuple<bool, string>(true, ticket);
            }
            else
            {
                return new Tuple<bool, string>(false, responseEntity.TicketResult.Status.Message);
            }
        }

2.接口调用

public static Tuple<Boolean, String> SaveCorpCustList(String legalUnitID, List<CommonEmployeeModel> employeeList)
        {
            var companyCtripModel = GetCompanyCtrip(legalUnitID);
            if (companyCtripModel == null)
                return new Tuple<bool, string>(false, "未找到该机构在携程开通账号信息");

            var ticket = GetTicket(companyCtripModel.AppKey, companyCtripModel.AppSecurity);
            if (!ticket.Item1)
                return new Tuple<bool, string>(false, ticket.Item2);

            AuthenticationListRequst request = new AuthenticationListRequst();
            request.Appkey = companyCtripModel.AppKey;//公司登陆ID(obk 账 户名),由携程方提供
            request.Ticket = ticket.Item2.ToString();//身份验证Token口令
            request.CorporationID = companyCtripModel.CtripCorpID;//公司ID,由携程方提供

            request = CreateAuthInfoArray(employeeList, companyCtripModel.CtripCorpID, request);

            try
            {
                CorpCustServiceSoapClient client = new CorpCustServiceSoapClient();
                AuthenticationInfoListResponse response = client.SaveCorpCustInfoList(request);

                String msg = String.Empty;
                if (response.Result == CtripUtil.成功)
                {
                    String employeeIDStr = String.Join("\r\n", employeeList.Select(item => String.Format("【{0}】工号【{1}】", item.EmployeeName, item.EmployeeID)));
                    msg = "更新成功,此次更新了" + employeeIDStr;
                    EClaim.Common.Log.LogMsg("【人事批量对接携程】", msg);
                    return new Tuple<bool, string>(true, msg);
                }
                else
                {
                    StringBuilder errorStr = new StringBuilder();
                    foreach (var item in response.ErrorMessageList)
                    {
                        CommonEmployeeModel employee = employeeList[item.Sequence];
                        errorStr.Append("员工:【" + employee.EmployeeName + "】|");
                        errorStr.Append("工号:【" + employee.EmployeeID + "】|");
                        errorStr.Append("ErrorCode:【" + item.ErrorCode + "】|");
                        errorStr.Append("Message:【" + item.Message + "】");
                        errorStr.Append("\r\n");
                    }
                    if (response.Result == CtripUtil.失败)
                    {
                        msg = "更新失败,失败原因" + errorStr.ToString();
                        EClaim.Common.Log.LogMsg("【人事批量对接携程】", msg);
                        return new Tuple<bool, string>(false, msg);
                    }
                    else if (response.Result == CtripUtil.部分错误)
                    {
                        String employeeIDStr = String.Join("\r\n", employeeList.Select(item => String.Format("【{0}】工号【{1}】", item.EmployeeName, item.EmployeeID)));
                        msg = "部分数据更新失败,此次更新了" + employeeIDStr + "其中\r\n" + errorStr.ToString();
                        EClaim.Common.Log.LogMsg("【人事批量对接携程】", msg);
                        return new Tuple<bool, string>(false, msg);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return new Tuple<bool, string>(false, "调用人事批量对接服务失败");
        }

        private static AuthenticationListRequst CreateAuthInfoArray(List<CommonEmployeeModel> employeeList, String corporationID, AuthenticationListRequst request)
        {
            List<CndModel> pars = new List<CndModel>();
            pars.Add(new CndModel("Company_GUID", employeeList.First().CompanyGUID));
            pars.Add(new CndModel(" R_RECORD_STATUS=1"));
            pars.Add(new CndModel("TYPE_CD", "CtripCardType"));
            COMMONSTATICService commonStaticService = new COMMONSTATICService();
            var csBtoList = commonStaticService.GetList(pars);
            List<COMMONSTATICModel> ctripCardTypeList = new List<COMMONSTATICModel>();
            if (csBtoList != null && csBtoList.Any())
                ctripCardTypeList = Convertor.ConvertList<BaseDto, COMMONSTATICModel>(csBtoList);
           
            COMMONEMPLOYEELINKService employeeLinkService = new COMMONEMPLOYEELINKService();
            var employeeLinkList = employeeLinkService.GetEmployeeLinkList(employeeList.First().CompanyGUID, employeeList, (int)LinkTypeEnum.携程);

            //获取所有部门列表
            CommonOrgService orgService = new CommonOrgService();
            pars.Clear();
            pars.Add(new CndModel("CompanyGUID", employeeList.First().CompanyGUID));
            pars.Add(new CndModel("R_RECORD_STATUS", 1));
            var orgBtoList = orgService.GetList(pars);
            List<CommonOrgModel> orgList = new List<CommonOrgModel>();
            if (orgBtoList != null && orgBtoList.Any())
                orgList = Convertor.ConvertList<BaseDto, CommonOrgModel>(orgBtoList);

            int employeeCount = employeeList.Count, i = 0;
            request.AuthenticationInfoList = new AuthenticationInfo[employeeCount];

            for (; i < employeeCount; i++)
            {
                var employee = employeeList[i];

                var linkModel = employeeLinkList.SingleOrDefault(item => item.EmployeeID == employee.EmployeeID);

                AuthenticationInfo info = new AuthenticationInfo();
                info.Authentication = new AuthencationEntity();
                info.Sequence = i;
               
                //成本中心
                var orgModel = orgList.FirstOrDefault(item => item.OrgGUID == employee.OrgID);
                if (orgModel != null && !String.IsNullOrEmpty(orgModel.SubCompany))
                    info.Authentication.CostCenter = orgModel.SubCompany ?? String.Empty;
                else if (orgModel != null && !String.IsNullOrEmpty(orgModel.OrgName))
                    info.Authentication.CostCenter = orgModel.OrgName ?? String.Empty;
                else
                    info.Authentication.CostCenter = employee.OrgName ?? String.Empty;

                info.Authentication.IdCardNo = employee.IDCard ?? String.Empty;
                info.Authentication.PassPortNo = employee.PassportCard ?? String.Empty;
             
                info.Authentication.Email = employee.Email ?? String.Empty;
             
                info.Authentication.MobilePhone = employee.CellPhone ?? String.Empty;
                info.Authentication.ContactTel = employee.OfficePhone ?? String.Empty;
                info.Authentication.ContactFax = employee.Fax ?? String.Empty;
               
                info.Authentication.RankName = employee.PostLevel ?? String.Empty;
                info.Authentication.Valid = employee.R_RECORD_STATUS == 1 ? "A" : "I";
                info.Authentication.IsBookClass = (employee.IsBookClass == 1 ? "T" : "F");//国内机票两舱是否可预订:T:是,F:否
              
                if (ctripCardTypeList != null && ctripCardTypeList.Any())
                {
                    COMMONSTATICModel ctripCardType = new COMMONSTATICModel();
                    if (linkModel != null)
                        ctripCardType = ctripCardTypeList.FirstOrDefault(item => item.STATIC_CD == linkModel.LinkAccountType.ToString());
                    else
                        ctripCardType = ctripCardTypeList.FirstOrDefault(item => item.STATIC_CD == employee.CtripCardType.ToString());

                    if (ctripCardType == null || String.IsNullOrEmpty(ctripCardType.STATIC_ID))
                    {
                        ctripCardType = ctripCardTypeList.First();
                    }
                    info.Authentication.SubAccountName = ctripCardType.STATIC_VALUE;
                }

                request.AuthenticationInfoList[i] = info;
            }

            return request;
        }

猜你喜欢

转载自blog.csdn.net/weixin_41392824/article/details/81747625