帐户信息 API

帐户信息 API 包含每个客户的详细信息。您的模板网站会将使用此信息作为单点登录 (SSO) 协议的一部分,以验证用户的帐户。它将用于预订、会员积分兑换等操作。

Expedia 客服也可在申请获取用户帐户详细信息的请求中使用此 API 验证旅客的唯一标识符(如信用卡卡号)。收到的详细信息将用于对旅客进行电话验证,然后再让旅客进行搜索和预订。

如需了解更多信息,请参见通用数据和响应页面。

信用卡加密和解密

Expedia 使用行业标准的 JWE(JSON web 加密)技术对详细信用卡信息进行加密和解密:使用一对公钥和私钥进行非对称加密。

加密用例

应进行加密的地方包括:

  • 请求:cardNumber
  • 响应:cardDetails

在请求参数中,您应设置一个 CA(证书颁发机构)签名的 2048 位 RSA (Rivest Shamir Adleman) 私钥证书,然后与 Expedia 共享。然后,我们将使用您的公钥,使用 JWE 和 RSA 对 cardNumber 字段进行加密。

在响应参数中,我们将设置一个 CA 签名的 2048 位 RSA 私钥,然后与您共享相应的公钥证书。使用 Expedia 公钥,然后使用 JWE 和 RSA 对 cardDetails 的每个元素进行加密。

我们在下面列出了加密过程的步骤。

逐步加密

**第 1 步:**获取公开证书并获取 RSA 2048 公钥。

  1. 生成长度为 256 位的随机对称密钥 (RSK)。
  2. 使用 RSA 2048 公钥,使用 RSA-OAEP-256 算法加密 RSK。

**第 2 步:**生成长度为 96 位的随机初始化向量 (IV)。

**第 3 步:**使用 RSK、IV 和 A256GCM 算法加密明文数据,形成密文和验证标签数据。

**第 4 步:**对密文进行 Base64URL 编码,生成 Base64URL(JWE 密文)。

**第 5 步:**对验证标签、IV、RSK 和 JWE header JSON 进行 Base64URL 编码,生成:

  • 验证标签数据:Base64URL(JWE 验证标签)。
  • IV:Base64URL(JWE 初始化向量)
  • RSK:Base64URL(JWE 加密密钥)
  • JWE header JSON:Base64URL (UTF8 (JWE header))

然后,将 JWE 对象序列化为由 Base64URL 编码部分(以句点 ('.') 分隔)组成的紧凑格式,从而生成:

Base64URL (UTF8) (JWE header) || '.' || Base64URL(JWE 加密密钥) || '.' || Base64URL(JWE 初始化向量) || '.' || Base64URL(JWE 密文) || '.' || Base64URL(JWE 验证标签)

代码示例

加密 Java 示例

在第三方 JWE 库的帮助下,可以高效、快速地实现 JWE 加密。例如,这个用于加密的 Java 代码就是借助 Nimbus JOSE+JWT 库创建的。

public String encryptWithJWE(String plainText){
    X509Certificate publicCertificate = <fetch public cert>
    //get RSA public key
    final X509EncodedKeySpec publicKeySpec = new 
    X509EncodedKeySpec(publicCertificate.getPublicKey().getEncoded());
    final KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(publicKeySpec);
    //get keyID
    String keyID = certificateManager.getKid(publicCertificate);
    // Create JWE Header containing the needed metadata for encryption and decryption
    JWEHeader jweHeader = new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256GCM)
        .type(JOSEObjectType.JWT)
        .customParam(IAT, System.currentTimeMillis())
        .keyID(keyID)
        .build();
/*

JWE header 示例

{
"alg":"RSA-OAEP-256",
"typ":"JWT",
"enc":"A256GCM",
"iat":<Time (in UTC) when JWE was issued, expressed in UNIX epoch time (seconds since 1 January, 1970)>,
"kid":<Key ID or subject key Identifier from the public key certificate>
}
*/
    JWEObject jweObject = new JWEObject(jweHeader, new Payload(plainText));
    RSAEncrypter encrypter = new RSAEncrypter(rsaPublicKey);
    jweObject.encrypt(encrypter);
    return jweObject.serialize();
    }

在请求中解密卡号

Expedia 将在请求中加密 cardNumber。解密路径与加密路径相反:

  1. 收到加密的 JWE 时,应解码 JWE 的第一部分,即 JOSE 标头,以确定算法、加密方式和 keyId(alg、enc、kid)。
  2. 然后验证 iat(issued-at:JWT 的签发时间),确保它与当前时间相差不超过 5 分钟。(令牌将在 5 分钟后失效)。
  3. 接下来,获取私钥并解密 JWE 加密密钥。
  4. 然后,使用解密后的 RSK、JWE 初始化向量和 JWE 验证标签,就可以解密 JWE 密文参数并进行验证。

代码示例

加密 Java 示例

在第三方 JWE 库的帮助下,可以高效、快速地实现 JWE 加密。例如,这个用于加密的 Java 代码就是借助 Nimbus JOSE+JWT 库创建的。

