Developer Hub
Esta traducción se ha generado automáticamente

API de información de la cuenta

Verifica a los viajeros que usan tu página web con los datos de su cuenta

La API de información de cuentas incluye datos sobre cada viajero. Un agente de Expedia lo utilizará para verificar el identificador único del viajero en caso de compras, canje de puntos de fidelidad, cancelaciones y otras operaciones. Este identificador único puede ser un número de tarjeta de crédito (un identificador de la Industria de Tarjetas de Pago, o PCI) o un identificador de « non-PCI », como una dirección de correo electrónico o un número de cuenta de fidelización, dependiendo de tus necesidades o normas de seguridad.

Echa un vistazo a y a «Datos comunes y respuestas» para obtener más información.

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

CampoDescripciónValor de muestraTipo de campo¿Obligatorio?
partnerIdIdentificador único de tu empresa, proporcionado por ExpediaTU MARCACadena, máx. 20 caracteres
AuthorizationToken de acceso recibido por Expedia desde tu servidor de autorización que debe validar tu equipoToken web JSON estándar (JWT)Cadena, longitud JWT estándar
Authorization2Token web JSON (JWT) enviado por Expedia; tu empresa debe validar la firma y las reclamacionesJWT estándarCadena, longitud JWT estándar

Solicitud

Tendrás que establecer como parámetro obligatorio uno de estos: membershipId, loyaltyAccountNumber, cardNumbero email. Tu gestor de cuenta colaborará contigo para determinar cuál es la mejor opción según 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 necesita estos datos.

CampoDescripciónTipo de campo¿Obligatorio?
requestIdIdentificador único de la solicitud de transacciónCadena
membershipIdIdentificador único del viajeroCadenaSí, la opción 1
loyaltyAccountNumberEl número de cuenta de fidelidad del viajero (también conocido como « programAccountNumber »); solo debes rellenar este campo si se necesita un identificador distinto de « membershipId » para las operaciones de fidelidadCadenaSí, la opción 2
programIdIdentificador del programa de fidelización al que está afiliado el viajero o el nombre del nivel asociado al programa de fidelizaciónCadena
cardNumberNúmero de la tarjeta de crédito del viajero (cifrado)CadenaSí, la opción 3
emailDirección de correo electrónico del viajeroCadenaSí, la opción 4

Respuesta

CampoDescripciónTipo de campo¿Obligatorio?
statusEstado de la transacción (valores: Aprobado, Rechazado)Cadena
requestIdIdentificador único de la solicitud de transacción (de la carga de solicitud)Cadena
programAccountDatos de la cuenta del programa de fidelización; consulta la tabla « programAccount » para ver los campos anidados 
languageIdLos idiomas en los que se podrá ver la web; echa un vistazo a la página de detalles de la configuración regional para más informaciónCadena
optInForMarketingEmailSi el usuario ha dado su consentimiento para recibir correos electrónicos de marketingBooleano
channelTypePlataformas para las que está optimizado el sitio web (valores: WEB, MÓVIL, TABLET)Cadena
usersLista de datos de usuario; consulta la tabla « users » para ver los campos anidados 
cardDetailsDatos sobre la tarjeta de crédito utilizada en la transacción; consulta la tabla de cardDetailspara ver los campos anidados (si están rellenados, algunos elementos anidados deben cifrarse) 

programAccount

CampoDescripciónValor de muestra¿Obligatorio?
programIdIdentificador del programa de fidelización al que está afiliado el viajero o el nombre del nivel asociado al programa de fidelizaciónAventura Gold
accountNameNombre del programa (si no coincide con programId)Aventura
loyaltyAccountNumberEl número de cuenta de fidelidad del viajero (también conocido como « programAccountNumber »); solo debes rellenar este campo si se necesita un identificador distinto de « membershipId » para las operaciones de fidelidad1234567
lastFourDigitsOfCreditCardLos últimos 4 dígitos de la tarjeta de crédito que usó el viajero para hacer la reserva0000
loyaltyConversionRatioRatio de cómo se convierten los puntos obtenidos en el pago (por ejemplo, 1 EUR = 1 punto) 
loyaltyAccountBalanceSaldo actual de los puntos de fidelidad que has ganado como viajero2003

cardDetails

