Aktualizacja do najnowszej wersji

W sierpniu 2018 r. wprowadziliśmy w Google Pay API nowe biblioteki klienta Androida. Umożliwiają one utworzenie IsReadyToPayRequest lub PaymentDataRequest na podstawie obiektu JSON zserializowanego jako ciąg znaków. Z tego przewodnika dowiesz się, jak zaktualizować kod na Androida używający obiektu Builder do odpowiadającego mu ciągu znaków w formacie JSON, który jest przekazywany do metody fromJson() w IsReadyToPayRequest i PaymentDataRequest.

Formy płatności

W poprzednich wersjach Google Pay API używany przez nas obiekt Builder obsługiwał tylko karty jako formę płatności w przypadku IsReadyToPayRequest lub PaymentDataRequest. W najnowszej wersji Google Pay API forma płatności CARD jest tylko jedną z wielu dostępnych form płatności w IsReadyToPayRequest lub PaymentDataRequest.

Wartości stałe nie są już używane. Używany w poprzedniej wersji obiekt Builder odwoływał się do stałych liczb całkowitych. Nowy ciąg znaków w formacie JSON ustawia odpowiadające mu wartości w tablicy właściwości allowedAuthMethods w CardParameters. Aby zaktualizować kod, wybierz przypadek, który odpowiada Twojej sytuacji, i wykonaj poniższe instrukcje:

  1. Jeśli Twoja aplikacja obsługiwała PAYMENT_METHOD_CARD:
    • Dodaj "PAN_ONLY" do tablicy allowedAuthMethods.
  2. Jeśli Twoja aplikacja obsługiwała PAYMENT_METHOD_TOKENIZED_CARD:
    • Dodaj "CRYPTOGRAM_3DS" do tablicy allowedAuthMethods.

Wcześniej, jeśli nie wybrano sieci kart, do aplikacji był przypisywany domyślny zestaw dozwolonych sieci. Teraz aplikacje muszą udostępniać listę dozwolonych sieci kart.

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

Tokenizacja danych płatności kartą

Google Pay API zwraca zaszyfrowane dane karty, które są używane przez podaną bramę lub odszyfrowane na Twoich serwerach. Informacje, które wcześniej były przekazywane do kreatora PaymentMethodTokenizationParameters, powinny być zdefiniowane w PaymentMethodTokenizationSpecification formy płatności 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"
      }
    }
  }]
}

Adres rozliczeniowy

Możesz wymagać podania adresu rozliczeniowego lub numeru telefonu, który będzie powiązany z formą płatności CARD. W takiej sytuacji musisz skonfigurować wymaganą odpowiedź w obiekcie 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
      }
    }
  }]
}

Adres dostawy

Możesz wymagać od użytkowników podania adresu dostawy. Mogą oni użyć zapisanego adresu lub wpisać nowy. Adres dostawy w obiekcie JSON PaymentDataRequest jest właściwością najwyższego poziomu. Kraje adresów wysyłki, na które zezwalasz, zostały wcześniej dodane do konstruktora ShippingAddressRequirements i powinny być teraz określone w obiekcie 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
  }
}

Odpowiedź PaymentData

Odpowiedź to obiekt PaymentDataRequest z odpowiedzią w formacie JSON, która jest dostępna dla metody klasy toJson(). Aby ją odebrać, utwórz obiekt PaymentDataRequest z metodą klasy fromJson() i przekaż go do metody loadPaymentData w PaymentsClient. Z Intent zostanie pobrane wystąpienie PaymentData. JSONObject lub inne biblioteki obsługujące JSON mogą przeanalizować ciąg znaków w formacie JSON jako pary nazwa-wartość.

Wcześniejsze gettery

PaymentData paymentData =
    PaymentData.getFromIntent(data);

Bieżący obiekt JSON

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

Podsumowanie wybranej formy płatności znajduje się we właściwości description. Więcej właściwości dostępnych po zwróceniu typu CARD znajdziesz w dokumentacji referencyjnej obiektu JSONCardInfo.

Wcześniejsze gettery

paymentData
    .getCardInfo()
    .getCardDescription();

Bieżący obiekt JSON

paymentMethodData.get("description");

Informacje o wybranej formie płatności i jej tokenizacji znajdują się we właściwości paymentMethodData.

Wcześniejsze gettery

paymentData
    .getPaymentMethodToken()
    .getToken();

Bieżący obiekt JSON

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

Odpowiedź z zaszyfrowaną wiadomością

W aplikacjach z typem tokenizacji formy płatności DIRECT, które akceptują tokeny urządzeń z Androidem (wcześniej WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD), trzeba zaktualizować to, jak obsługują odszyfrowaną właściwość encryptedMessage na serwerach. Jako paymentMethod w formie CARD są widoczne typy uwierzytelnionych kart PAN_ONLY i CRYPTOGRAM_3DS. Zawierają one dodatkowe informacje o metodzie uwierzytelniania i polach poszczególnych metod podanych w paymentMethodDetails.

Jeśli serwer się nie zaktualizuje, nie będzie mógł przekierować tokenów urządzeń z Androidem do bramy lub firmy obsługującej płatności. Dzieje się tak, ponieważ serwer nie może rozróżnić w odpowiedzi typów uwierzytelniania kart. Karta to paymentMethod z wartością CARD. W paymentMethodDetails.authMethod zawiera dodatkowe informacje o metodzie uwierzytelniania wybranej karty. Tokeny są uwierzytelniane za pomocą kryptogramu 3-D Secure i opcjonalnie za pomocą wskaźnika handlu elektronicznego (Electronic Commerce Indicator, ECI).

ECI

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

Kryptogram w standardzie 3-D Secure

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