С августа 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
. Чтобы обновить код, выберите подходящий вариант и выполните действия, описанные ниже:
- Если в приложении используется
PAYMENT_METHOD_CARD
:- Добавьте
"PAN_ONLY"
в массивallowedAuthMethods
.
- Добавьте
- Если в приложении используется
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" } }