CampoDescripciónTipo de campo¿Obligatorio?
cardNumberNúmero de la tarjeta de crédito del viajero (cifrado)Cadena
cardTypeTipo de tarjeta utilizada (cifrada)Cadena
expirationDateFecha de caducidad de la tarjeta en formato MM/AAAA (cifrada)Cadena
billingAddressDirección de facturación de la tarjeta utilizada en la transacción; consulta la tabla « billingAddress » para ver los campos anidados 

billingAddress

CampoDescripciónTipo de campo¿Obligatorio?
firstAddressLinePrimera línea de la dirección de facturación (cifrada)Cadena
secondAddressLineSegunda línea de la dirección de facturaciónCadena
thirdAddressLineTercera línea de la dirección de facturaciónCadena
cityCiudad de la dirección de facturaciónCadena
provinceElemento «provincia o estado» de la dirección de facturaciónCadena
countryCodePaís de la dirección de facturaciónCadena
postalCodeCódigo postal de la dirección de facturación (cifrado)Cadena

usuarios

CampoDescripciónValor de muestra¿Obligatorio?
userIdIdentificador único del viajero; es el mismo que membershipId 
nameNombre, segundo nombre y apellido del viajero
firstNameNombre de pila del viajero; anidado bajo nameBob
middleNameEl segundo nombre de Traveler; anidado bajo nameRobert
lastNameApellido del viajero; anidado bajo nameJones
contactInfoDatos de contacto del viajero, como la dirección, el correo electrónico y el número de teléfono
addressDirección del viajero, incluyendo la calle, la ciudad, la región o provincia y el código postal; dentro de contactInfo
streetAddressDirección de Traveler; anidada bajo address123 Main St.
cityCiudad y dirección del viajero; anidada bajo addressBoston
stateDirección postal del viajero; se encuentra dentro de addressMA
countryPaís de la dirección postal del viajero; anidado bajo addressEE. UU.
postalCodeCódigo postal de la dirección del viajero; anidado bajo address02112
taxProvinceEl estado o provincia en el que el viajero pagará sus impuestos; se incluye en addressMA
emailLa dirección de correo electrónico del viajero; anidada bajo contactInfobrjones@somewhere.com
contactNumberEl número de teléfono del viajero; anidado bajo contactInfo555-555-5555
userTypeTanto si el viajero es un usuario individual (principal) como si está vinculado a una organización 
dateOfBirthFecha de nacimiento del viajero 

Cifrado y descifrado de tarjetas de crédito

Si utilizas cardNumbercomo identificador del viajero para la validación, habrá que cifrar cierta información. Expedia Exige un tratamiento seguro de la información PCI mediante una técnica JWE (cifrado web JSON) de industry-standard para cifrar y descifrar los datos de las tarjetas de crédito: cifrado asimétrico con un par de claves pública y privada.

Casos prácticos de cifrado

El cifrado debe tener lugar en lo siguiente:

  • Solicitud: 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.

  1. Genera una clave simétrica aleatoria (RSK) de 256 bits de longitud.
  2. 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)

Ejemplos de código

Ejemplo de Java para cifrado

El cifrado JWE puede implementarse de forma eficaz y rápida con la ayuda de bibliotecas JWE de terceros. Por ejemplo, esto Código Java para el cifrado Se creó con la ayuda de Nimbus JOSE+JWT biblioteca.

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();
/*

Ejemplo de encabezado JWE

{
"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();
    }

Descifrado del número de la tarjeta en la solicitud

Expedia cifrará « cardNumber » en la solicitud. La ruta de descifrado es el proceso inverso de la ruta de cifrado:

  1. 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).
  2. A continuación, comprobarás el « iat » (issued-at:, la hora en que se emitió el JWT) para asegurarte de que no difiere más de 5 minutos de la hora actual. (El token caducará a los 5 minutos).
  3. A continuación, busca tu clave privada y descifra la clave de cifrado JWE.
  4. 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.

Ejemplo de código

Ejemplo de Java para cifrado

El cifrado JWE puede implementarse de forma eficaz y rápida con la ayuda de bibliotecas JWE de terceros. Por ejemplo, esto Código Java para el cifrado Se creó con la ayuda de Nimbus JOSE+JWT biblioteca.

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();
}

Detalles de la API

Sin información de la tarjeta de crédito

Con información de la tarjeta de crédito

¿Te ha resultado útil esta página?
¿Cómo podemos mejorar este contenido?
¡Gracias por ayudarnos a mejorar!