API de informações da conta

A API de informações da conta contém dados sobre cada um dos seus clientes. O seu modelo de site vai usar essas informações como parte do protocolo de login único (SSO) para verificar a conta do usuário. A API vai ser usada para compras, resgate de pontos de fidelidade e muito mais.

Essa API também pode ser usada por agentes da Expedia para verificar o identificador exclusivo do viajante (por exemplo, o número do cartão de crédito) como parte da solicitação para obter os dados da conta do usuário. As informações recebidas são usadas para validar o viajante por telefone antes de prosseguir com as compras e reservas em nome dessa pessoa.

Consulte mais informações na página sobre dados e respostas comuns.

Criptografia e descriptografia de cartão de crédito

A Expedia aplica uma técnica padrão do setor, conhecida como JWE (JSON Web Encryption), para criptografar e descriptografar dados dos cartões de crédito. É uma criptografia assimétrica, com um par de chaves públicas e privadas.

Casos de uso de criptografia

Os locais onde a criptografia é necessária incluem:

  • Solicitação: cardNumber
  • Resposta: cardDetails

No parâmetro de solicitação, é preciso configurar um certificado de chave privada RSA (Rivest Shamir Adleman) de 2048 bits assinado por uma CA (autoridade certificadora) e compartilhar com a Expedia. Em seguida, vamos usar a sua chave pública para criptografar o campo cardNumber com JWE e RSA.

No parâmetro de resposta, vamos configurar uma chave privada RSA de 2048 bits assinada por uma CA e compartilhar o certificado de chave pública correspondente com você. Usando a chave pública da Expedia, você vai criptografar cada elemento de cardDetails com JWE e RSA.

Siga os passos abaixo para realizar o processo de criptografia.

Guia passo a passo de criptografia

Passo 1: obtenha o certificado público e a chave pública RSA 2048.

  1. Gere uma chave simétrica aleatória (RSK) com 256 bits de comprimento.
  2. Criptografe a RSK usando a chave pública RSA 2048 com o algoritmo RSA-OAEP-256.

Passo 2: gere um vetor de inicialização (IV) aleatório com 96 bits de comprimento.

Passo 3: criptografe os dados em texto simples usando a RSK, o IV e o algoritmo A256GCM para formar o texto cifrado e os dados da tag de autenticação.

Passo 4: codifique o texto cifrado em Base64URL para produzir Base64URL (texto cifrado JWE).

Passo 5: codifique em Base64URL a tag de autenticação, o IV, a RSK e o JSON do cabeçalho JWE para produzir:

  • Dados da tag de autenticação: Base64URL (tag de autenticação JWE)
  • IV: Base64URL (vetor de inicialização JWE)
  • RSK: Base64URL (chave criptografada JWE)
  • JSON do cabeçalho JWE: Base64URL (UTF8) (cabeçalho JWE)

Em seguida, serialize o objeto JWE no seu formato compacto, composto por partes codificadas em Base64URL delimitadas por pontos ('.'), para produzir:

Base64URL (UTF8) (cabeçalho JWE) || '.' || Base64URL (chave criptografada JWE) || '.' || Base64URL (vetor de inicialização JWE) || '.' || Base64URL (texto cifrado JWE) || '.' || Base64URL (tag de autenticação JWE)

Exemplos de códigos

Exemplo de Java para criptografia