public String decryptJWE(String jweString) {
    PrivateKey privateKey = <fetch private key>;
    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;
    JWEObject jweObject = JWEObject.parse(jweString);
    JWEHeader jweHeader = jweObject.getHeader();validateJweHeader(jweHeader);
    RSADecrypter rsaDecrypter = new RSADecrypter(rsaPrivateKey);
    jweObject.decrypt(rsaDecrypter);
    return jweObject.getPayload().toString();
}

获取帐户信息

您将使用这组字段发送 POST /user/v1/account 请求获取会员或持卡人的帐户信息。

标题

字段说明示例值字段类型是否必填?
partnerId由 Expedia 提供的企业唯一标识符您的品牌字符串,最多 20 个字符
AuthorizationExpedia 从您的授权服务器收到的访问令牌,由您的团队进行验证标准 JSON web 令牌 (JWT)字符串,标准 JWT 长度
Authorization2由 Expedia 发送的 JSON web 令牌 (JWT);签名和申请将在您的终端进行验证标准 JWT字符串,标准 JWT 长度

请求

字段说明字段类型是否必填?
requestId交易请求的唯一标识符字符串
membershipId唯一客户标识符字符串
loyaltyAccountNumber客户的会员帐号(也称为 programAccountNumber);只有会员操作需要提交除 membershipId 之外的标识符才要填写此字段字符串
programId客户所属会员计划的标识符或与会员计划相关的等级名称字符串
cardNumber客户信用卡卡号(已加密)字符串
email客户邮箱地址字符串

响应

字段说明字段类型是否必填?
status交易状态(值:已批准、已拒绝)字符串
requestId交易请求的唯一标识符(来自请求有效负载)字符串
ProgramAccount计划帐户详细信息;有关嵌套字段,请参见计划帐户表  
languageId网站可显示的语言字符串
channelType经过优化的网站平台(值:WEB、MOBILE、TABLET) 

ProgramAccount

字段说明示例值是否必填?
programId客户所属会员计划的标识符或与会员计划相关的等级名称Aventura 金卡
accountName计划名称(如果与 programId 不同)Aventura
loyaltyAccountNumber客户的会员帐号(也称为 programAccountNumber);只有会员操作需要提交除 membershipId 之外的标识符才要填写此字段1234567
lastFourDigitsOfCreditCard客户预订所用信用卡的最后 4 位数0000
loyaltyConversionRatio消费金额转换为累积积分的比率(例如 $1 = 1 积分) 
loyaltyAccountBalance客户累积会员积分的当前余额2003

用户信息

字段说明示例值是否必填?
userId客户的唯一标识符;与 membershipId 一致 
name客户名字、中间名和姓氏  
firstName客户名字;嵌套在 name 之下Bob
middleName客户的中间名;嵌套在 name 之下Robert
lastName客户的姓氏,嵌套在 name 之下Jones
contactInfo客户联系信息,包括地址、邮箱地址和电话号码 
address客户地址,包括街道地址、城市、州或省以及邮政编码;嵌套在 contactInfo 之下  
streetAddress客户街道地址;嵌套在 address 之下123 Main St.
city客户街道地址所在城市;嵌套在 address 之下Boston
state客户街道地址所在州,嵌套在 address 之下MA
country客户街道地址所在国家/地区,嵌套在 address 之下USA
postalCode客户街道地址所在邮政编码,嵌套在 address 之下02112
taxProvince客户将在哪个州或省纳税;嵌套在 address 之下MA
email客户的邮箱地址,嵌套在 contactInfo 之下brjones@somewhere.com
contactNumber客户的电话号码,嵌套在 contactInfo 之下555-555-5555
userType客户是单个(主要)用户还是与组织相关联 
dateOfBirth客户的出生日期 
cardDetails交易中使用的信用卡的详细信息;如果填写,则必须对某些嵌套项目进行加密 
cardNumber *交易中使用的信用卡卡号(已加密);嵌套在 cardDetails 之下 
cardType使用的银行卡类型(已加密);嵌套在 cardDetails 之下 
expirationDate *以 MM/YYYY 格式表示的银行卡有效期(已加密);嵌套在 cardDetails 之下 
billingAddress交易中使用的银行卡的账单地址;嵌套在 cardDetails 之下  
firstAddressLine *账单地址的第一行(已加密),嵌套在 billingAddress 之下 
secondAddressLine账单地址的第一行(已加密),嵌套在 billingAddress 之下 
thirdAddressLine账单地址的第三行(已加密),嵌套在 billingAddress 之下 
city账单地址所在城市,嵌套在 billingAddress 之下 
province账单地址所在省/州,嵌套在 billingAddress 之下 
countryCode账单地址所在国家/地区,嵌套在 billingAddress 之下 
postalCode *账单地址所在邮政编码,嵌套在 billingAddress 之下 

注:如果cardDetails 中的任意字段已填充,标有 * 的字段为必填字段。这些字段中的所有数据都已经过加密。

API 详情

无详细信用卡信息

含详细信用卡信息

您觉得这个页面有用吗?
我们该如何改进这些内容?
感谢您帮助我们改进!