帐户信息 API
使用您的网站,通过旅客的帐户信息验证旅客身份。
账户信息 API 包含每位旅客的详细信息。Expedia 代理将使用它来验证旅行者的唯一标识符,用于购买、积分兑换、取消等操作。此唯一标识符可以是信用卡号(支付卡行业 (PCI) 标识符)或 non-PCI 标识符,例如电子邮件地址或会员账号,具体取决于 您的要求或安全标准。
有关更多信息,请参阅通用数据和响应。
获取帐户信息
您将使用这组字段发送 POST /user/v1/account 请求获取会员或持卡人的帐户信息。
标题
| 字段 | 说明 | 示例值 | 字段类型 | 是否必填? |
|---|---|---|---|---|
partnerId | 由 Expedia 提供的企业唯一标识符 | 您的品牌 | 字符串,最多 20 个字符 | 是 |
Authorization | Expedia 从您的授权服 务器收到的访问令牌,由您的团队进行验证 | 标准 JSON web 令牌 (JWT) | 字符串,标准 JWT 长度 | — |
Authorization2 | 由 Expedia 发送的 JSON web 令牌 (JWT);签名和申请将在您的终端进行验证 | 标准 JWT | 字符串,标准 JWT 长度 | — |
请求
您需要将 membershipId、loyaltyAccountNumber、cardNumber 或 email设置为必填参数。您的客户经理将与您一起根据您的需求确定最佳方案。
注意: 如果您使用 cardNumber作为标识符,您还需要查看下面的 cardDetails和 billingAddress表格。其他参数不需要此数据。
| 字段 | 说明 | 字段类型 | 是否必填? |
|---|---|---|---|
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 | 旅行者的名字;嵌套在 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 | 旅行者的出生日期 | — |
信用卡加密和解密
如果您使 用 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 公钥。
- 生成长度为 256 位的随机对称密钥 (RSK)。
- 使用 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 验证标签)
在请求中解密卡号
Expedia 将对请求中的 cardNumber进行加密。解密路径与加密路径相反:
- 当您收到加密的 JWE 时,您应该解码 JWE 的第一部分,即 JOSE 标头,以确定算法、加密方式和
keyId(算法、加密方式、KID)。 - 然后,您需要验证
iat(issued-at:JWT 的签发时间),以确保它与当前时间相差不超过 5 分钟。(令牌将在 5 分钟后失效)。 - 接下来,获取私钥并解密 JWE 加密密钥。
- 然后,使用解密后的 RSK、JWE 初始化向量和 JWE 验证标签,就可以解密 JWE 密文参数并进行验证。