Developer Hub
This is an auto-generated translation

帐户信息 API

使用您的网站,通过旅客的帐户信息验证旅客身份。

账户信息 API 包含每位旅客的详细信息。Expedia 代理将使用它来验证旅行者的唯一标识符,用于购买、积分兑换、取消等操作。此唯一标识符可以是信用卡号(支付卡行业 (PCI) 标识符)或 non-PCI 标识符,例如电子邮件地址或会员账号,具体取决于您的要求或安全标准。

有关更多信息,请参阅通用数据和响应

获取帐户信息

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

标题

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

请求

您需要将 membershipIdloyaltyAccountNumbercardNumberemail设置为必填参数。您的客户经理将与您一起根据您的需求确定最佳方案。

注意: 如果您使用 cardNumber作为标识符,您还需要查看下面的 cardDetailsbillingAddress表格。其他参数不需要此数据。

字段说明字段类型是否必填?
requestId交易请求的唯一标识符字符串
membershipId唯一旅行者标识符字符串是的,选项 1
loyaltyAccountNumber旅客忠诚度账户号码(也称为programAccountNumber);仅当忠诚度操作需要除membershipId之外的标识符时才应填写此项。字符串是的,选择方案二
programId旅行者所属会员计划的标识符或与该会员计划关联的等级名称字符串
cardNumber旅行者信用卡号(已加密)字符串是的,选项 3
email旅客邮箱地址字符串是的,选项 4

响应

字段说明字段类型是否必填?
status交易状态(值:已批准、已拒绝)字符串
requestId交易请求的唯一标识符(来自请求有效负载)字符串
programAccount会员计划账户详情;有关嵌套字段,请参见programAccount表格 
languageId本网站支持的语言;详情请参阅本地化详情页面字符串
optInForMarketingEmail用户是否选择接收营销邮件布尔值
channelType经过优化的网站平台(值:WEB、MOBILE、TABLET)字符串
users用户详细信息列表;有关嵌套字段,请参见users表格。 
cardDetails交易中使用的信用卡详情;有关嵌套字段,请参见cardDetails表格(如果已填写,则某些嵌套项必须加密)。 

programAccount

字段说明示例值是否必填?
programId旅行者所属会员计划的标识符或与该会员计划关联的等级名称Aventura 金卡
accountName计划名称(如果与 programId 不同)Aventura
loyaltyAccountNumber旅客忠诚度账户号码(也称为programAccountNumber);仅当忠诚度操作需要除membershipId之外的标识符时才应填写此项。1234567
lastFourDigitsOfCreditCard旅客预订时使用的信用卡后四位数字0000
loyaltyConversionRatio消费金额转换为累积积分的比率(例如 $1 = 1 积分) 
loyaltyAccountBalance旅行者当前已获得的忠诚度积分余额2003

cardDetails

字段说明字段类型是否必填?
cardNumber旅行者信用卡号(已加密)字符串
cardType使用的卡类型(加密)字符串
expirationDate卡片到期日期(MM/YYYY 格式,已加密)字符串
billingAddress交易所用卡的账单地址;有关嵌套字段,请参见billingAddress表。 

billingAddress

字段说明字段类型是否必填?
firstAddressLine账单地址第一行(已加密)字符串
secondAddressLine账单地址第二行字符串
thirdAddressLine账单地址的第三行字符串
city账单地址中的城市元素字符串
province账单地址中的省或州要素字符串
countryCode账单地址中的国家/地区要素字符串
postalCode账单地址中的邮政编码部分(已加密)字符串

用户

字段说明示例值是否必填?
userId旅行者的唯一标识符;与 membershipId 
name旅行者的姓名(包括姓、名和中间名)
firstName旅行者的名字;嵌套在 nameBob
middleName旅行者的中间名;嵌套于 nameRobert
lastName旅行者的姓氏;嵌套于 nameJones
contactInfo旅行者联系信息,包括地址、电子邮件和电话号码
address旅行者地址,包括街道地址、城市、州/省和邮政编码;嵌套于 contactInfo
streetAddress旅行者街道地址;嵌套于 address123 Main St.
city旅行者所在城市的街道地址;嵌套于 addressBoston
state旅行者街道地址所在州;嵌套于 addressMA
country旅行者街道地址所在国家/地区;嵌套于 addressUSA
postalCode旅行者街道地址的邮政编码;嵌套于 address02112
taxProvince旅行者将要缴纳税款的州或省;嵌套于 addressMA
email旅行者的电子邮件地址;嵌套在 contactInfobrjones@somewhere.com
contactNumber旅行者的电话号码;嵌套在 contactInfo555-555-5555
userType无论旅行者是个人(主要)用户还是与某个组织相关联 
dateOfBirth旅行者的出生日期 

信用卡加密和解密

如果您使用 cardNumber作为旅客标识符进行验证,则某些信息需要加密。Expedia 要求使用 industry-standard JWE(JSON 网络加密)技术安全地处理 PCI 信息,以加密和解密信用卡详细信息:使用公钥和私钥对的非对称加密。

加密用例

应进行加密的地方包括:

  • 要求: 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(算法、加密方式、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();
}

API 详情

无详细信用卡信息

含详细信用卡信息

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