API de información de la cuenta
Verifica a los viajeros que utilizan tu sitio utilizando los datos de su cuenta
La API de Información de la Cuenta incluye detalles sobre cada viajero. Un agente de Expedia lo utilizará para verificar el identificador único del viajero para compras, canje de fidelidad, cancelaciones, etc. Este identificador único puede ser un número de tarjeta de crédito (un identificador de la Industria de Tarjetas de Pago (PCI)) o un identificador de non-PCI, como una dirección de correo electrónico o un número de cuenta de fidelización, según tus requisitos o normas de seguridad.
Consulta Datos y respuestas comunes para obtener información adicional.
Obtener información de la cuenta
Utilizarás este conjunto de campos para obtener información de la cuenta de un miembro del programa de fidelidad o del titular de una tarjeta utilizando POST /user/v1/account.
Encabezado
| Campo | Descripción | Valor de muestra | Tipo de campo | ¿Obligatorio? |
|---|---|---|---|---|
partnerId | Identificador único de tu empresa, proporcionado por Expedia | TU MARCA | Cadena, máx. 20 caracteres | Sí |
Authorization | Token de acceso recibido por Expedia desde tu servidor de autorización que debe validar tu equipo | Token web JSON estándar (JWT) | Cadena, longitud JWT estándar | — |
Authorization2 | Token web JSON (JWT) enviado por Expedia; tu empresa debe validar la firma y las reclamaciones | JWT estándar | Cadena, longitud JWT estándar | — |
Solicitud
Tendrás que establecer como parámetro obligatorio membershipId, loyaltyAccountNumber, cardNumber, o email. Tu gestor de cuentas trabajará contigo para definir cuál funcionará mejor en función de tus necesidades.
Nota: Si utilizas cardNumbercomo identificador, también tendrás que revisar las tablas cardDetailsy billingAddressque aparecen a continuación. Ningún otro parámetro requiere estos datos.
| Campo | Descripción | Tipo de campo | ¿Obligatorio? |
|---|---|---|---|
requestId | Identificador único de la solicitud de transacción | Cadena | Sí |
membershipId | Identificador único del viajero | Cadena | Sí, opción 1 |
loyaltyAccountNumber | El número de cuenta de fidelización del viajero (también llamado programAccountNumber); sólo debe rellenarse si se requiere un identificador distinto de membershipIdpara las operaciones de fidelización. | Cadena | Sí, opción 2 |
programId | Identificador del programa de fidelización al que está afiliado el viajero o el nombre del nivel asociado al programa de fidelización | Cadena | — |
cardNumber | Número de tarjeta de crédito del viajero (encriptado) | Cadena | Sí, opción 3 |
email | Dirección de correo electrónico del viajero | Cadena | Sí, opción 4 |
Respuesta
| Campo | Descripción | Tipo de campo | ¿Obligatorio? |
|---|---|---|---|
status | Estado de la transacción (valores: Aprobado, Rechazado) | Cadena | Sí |
requestId | Identificador único de la solicitud de transacción (de la carga de solicitud) | Cadena | Sí |
programAccount | Detalles de la cuenta del programa de fidelización; consulta la tabla programAccountpara ver los campos anidados | — | |
languageId | Los idiomas en los que se podrá ver el sitio; para más detalles, consulta la página Locale details | Cadena | — |
optInForMarketingEmail | Si el usuario ha optado por recibir correos electrónicos de marketing | Booleano | — |
channelType | Plataformas para las que está optimizado el sitio web (valores: WEB, MÓVIL, TABLET) | Cadena | — |
users | Lista de datos del usuario; consulta la tabla userspara ver los campos anidados | — | |
cardDetails | Detalles sobre la tarjeta de crédito utilizada en la transacción; consulta la tabla cardDetailspara ver los campos anidados (si se rellenan, algunos elementos anidados deben estar encriptados). | — |
programAccount
| Campo | Descripción | Valor de muestra | ¿Obligatorio? |
|---|---|---|---|
programId | Identificador del programa de fidelización al que está afiliado el viajero o el nombre del nivel asociado al programa de fidelización | Aventura Gold | Sí |
accountName | Nombre del programa (si no coincide con programId) | Aventura | — |
loyaltyAccountNumber | El número de cuenta de fidelización del viajero (también llamado programAccountNumber); sólo debe rellenarse si se requiere un identificador distinto de membershipIdpara las operaciones de fidelización. | 1234567 | — |
lastFourDigitsOfCreditCard | Los 4 últimos dígitos de la tarjeta de crédito que el viajero utilizó para la reserva | 0000 | — |
loyaltyConversionRatio | Ratio de cómo se convierten los puntos obtenidos en el pago (por ejemplo, 1 EUR = 1 punto) | — | |
loyaltyAccountBalance | Saldo actual de los puntos de fidelidad ganados por el viajero | 2003 | Sí |
cardDetails
| Campo | Descripción | Tipo de campo | ¿Obligatorio? |
|---|---|---|---|
cardNumber | Número de tarjeta de crédito del viajero (encriptado) | Cadena | Sí |
cardType | Tipo de tarjeta utilizada (encriptada) | Cadena | Sí |
expirationDate | Fecha de caducidad de la tarjeta en formato MM/AAAA (codificada) | Cadena | Sí |
billingAddress | Dirección de facturación de la tarjeta utilizada en la transacción; consulta la tabla billingAddresspara ver los campos anidados | — |
billingAddress
| Campo | Descripción | Tipo de campo | ¿Obligatorio? |
|---|---|---|---|
firstAddressLine | Primera línea de la dirección de facturación (codificada) | Cadena | Sí |
secondAddressLine | Segunda línea de la dirección de facturación | Cadena | — |
thirdAddressLine | Tercera línea de la dirección de facturación | Cadena | — |
city | Elemento de ciudad de la dirección de facturación | Cadena | — |
province | Elemento de provincia o estado de la dirección de facturación | Cadena | — |
countryCode | Elemento de país de la dirección de facturación | Cadena | — |
postalCode | Elemento de código postal de la dirección de facturación (encriptado) | Cadena | Sí |
usuarios
| Campo | Descripción | Valor de muestra | ¿Obligatorio? |
|---|---|---|---|
userId | Identificador único del viajero; igual que membershipId | Sí | |
name | Nombre, segundo nombre y apellidos del viajero | — | — |
firstName | Nombre del viajero; anidado bajo name | Bob | Sí |
middleName | Segundo nombre del viajero; anidado bajo name | Robert | — |
lastName | Apellido del viajero; anidado bajo name | Jones | Sí |
contactInfo | Información de contacto del viajero, incluyendo dirección, correo electrónico y número de teléfono | — | — |
address | Dirección del viajero, incluyendo calle, ciudad, estado o provincia y código postal; anidado bajo contactInfo | — | — |
streetAddress | Dirección del viajero; anidado bajo address | 123 Main St. | — |
city | Dirección postal de la ciudad del viajero; anidada bajo address | Boston | — |
state | Estado de la dirección del viajero; anidado bajo address | MA | — |
country | País de la dirección del viajero; anidado bajo address | EE. UU. | — |
postalCode | Código postal de la dirección del viajero; anidado bajo address | 02112 | — |
taxProvince | El estado o provincia en el que el viajero pagará impuestos; anidado bajo address | MA | — |
email | Dirección de correo electrónico del viajero; anidada bajo contactInfo | brjones@somewhere.com | — |
contactNumber | Número de teléfono del viajero; anidado bajo contactInfo | 555-555-5555 | — |
userType | Si el viajero es un usuario único (principal) o está asociado a una organización | — | |
dateOfBirth | Fecha de nacimiento del viajero | — |
Cifrado y descifrado de tarjetas de crédito
Si utilizas cardNumbercomo identificador del viajero para la validación, habrá que encriptar parte de la información. Expedia requiere un tratamiento seguro de la información PCI mediante una técnica industry-standard JWE (cifrado web JSON) para cifrar y descifrar los datos de las tarjetas de crédito: cifrado asimétrico mediante un par de claves pública y privada.
Casos prácticos de cifrado
El cifrado debe tener lugar en lo siguiente:
- Solicita:
cardNumber - Respuesta:
cardDetails
En el parámetro de solicitud, debes establecer un certificado de clave privada RSA (Rivest Shamir Adleman) firmado por una CA (autoridad de certificación) de 2048 bits y compartirlo con Expedia. A continuación, utilizaremos tu clave pública para cifrar el campo cardNumber utilizando JWE y RSA.
En el parámetro de respuesta, configuraremos una clave privada RSA de 2048 bits firmada por la CA y compartiremos el certificado de clave pública correspondiente con el usuario y contigo. Utilizando la clave pública de Expedia, cifrarás cada elemento de cardDetails utilizando JWE y RSA.
A continuación, te indicamos los pasos del proceso de cifrado.
Cifrado paso a paso
Paso 1: busca el certificado público y obtén la clave pública RSA 2048.
- Genera una clave simétrica aleatoria (RSK) de 256 bits de longitud.
- Cifra la RSK con la clave pública RSA 2048 utilizando el algoritmo RSA-OAEP-256.
Paso 2: genera un vector de inicialización aleatorio (IV) de 96 bits de longitud.
Paso 3: cifra los datos del texto plano utilizando la RSK, el IV y el algoritmo A256GCM a partir de los datos del texto cifrado y la etiqueta de autenticación.
Paso 4: codifica con Base64URL el texto cifrado para producir Base64URL (texto cifrado JWE).
Paso 5: codifica con Base64URL la etiqueta de autenticación, IV, RSK, y el JSON de encabezado JWE para producir lo siguiente:
- Datos de la etiqueta de autenticación: Base64URL (etiqueta de autenticación JWE).
- IV: Base64URL (vector de inicialización JWE)
- RSK: Base64URL (clave cifrada JWE)
- JSON del encabezado JWE: Base64URL (UTF8 (encabezado JWE))
A continuación, serializa el objeto JWE a su formato compacto consistente en partes codificadas con Base64URL delimitadas por puntos ('.') para producir lo siguiente:
Base64URL (UTF8) (encabezado JWE) || '.' || Base64URL (clave cifrada JWE) || '.' || Base64URL (vector de inicialización JWE) || '.' || Base64URL (texto cifrado JWE) || '.' || Base64URL (etiqueta de autenticación JWE)
Descifrado del número de la tarjeta en la solicitud
Expedia cifrará cardNumberen la solicitud. La ruta de descifrado es el proceso inverso de la ruta de cifrado:
- Cuando recibas el JWE cifrado, debes descodificar la primera sección del JWE, la cabecera JOSE para determinar el algoritmo, el cifrado y el
keyId(alg, enc, kid). - A continuación, validarás el
iat(issued-at: la hora en que se emitió el JWT) para asegurarte de que no difiere en más de 5 minutos de la hora actual. (El token caducará a los 5 minutos). - A continuación, busca tu clave privada y descifra la clave de cifrado JWE.
- Por último, utilizando la RSK descifrada, el vector de inicialización JWE y la etiqueta de autenticación JWE, puedes descifrar el parámetro de texto cifrado JWE y verificarlo.