Обновление до последней версии

С августа 2018 г. в Google Pay API используются новые клиентские библиотеки для Android. Они позволяют создавать классы IsReadyToPayRequest и PaymentDataRequest на базе объектов JSON, сериализованных как строка. Из этого руководства вы узнаете, как заменить объект Builder в коде для Android эквивалентной строкой в формате JSON, передаваемой методу fromJson() классов IsReadyToPayRequest и PaymentDataRequest.

Способы оплаты

В предыдущей версии Google Pay API в объекте Builder в качестве способа оплаты для IsReadyToPayRequest или PaymentDataRequest можно было указывать только карты. В последней версии Google Pay API, помимо CARD, для IsReadyToPayRequest и PaymentDataRequest поддерживается и ряд других способов оплаты.

Константы больше не используются. В объекте Builder из предыдущей версии указывалась ссылка на целые константы. В новой строке в формате JSON эквивалентные строковые значения задаются в массиве свойств allowedAuthMethods объекта CardParameters. Чтобы обновить код, выберите подходящий вариант и выполните действия, описанные ниже:

  1. Если в приложении используется PAYMENT_METHOD_CARD:
    • Добавьте "PAN_ONLY" в массив allowedAuthMethods.
  2. Если в приложении используется PAYMENT_METHOD_TOKENIZED_CARD:
    • Добавьте "CRYPTOGRAM_3DS" в массив allowedAuthMethods.

Если в приложении не были напрямую заданы поддерживаемые платежные системы, то раньше для него назначался набор платежных систем по умолчанию. Теперь поддерживаемые платежные системы нужно указывать обязательно.

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"
        ]
      }
    }
  ]
}

Токенизация платежных данных карт

Google Pay API возвращает зашифрованные данные карты, которые передаются на указанный шлюз или расшифровываются на серверах. Данные, которые раньше передавались сборщику PaymentMethodTokenizationParameters, теперь должны быть определены в объекте PaymentMethodTokenizationSpecification для способа оплаты 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"
      }
    }
  }]
}

Платежный адрес

Вы можете запросить платежный адрес или номер телефона, чтобы связать их со способом оплаты CARD. Если вы решите запросить платежный адрес или номер телефона, укажите конфигурацию требуемого ответа в объекте 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
      }
    }
  }]
}

Адрес доставки

Вы можете запросить у пользователя адрес доставки. При этом покупатель сможет выбрать сохраненный адрес или ввести новый. Адрес доставки является свойством верхнего уровня объекта JSON PaymentDataRequest. Раньше страны, в которые осуществляется доставка, добавлялись в сборщик ShippingAddressRequirements. Теперь для этого используется объект 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
  }
}

Ответ PaymentData

Объект PaymentDataRequest содержит ответ в формате JSON, доступный методу класса toJson(). Чтобы получить этот ответ, создайте объект PaymentDataRequest с методом класса fromJson() и передайте его методу loadPaymentData объекта PaymentsClient. Экземпляр PaymentData извлекается из объекта Intent. Строку в формате JSON можно преобразовать в набор пар "имя-значение" с помощью JSONObject или других библиотек, поддерживающих JSON.

Предыдущие методы получения

PaymentData paymentData =
    PaymentData.getFromIntent(data);

Текущий метод JSON

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

Описание выбранного способа оплаты доступно в свойстве description. Сведения о дополнительных свойствах, доступных при возвращении типа CARD, можно найти в документации по объекту JSON CardInfo.

Предыдущие методы получения

paymentData
    .getCardInfo()
    .getCardDescription();

Текущий метод JSON

paymentMethodData.get("description");

Свойство paymentMethodData содержит информацию о выбранном способе оплаты и токенизации.

Предыдущие методы получения

paymentData
    .getPaymentMethodToken()
    .getToken();

Текущий метод JSON

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

Ответ с зашифрованным сообщением

Если в приложении выбран тип DIRECT для токенизации способа оплаты и используются токены для устройств Android (ранее WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD), то нужно обновить метод обработки расшифрованного свойства encryptedMessage на сервере. Для типов PAN_ONLY и CRYPTOGRAM_3DS аутентифицированных карт используется paymentMethod со значением CARD, содержащий дополнительную информацию о методе аутентификации и поля для конкретного метода аутентификации, указанного в paymentMethodDetails.

Если не обновить код на сервере, то токены устройств для Android не будут передаваться шлюзу или обработчику платежей, поскольку сервер не сможет распознать тип аутентификации карты в ответе. Вариант оплаты картой указывается с помощью значения CARD для paymentMethod, а метод аутентификации – с помощью дополнительного свойства paymentMethodDetails.authMethod. Для аутентификации токенов используется криптограмма 3-D Secure и необязательный индикатор ECI.

ECI

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

Криптограмма 3-D Secure

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