Atualizar para a versão mais recente

Em agosto de 2018, a API Google Pay lançou novas bibliotecas de cliente Android. Elas são compatíveis com a construção de um IsReadyToPayRequest ou PaymentDataRequest com base em um objeto JSON que é serializado como uma string. Neste guia, explicamos como atualizar o código do Android que usa um objeto Builder para a string formatada em JSON equivalente que é passada ao método fromJson() de IsReadyToPayRequest e PaymentDataRequest.

Formas de pagamento

Em versões anteriores da API Google Pay, o objeto Builder que usamos era compatível apenas com cartões como forma de pagamento para IsReadyToPayRequest ou PaymentDataRequest. Na versão mais recente da API Google Pay, a forma de pagamento CARD é apenas uma das várias possíveis para IsReadyToPayRequest ou PaymentDataRequest.

As constantes não são mais usadas. O objeto Builder usado na versão anterior fazia referência a constantes de número inteiro. A nova string formatada em JSON define valores de string equivalentes na matriz de propriedades allowedAuthMethods de CardParameters. Para atualizar seu código, identifique seu caso e siga as instruções abaixo:

  1. Se o aplicativo é compatível com PAYMENT_METHOD_CARD:
    • Adicione "PAN_ONLY" à matriz allowedAuthMethods.
  2. Se o aplicativo é compatível com PAYMENT_METHOD_TOKENIZED_CARD:
    • Adicione "CRYPTOGRAM_3DS" à matriz allowedAuthMethods.

Anteriormente, os aplicativos recebiam um conjunto padrão de redes de cartões permitidas, caso você não as especificasse. Agora, os aplicativos precisam fornecer uma lista de redes de cartões permitidas.

Builder

IsReadyToPayRequest.newBuilder()
    .addAllowedPaymentMethod(
        WalletConstants.PAYMENT_METHOD_CARD)
    .addAllowedPaymentMethod(
        WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD);
PaymentDataRequest.newBuilder()
    .addAllowedPaymentMethod(
        WalletConstants.PAYMENT_METHOD_CARD)
    .addAllowedPaymentMethod(
        WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD);

fromJson

{
  "apiVersion": 2,
  "apiVersionMinor": 0,
  "allowedPaymentMethods": [
    {
      "type": "CARD",
      "parameters": {
        "allowedAuthMethods": [
          "PAN_ONLY",
          "CRYPTOGRAM_3DS"
        ],
        "allowedCardNetworks": [
          "AMEX",
          "DISCOVER",
          "MASTERCARD",
          "VISA"
        ]
      }
    }
  ]
}

Tokenização de dados de pagamento com cartão

A API Google Pay retorna dados de cartão criptografados referenciados por seu gateway especificado ou descriptografados nos servidores. As informações fornecidas anteriormente a um builder PaymentMethodTokenizationParameters devem ser definidas no PaymentMethodTokenizationSpecification de uma forma de pagamento CARD.

Builder

PaymentMethodTokenizationParameters.newBuilder()
    .setPaymentMethodTokenizationType(
        WalletConstants.PAYMENT_GATEWAY)
    .addParameter(
        "gateway",
        "example")
    .addParameter(
        "gatewayMerchantId",
        "exampleGatewayMerchantId")

fromJson

{
  "allowedPaymentMethods": [{
    "type": "CARD",
    "tokenizationSpecification": {
      "type": "PAYMENT_GATEWAY",
      "parameters": {
        "gateway": "example",
        "gatewayMerchantId": "exampleGatewayMerchantId"
      }
    }
  }]
}

Endereço de faturamento

Você tem a opção de solicitar um endereço de faturamento ou número de telefone para associar a uma forma de pagamento CARD. Se você exigir um endereço de faturamento ou um número de telefone, especifique a configuração da resposta necessária no objeto JSON BillingAddressParameters.

Builder

PaymentDataRequest.newBuilder()
    .setPhoneNumberRequired(true)
    .setCardRequirements(
        CardRequirements.newBuilder()
            .setBillingAddressRequired(true)
            .setBillingAddressFormat(
                WalletConstants.BILLING_ADDRESS_FORMAT_FULL));

fromJson

{
  "allowedPaymentMethods": [{
    "type": "CARD",
    "parameters": {
      "billingAddressRequired": true,
      "billingAddressParameters": {
        "format": "FULL",
        "phoneNumberRequired": true
      }
    }
  }]
}

