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:
- Se o aplicativo é compatível com 
      
PAYMENT_METHOD_CARD:- Adicione 
"PAN_ONLY"à matrizallowedAuthMethods. 
 - Adicione 
 - Se o aplicativo é compatível com 
          
PAYMENT_METHOD_TOKENIZED_CARD:- Adicione 
"CRYPTOGRAM_3DS"à matrizallowedAuthMethods. 
 - Adicione 
 
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" } }