A criptografia JWE pode ser implementada de modo eficiente e rápido com a ajuda de bibliotecas JWE de terceiros. Por exemplo, este código Java para criptografia foi criado com a ajuda da biblioteca 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();
/*

Exemplo de cabeçalho 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();
    }

Descriptografia do número do cartão na solicitação

A Expedia vai criptografar o cardNumber na solicitação. O caminho de descriptografia é o inverso do caminho de criptografia:

  1. Quando você receber o JWE criptografado, precisa decodificar a primeira seção do JWE, o cabeçalho JOSE, para determinar o algoritmo, a criptografia e o keyId (alg, enc, kid).
  2. Em seguida, você vai validar o iat (issued-at: o momento em que o JWT foi emitido) para garantir que não haja diferença de mais de 5 minutos em relação ao horário atual, pois o token expira após 5 minutos.
  3. Depois, use a sua chave privada e descriptografe a chave de criptografia JWE.
  4. Então, usando a RSK descriptografada, o vetor de inicialização JWE e a tag de autenticação JWE, você pode descriptografar e verificar o parâmetro de texto cifrado JWE.

Exemplo de código

Exemplo de Java para criptografia

A criptografia JWE pode ser implementada de modo eficiente e rápido com a ajuda de bibliotecas JWE de terceiros. Por exemplo, este código Java para criptografia foi criado com a ajuda da biblioteca 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();
}

Obter informações da conta

Você vai usar este conjunto de campos para buscar informações da conta de um associado do programa de fidelidade ou titular de cartão usando POST /user/v1/account.

Cabeçalho

CampoDescriçãoExemplo do valorTipo de campoObrigatório?
partnerIdIdentificador exclusivo da empresa, disponibilizado pela Expedia.SUA MARCASequência, máximo de 20 caracteresSim
AuthorizationToken de acesso recebido pela Expedia do seu servidor de autorização, a ser validado pela sua equipe.JSON Web Token (JWT) padrãoSequência, comprimento padrão de JWTNão
Authorization2JSON Web Token (JWT) enviado pela Expedia. Assinatura e declarações a serem validadas por você.JWT padrãoSequência, comprimento padrão de JWTNão

Solicitação

CampoDescriçãoTipo de campoObrigatório?
requestIdIdentificador exclusivo da solicitação de transação.SequênciaSim
membershipIdIdentificador exclusivo do cliente.SequênciaNão
loyaltyAccountNumberNúmero da conta do programa de fidelidade do cliente (também chamado de programAccountNumber). Deve ser preenchido apenas se um identificador diferente de membershipId for necessário para operações de fidelidade
.- Sequência
Não
programIdIdentificador do programa de fidelidade ao qual o cliente é afiliado ou o nome do nível associado ao programa de fidelidade.SequênciaNão
cardNumberNúmero do cartão de crédito do cliente (criptografado).SequênciaNão
emailEndereço de e-mail do cliente.SequênciaNão

Resposta

CampoDescriçãoTipo de campoObrigatório?
statusStatus da transação (valores: Approved, Declined).SequênciaSim
requestIdIdentificador exclusivo da solicitação de transação (do conteúdo da solicitação).SequênciaSim
ProgramAccountDados da conta do programa. Consulte a tabela ProgramAccount para campos aninhados.  
languageIdOs idiomas em que o site vai poder ser visualizado.SequênciaNão
channelTypePlataformas para as quais o site é otimizado (valores: WEB, MOBILE, TABLET). Não

ProgramAccount

CampoDescriçãoExemplo do valorObrigatório?
programIdIdentificador do programa de fidelidade ao qual o cliente é afiliado ou o nome do nível associado ao programa de fidelidade.Aventura GoldSim
accountNameNome do programa (se diferente de programId).AventuraNão
loyaltyAccountNumberNúmero da conta do programa de fidelidade do cliente (também chamado de programAccountNumber). Deve ser preenchido apenas se um identificador diferente de membershipId for necessário para operações de fidelidade
.- 1234567
Não
lastFourDigitsOfCreditCardÚltimos quatro dígitos do cartão de crédito que o cliente usou na reserva.0000Não
loyaltyConversionRatioProporção usada para converter o pagamento em pontos ganhos, por exemplo, R$ 1 = 1 ponto. Não
loyaltyAccountBalanceSaldo atual dos pontos de fidelidade ganhos pelo cliente.2003Sim

Informações do usuário

CampoDescriçãoExemplo do valorObrigatório?
userIdIdentificador exclusivo de cliente. O mesmo que membershipId. Sim
namePrimeiro nome, nome do meio e sobrenome do cliente.  
firstNamePrimeiro nome do cliente, aninhado em name.BobSim
middleNameNome do meio do cliente, aninhado em name.RobertNão
lastNameSobrenome do cliente, aninhado em name.JonesSim
contactInfoInformações de contato do cliente, incluindo endereço, e-mail e número de telefone. Não
addressEndereço do cliente, incluindo endereço, cidade, estado ou província e código postal, aninhado em contactInfo.  
streetAddressEndereço do cliente, aninhado em address.123 Main St.Não
cityCidade do endereço do cliente, aninhada em address.BostonNão
stateEstado do endereço do cliente, aninhado em address.MANão
countryPaís do endereço do cliente, aninhado em address.USANão
postalCodeCódigo postal do endereço do cliente, aninhado em address.02112Não
taxProvinceEstado ou província em que o cliente vai pagar impostos, aninhado em address.MANão
emailEndereço de e-mail do cliente, aninhado em contactInfo.brjones@local.comNão
contactNumberNúmero de telefone do cliente, aninhado em contactInfo.555-555-5555Não
userTypeSe o cliente é um único usuário (primário) ou está associado a uma organização. Não
dateOfBirthData de nascimento do cliente. Não
cardDetailsDados do cartão de crédito usado na transação. Se preenchido, alguns itens aninhados devem ser criptografados. Não
cardNumber *Número do cartão de crédito usado na transação (criptografado), aninhado em cardDetails. Sim
cardTypeTipo de cartão usado (criptografado), aninhado em cardDetails. Sim
expirationDate *Data de vencimento do cartão no formato MM/AAAA (criptografado), aninhada em cardDetails. Sim
billingAddressEndereço de cobrança do cartão usado na transação, aninhado em cardDetails.  
firstAddressLine *Primeira linha do endereço de cobrança (criptografado), aninhada em billingAddress. Sim
secondAddressLineSegunda linha do endereço de cobrança, aninhada em billingAddress. Não
thirdAddressLineTerceira linha do endereço de cobrança, aninhada em billingAddress. Não
cityElemento de cidade no endereço de cobrança, aninhado em billingAddress. Não
provinceElemento de estado ou província no endereço de cobrança, aninhado em billingAddress. Não
countryCodeElemento de país no endereço de cobrança, aninhado em billingAddress. Não
postalCode *Elemento de código postal no endereço de cobrança (criptografado), aninhado em billingAddress. Sim

Observação: se algum dos campos cardDetails estiver preenchido, aqueles marcados com * serão obrigatórios. Todos os dados nesses campos são criptografados.

Detalhes da API

Sem dados do cartão de crédito

Com dados do cartão de crédito

Esta página foi útil?
Como podemos melhorar esse conteúdo?
Agradecemos por nos ajudar a melhorar.