Endereço de entrega

Você tem a opção de exigir que os usuários forneçam um endereço de entrega. Eles podem usar um endereço de entrega armazenado ou inserir um novo. O endereço de entrega é uma propriedade de nível superior no objeto JSON PaymentDataRequest. Os países para os quais você permite um endereço de entrega já foram adicionados a um builder ShippingAddressRequirements e agora precisam ser especificados no objeto JSON ShippingAddressParameters.

Builder

PaymentDataRequest.newBuilder()
    .setPhoneNumberRequired(true)
    .setShippingAddressRequired(true)
    .setShippingAddressRequirements(
        ShippingAddressRequirements.newBuilder()
            .addAllowedCountryCode("US")
            .addAllowedCountryCode("CA"))

fromJson

{
  "shippingAddressRequired": true,
  "shippingAddressParameters": {
    "allowedCountryCodes": [
      "US",
      "CA"
    ],
    "phoneNumberRequired": true
  }
}

Resposta de PaymentData

Uma resposta é um objeto PaymentDataRequest que contém uma resposta formatada em JSON que está disponível para o método de classe toJson(). Para receber essa resposta, crie um objeto PaymentDataRequest com o método de classe fromJson() e passe-o para o método loadPaymentData de um PaymentsClient. Uma instância PaymentData é extraída de um Intent. Uma string formatada em JSON pode ser analisada em pares de nome-valor JSON por JSONObject ou outras bibliotecas compatíveis com JSON.

Getters anteriores

PaymentData paymentData =
    PaymentData.getFromIntent(data);

JSON atual

PaymentData paymentData =
    PaymentData.getFromIntent(data);
String json = paymentData.toJson();
if (json != null) {
  JSONObject paymentDataJson =
      new JSONObject(json);
  JSONObject paymentMethodData =
      paymentDataJson.get("paymentMethodData");
}

O texto resumido da forma de pagamento selecionada está disponível na propriedade description. Consulte a referência de objeto JSON CardInfo para outras propriedades disponíveis quando o tipo CARD é retornado.

Getters anteriores

paymentData
    .getCardInfo()
    .getCardDescription();

JSON atual

paymentMethodData.get("description");

As informações sobre uma forma de pagamento selecionada e a respectiva tokenização são colocadas dentro da propriedade paymentMethodData.

Getters anteriores

paymentData
    .getPaymentMethodToken()
    .getToken();

JSON atual

paymentMethodData
    .get("tokenizationData")
    .get("token");

Resposta de mensagem criptografada

Aplicativos que especificam um tipo de tokenização da forma de pagamento DIRECT e aceitam tokens de dispositivo Android, anteriormente WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD, precisam atualizar a maneira como eles lidam com a propriedade encryptedMessage descriptografada nos servidores deles. Os tipos PAN_ONLY e CRYPTOGRAM_3DS de cartões autenticados aparecem como paymentMethod de CARD, com outras informações sobre o método de autenticação e campos específicos do método de autenticação fornecidos em paymentMethodDetails.

Como resultado, se o servidor não for atualizado, não será possível encaminhar tokens de dispositivos Android ao gateway ou processador. Isso ocorre porque o servidor não consegue distinguir entre vários tipos de autenticação de cartão na resposta. Os cartões são um paymentMethod de CARD com mais informações sobre o método de autenticação do cartão selecionado em paymentMethodDetails.authMethod. Os tokens são autenticados com um criptograma 3-D Secure e um indicador de comércio eletrônico (ECI, na sigla em inglês) opcional.

ECI

{
  "paymentMethod": "TOKENIZED_CARD",
  "paymentMethodDetails": {
    "authMethod": "3DS",
    "dpan": "1111222233334444",
    "expirationMonth": 10,
    "expirationYear": 2020,
    "3dsCryptogram": "AAAAAA...",
    "3dsEciIndicator": "eci indicator"
  }
}

Criptograma 3-D Secure

{
  "paymentMethod": "CARD",
  "paymentMethodDetails": {
    "authMethod": "CRYPTOGRAM_3DS",
    "pan": "1111222233334444",
    "expirationMonth": 10,
    "expirationYear": 2020,
    "cryptogram": "AAAAAA...",
    "eciIndicator": "eci indicator"
  }
}