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

С июля 2018 г. в Google Pay API используются новые структуры объектов для PaymentDataRequest и IsReadyToPayRequest. Из этого руководства вы узнаете, как изменить формат объектов для Google Pay API версии 1, чтобы он соответствовал формату версии 2.

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

В Google Pay API версии 2 для каждого объекта запроса требуется указывать версию API.

В Google Pay API версии 1 поддерживался только один способ оплаты – с помощью карты. В Google Pay API версии 2, помимо CARD, существует множество других вариантов оплаты. Если для параметра CARD было установлено значение allowedPaymentMethods, следует использовать параметр PAN_ONLY со значением allowedAuthMethods. Если для параметра TOKENIZED_CARD было установлено значение allowedPaymentMethods, следует использовать параметр CRYPTOGRAM_3DS со значением allowedAuthMethods.

Поддерживаемые платежные системы указываются вместе с допустимыми методами аутентификации карт в этих системах.

apiVersion 1

{
  allowedPaymentMethods: [
    'CARD',
    'TOKENIZED_CARD'
  ],
  cardRequirements: {
    allowedCardNetworks: [
      'AMEX',
      'DISCOVER',
      'JCB',
      'MASTERCARD',
      'VISA'
    ]
  }
}

apiVersion 2

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

Поддерживаемые платежные системы и методы аутентификации для способа оплаты CARD указываются с помощью параметра IsReadyToPayRequest.

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

Google Pay API возвращает зашифрованные данные карты, которые передаются на указанный шлюз или расшифровываются на серверах. В Google Pay API версии 2 токенизация способа оплаты выполняется внутри объекта, определяющего способ оплаты CARD.

apiVersion 1

{
  paymentMethodTokenizationParameters: {
    tokenizationType: 'PAYMENT_GATEWAY',
    parameters: {
      'gateway': 'example',
      'gatewayMerchantId': 'exampleMerchantId'
    }
  }
}

apiVersion 2

{
  allowedPaymentMethods: [{
    type: 'CARD',
    tokenizationSpecification: {
      type: 'PAYMENT_GATEWAY',
      parameters: {
        'gateway': 'example',
        'gatewayMerchantId': 'exampleMerchantId'
      }
    }
  }]
}

Идентификатор продавца Google

В Google Pay API версии 1 идентификатор продавца Google представлял собой свойство верхнего уровня. Теперь этот идентификатор указывается внутри объекта MerchantInfo с необязательным названием продавца.

apiVersion 1

{
  merchantId: '12345678901234567890'
}

apiVersion 2

{
  merchantInfo: {
    merchantId: '12345678901234567890'
  }
}

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

Платежный адрес и телефон связаны со способом оплаты CARD и являются необязательными свойствами. Если сайт запрашивает платежный адрес, то конфигурация, связанная с ожидаемым ответом, вкладывается в объект BillingAddressParameters.

apiVersion 1

{
  cardRequirements: {
    billingAddressRequired: true,
    billingAddressFormat: 'FULL'
  },
  phoneNumberRequired: true
}

apiVersion 2

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

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

Адрес доставки является необязательным свойством верхнего уровня для объекта PaymentDataRequest. Название свойства shippingAddressRequirements было изменено на shippingAddressParameters.

Ранее в ответах Google Pay API, содержащих адрес доставки, мог передаваться номер телефона. Эта возможность больше не поддерживается ни в одной из версий Google Pay API. Обработчики ответов, ожидающие номер телефона, необходимо обновить.

apiVersion 1

{
  shippingAddressRequired: true,
  shippingAddressRequirements: {
    allowedCountryCodes: [
      'US',
      'CA'
    ]
  }
}

apiVersion 2

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

Ответ PaymentData

Объект ответа PaymentData для сайтов, где для свойства apiVersion объекта 2 указано значение PaymentDataRequest, теперь определяет карты как один из вариантов оплаты. Свойства apiVersion и apiVersionMinor из объекта PaymentDataRequest указываются в ответе PaymentData для определения ожидаемого формата.

apiVersion 1

{
  // no version specified
}

apiVersion 2

{
  apiVersion: 2,
  apiVersionMinor: 0
}

Свойство paymentMethodData содержит информацию о выбранном способе оплаты и токенизации. Два объекта cardInfo были исключены из свойства: cardClass и cardImageUri.

apiVersion 1

{
  cardInfo: {
    cardDescription: 'Visa •••• 1234',
    cardNetwork: 'VISA',
    cardDetails: 1234
  },
  paymentMethodToken: {
    tokenizationType: 'PAYMENT_GATEWAY',
    token: 'examplePaymentMethodToken'
  }
}

apiVersion 2

{
  paymentMethodData: {
    type: 'CARD',
    description: 'Visa •••• 1234',
    info: {
      cardNetwork: 'VISA',
      cardDetails: '1234'
    },
    tokenizationData: {
      type: 'PAYMENT_GATEWAY',
      token: 'examplePaymentMethodToken'
    }
  }
}

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

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

apiVersion 1

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

apiVersion 2

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