Создавайте быстрые покупки в Интернете с помощью Google Pay

API Google Pay дает пользователям возможность платить где угодно, используя платежную информацию, хранящуюся в их аккаунтах Google. В этом лабораторном занятии вы используете клиентскую библиотеку Google Pay для Интернета, чтобы улучшить процесс оформления заказа в упрощенном образце интернет-магазина, создав более быстрый, удобный и безопасный процесс, который, в свою очередь, приведет к большему количеству конверсий и более довольным клиентам.

Auto T-Shirt Shop — это инновационный магазин, который использует последние достижения в области искусственного интеллекта и использует такую ​​информацию, как предпочтения стиля, погода, время года и модные тенденции, чтобы предложить вам наиболее подходящий товар для покупки.

Показатели вовлеченности для этого магазина просто зашкаливают. К сожалению, показатели также отражают большое количество отказов в процессе оформления заказа. Решив решить эту проблему, один из владельцев проекта вспоминает, что видел видео, показывающее многообещающие результаты, которые Google Pay дал для аналогичных сайтов , поэтому они решили попробовать и доверить вам заботу об интеграции.

Что вы будете строить

Эта лабораторная работа поможет вам интегрировать Google Pay в существующий сайт, в том числе определить, может ли пользователь оплатить с помощью метода оплаты, поддерживаемого Google Pay, размещение и дизайн кнопки оплаты, а также выполнение транзакции.

Что вы узнаете

  • Как интегрировать Google Pay в существующую страницу оформления заказа
  • Как выбрать один из предпочтительных способов оплаты
  • Как определить, готов ли пользователь платить с помощью Google Pay

Что тебе понадобится

  • Компьютер с доступом в интернет
  • Базовые знания JavaScript

Запустите образец сайта на glitch.com.

Чтобы приступить к работе как можно быстрее, эта кодовая лаборатория размещена на сайте glitch.com. Glitch — это бесплатная веб-среда, которая предоставляет редактор кода, а также функции хостинга и развертывания, которые можно использовать для создания и обслуживания веб-приложений.

Чтобы начать работу, используйте кнопку ниже, чтобы предоставить новую среду разработки на Glitch, уже настроенную с копией этой кодовой лаборатории.

Запустить среду разработки на Glitch.com

С этого момента вы можете использовать редактор кода на Glitch для изменения ваших файлов. Начните обслуживать свое приложение с помощью меню « Показать» вверху и выберите «В новом окне ».

Просмотрите образец сайта

Как видите, репозиторий имеет несложную файловую структуру. Основная цель этой лаборатории кода — дать вам возможность адаптировать эту интеграцию к вашим существующим и будущим приложениям, независимо от платформы, библиотек или инструментов, с которыми вы хотите работать.

Исследуйте сайт

Этот демонстрационный рынок был построен таким образом, что он скромно напоминает то, как ваше существующее или потенциальное приложение могло бы выглядеть сегодня, прежде чем вы добавите средство покупки. На самом деле, несмотря на то, что мы рекомендуем вам работать поверх этого демонстрационного приложения, вы можете свободно использовать эту лабораторию кода для интеграции Google Pay в ваши существующие приложения.

Теперь, если вы еще этого не сделали, откройте демонстрационный сайт в его текущем состоянии. Для этого нажмите кнопку « Показать» , если вы используете Glitch, или откройте URL-адрес, по которому работает ваш локальный веб-сервер.

В демо-сайте нет ничего удивительного, верно? Страница сведений о продукте с изображением, ценой, описанием, некоторыми селекторами и кнопкой для перехода к воображаемой и обычной платежной форме.

Цель этого практического занятия – заменить этот процесс взаимодействием в два клика на базе Google Pay.

Давайте спланируем это!

Чтобы лучше понять эту интеграцию, процесс разбит на следующие основные этапы:

  1. Загрузите библиотеку
  2. Определить возможность оплаты с помощью Google Pay
  3. Показать кнопку для оплаты через Google Pay
  4. Создать и отправить запрос на оплату
  5. Соберите результаты

Добавьте тег script

Первое, что вам нужно сделать, чтобы начать использовать API Google Pay, — это загрузить библиотеку JavaScript. Для этого включите тег script в файл HTML, из которого вы собираетесь вызывать API, включая атрибут src , указывающий на внешнюю библиотеку JavaScript.

Для этой лаборатории кода откройте файл index.html . Вы должны увидеть, что тег script уже включен для вас:

<script async
  src="https://pay.google.com/gp/p/js/pay.js"
  onload="onGooglePayLoaded()">
</script>

В дополнение к src вы добавили два других атрибута.

  • async позволяет вашему сценарию загружаться и выполняться асинхронно вместе с остальной частью страницы, так что время первой загрузки вашего документа не изменится.
  • onload помогает вам отложить выполнение кода, который зависит от этой библиотеки, до тех пор, пока ваш скрипт не будет загружен. После этого запускается функция, указанная вами в этом атрибуте. В данном случае функция onGooglePayLoaded .

Создайте экземпляр клиента API

Как только ваш скрипт загружен, все готово для того, чтобы вы могли начать использовать эту библиотеку. Начните с создания экземпляра объекта client, который вы будете использовать для вызовов API Google Pay позже.

Отредактируйте файл index.js , который уже является частью файловой структуры этого проекта. Замените функцию onGooglePayLoaded следующим кодом.

let googlePayClient;
function onGooglePayLoaded() {
  googlePayClient = new google.payments.api.PaymentsClient({
    environment: 'TEST'
  });
}

Платежный клиент инициализируется с помощью объекта PaymentOptions . Настройка environment на TEST позволяет вам экспериментировать с информацией о фиктивных платежах на протяжении всей интеграции. Когда вы будете готовы создавать операции, поддерживающие реальные транзакции, вы можете обновить свойство environment до PRODUCTION .

Обзор

Теперь мы загрузили клиентскую библиотеку JavaScript API Google Pay. Теперь давайте настроим его для выполнения вызовов API для нас.

Все следующие изменения кода для остальной части кода будут внесены в файл index.js .

Скелет

Каждый раз, когда вы взаимодействуете с API Google Pay, вам необходимо включить в свои запросы ряд параметров конфигурации, например версию API, на которую вы ориентируетесь. Для целей этой кодовой лаборатории этот объект также содержит информацию о способах оплаты, принятых в вашем приложении. Окончательная структура выглядит следующим образом:

{
  apiVersion: number,
  apiVersionMinor: number,
  allowedPaymentMethods: Array
}

Свойство allowedPaymentMethods принимает список способов оплаты. Для каждого способа оплаты необходимо указать следующие свойства:

{
  type: 'CARD',
  parameters: {
    allowedCardNetworks: Array.<string>,
    allowedAuthMethods: Array.<string>
  }
}

Только type свойств и parameters необходимы, чтобы определить, может ли рассматриваемый пользователь платить с помощью Google Pay.

Конфигурация способа оплаты

В этом примере вы собираетесь принять только одну конфигурацию, разрешающую карточные платежи для Mastercard и Visa, как в токенизированной форме , так и в форме основного номера счета ( PAN ).

Вот как ваша конфигурация должна быть настроена в index.js :

const baseCardPaymentMethod = {
  type: 'CARD',
  parameters: {
    allowedCardNetworks: ['VISA','MASTERCARD'],
    allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS']
  }
};

Собираем все вместе

Давайте резюмируем.

Вы определили один способ оплаты, который будет приниматься на вашем веб-сайте, и вы собираетесь работать с версией 2.0 API. Вот как должна выглядеть полученная конфигурация:

const baseCardPaymentMethod = {
  type: 'CARD',
  parameters: {
    allowedCardNetworks: ['VISA','MASTERCARD'],
    allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS']
  }
};

const googlePayBaseConfiguration = {
  apiVersion: 2,
  apiVersionMinor: 0,
  allowedPaymentMethods: [baseCardPaymentMethod]
};

Теперь, когда у вас есть готовая базовая конфигурация, давайте перейдем к самой интересной части.

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

Может ли ваш пользователь расплачиваться с помощью Google Pay?

Первое, что вам нужно сделать, это проверить, может ли конкретный пользователь, который собирается заплатить на вашем сайте, использовать для этого Google Pay. Этот запрос требует, чтобы вы указали версию API Google Pay и разрешенные способы оплаты для вашего сайта. Это именно то, что содержит базовый объект конфигурации, определенный на предыдущем шаге.

В index.js внутри функции onGooglePayLoaded() вставьте следующее:

googlePayClient.isReadyToPay(googlePayBaseConfiguration)
  .then(function(response) {
    if(response.result) {
      createAndAddButton();
    } else {
      alert("Unable to pay using Google Pay");
    }
  }).catch(function(err) {
    console.error("Error determining readiness to use Google Pay: ", err);
  });

Если вызов завершается ошибкой или возвращается с неудачным ответом, в контексте Google Pay не требуется предпринимать никаких дальнейших действий. В этой ситуации наиболее подходящим следующим шагом будет демонстрация дополнительного пользовательского интерфейса, поддерживающего другие способы оплаты.

С другой стороны, если ответ успешен, теперь вы готовы позволить своим пользователям получать выгоду от использования Google Pay, и, таким образом, вы можете добавить кнопку, чтобы инициировать процесс оплаты при активации пользователя (например, кнопка нажмите).

Добавьте кнопку для оплаты через Google Pay

Несмотря на то, что вы можете использовать любую кнопку, которая соответствует рекомендациям бренда Google Pay, чтобы начать процесс оплаты, мы рекомендуем вам создать ее с помощью Google Pay API. Таким образом, вы не только обеспечиваете точное использование рекомендаций по бренду, но также получаете выгоду от других улучшений, встроенных непосредственно в кнопку, таких как локализация.

Чтобы сгенерировать кнопку, используйте метод createButton в объекте PaymentsClient , включая ButtonOptions для настройки кнопки.

В index.js внутри функции createAndAddButton() вставьте следующее:

function createAndAddButton() {

  const googlePayButton = googlePayClient.createButton({

    // currently defaults to black if default or omitted
    buttonColor: 'default',

    // defaults to long if omitted
    buttonType: 'long',

    onClick: onGooglePaymentsButtonClicked
  });

  document.getElementById('buy-now').appendChild(googlePayButton);
}

function onGooglePaymentsButtonClicked() {
  // TODO: Perform transaction
}

Единственное обязательное свойство при использовании createButton — это onClick , которое необходимо для определения объекта или функции обратного вызова, которые будут запускаться каждый раз, когда ваши пользователи нажимают кнопку. buttonColor и buttonType позволяют настроить внешний вид кнопки. Настройте их соответствующим образом в зависимости от темы и требований пользовательского интерфейса вашего приложения.

После создания кнопки все, что вам нужно сделать, это добавить ее в соответствующий узел в DOM. В этом примере для этой цели используется узел div , идентифицированный как buy-now .

Обратите внимание, что вы также определили функцию для обработки событий нажатия кнопки. В следующем разделе вы используете эту функцию для запроса способа оплаты.

Подготовьте запрос на оплату

На этом этапе вы загрузили Google Pay API и определили, что пользователь вашего сайта может использовать Google Pay для совершения платежа. В результате вы показали кнопку оплаты Google Pay в пользовательском интерфейсе, и теперь ваш пользователь готов инициировать транзакцию. Пришло время загрузить окончательный лист платежей, содержащий формы оплаты, доступные для различных вошедших в систему пользователей.

Как и раньше, во время определения запроса isReadyToPay этого вызова также требуются свойства в объекте базовой конфигурации, определенные ранее ( apiVersion , apiVersionMinor и allowedPaymentMethods ), в дополнение к некоторым новым. На этот раз в ваших способах оплаты есть новое свойство tokenizationSpecification и дополнительные parameters , соответствующие цели этого запроса. Кроме того, необходимо добавить transactionInfo merchantInfo .

Включите дополнительную необходимую информацию в ваши способы оплаты

Начните с создания копии используемого ранее способа оплаты базовой картой. Для этого метода оплаты картой теперь требуется свойство tokenizationSpecification для определения того, как обрабатывать данные, связанные с выбранным методом оплаты, а также дополнительные требования к данным, необходимые для фактической транзакции: в этом примере полный адрес для выставления счетов и номер телефона.

Свойство tokenizationSpecification

Спецификация токенизации определяет, как метод оплаты, выбранный вашими клиентами, обрабатывается и используется для завершения транзакции.

Поддерживаются два различных типа стратегий обработки. Если вы обрабатываете транзакцию платежа с серверов, совместимых с PCI DSS , используйте тип спецификации DIRECT . В этом примере вы используете платежный шлюз для обработки платежа, поэтому вы устанавливаете тип спецификации PAYMENT_GATEWAY .

В index.js внутри функции onGooglePaymentsButtonClicked() вставьте следующее:

const tokenizationSpecification = {
  type: 'PAYMENT_GATEWAY',
  parameters: {
    gateway: 'example',
    gatewayMerchantId: 'gatewayMerchantId'
  }
};

В разделе parameters вы можете указать шлюз из списка провайдеров, поддерживаемых API Google Pay , а также дополнительную настройку, необходимую для каждого шлюза. Для целей этой лабораторной работы достаточно использовать example шлюза, который дает результаты тестирования для выполненных транзакций.

Дополнительные параметры

Точно так же теперь вы можете предоставить более подробную информацию об информации, которую вам необходимо запросить, чтобы успешно разместить транзакцию. Посмотрите, как в этом примере вам нужно добавить свойства billingAddressRequired и billingAddressParameters , чтобы указать, что для этой транзакции требуется платежный адрес пользователя в полном формате, включая номер телефона.

В index.js внутри функции onGooglePaymentsButtonClicked() вставьте следующее:

const cardPaymentMethod = {
  type: 'CARD',
  tokenizationSpecification: tokenizationSpecification,
  parameters: {
    allowedCardNetworks: ['VISA','MASTERCARD'],
    allowedAuthMethods: ['PAN_ONLY','CRYPTOGRAM_3DS'],
    billingAddressRequired: true,
    billingAddressParameters: {
      format: 'FULL',
      phoneNumberRequired: true
    }
  }
};

Добавление информации о транзакции

Свойство transactionInfo содержит объект с финансовой информацией о транзакции, а именно цену и код валюты (альфа-формат ISO 4217 ), а также статус цены , который может быть либо окончательным , либо оценочным в зависимости от характера транзакции (например, , цена может меняться в зависимости от указанного адреса доставки).

В index.js внутри функции onGooglePaymentsButtonClicked() вставьте следующее:

const transactionInfo = {
  totalPriceStatus: 'FINAL',
  totalPrice: '123.45',
  currencyCode: 'USD'
};

Добавление информации о продавце

Запрос платежа принимает информацию о продавце, выполняющем запрос, в merchantInfo . В этой лаборатории кода вы сосредоточитесь на двух из них:

  • merchantId ожидает, что идентификатор будет связан с вашей учетной записью после того, как ваш сайт будет одобрен для работы в рабочей среде Google. Обратите внимание, что это не оценивается при использовании среды TEST .
  • merchantName — это видимое пользователю имя вашего сайта или организации. Это может отображаться внутри платежного листа Google Pay, чтобы предоставить пользователям больше информации о том, кто запрашивает операцию.

В index.js внутри функции onGooglePaymentsButtonClicked() вставьте следующее:

const merchantInfo = {
  // merchantId: '01234567890123456789', Only in PRODUCTION
  merchantName: 'Example Merchant Name'
};

Запрос платежной информации и обработка результата

Теперь объедините ранее определенную конфигурацию с окончательным объектом paymentDataRequest .

В index.js внутри функции onGooglePaymentsButtonClicked() вставьте следующее:

const paymentDataRequest = Object.assign({}, googlePayBaseConfiguration, {
  allowedPaymentMethods: [cardPaymentMethod],
  transactionInfo: transactionInfo,
  merchantInfo: merchantInfo   
});

На данный момент у вас есть все необходимое, чтобы запросить у Google Pay API действительную форму оплаты. Для этого используйте метод loadPaymentData в объекте PaymentsClient , передав только что определенную конфигурацию.

В index.js внутри функции onGooglePaymentsButtonClicked() вставьте следующее:

googlePayClient
  .loadPaymentData(paymentDataRequest)
  .then(function(paymentData) {
    processPayment(paymentData);
  }).catch(function(err) {
    // Log error: { statusCode: CANCELED || DEVELOPER_ERROR }
  });

Вызов метода loadPaymentData запускает представление платежного листа Google Pay. Если ошибок конфигурации нет, вы можете увидеть список допустимых способов оплаты, связанных с текущей учетной записью.

После выбора лист закрывается, и Promise выполняется с объектом PaymentData , включая соответствующую информацию о выбранном способе оплаты:

{
  "apiVersionMinor": 0,
  "apiVersion": 2,
  "paymentMethodData": {
    "description": "Visa •••• 1234",
    "tokenizationData": {
      "type": "PAYMENT_GATEWAY",
      "token": "examplePaymentMethodToken"
    },
    "type": "CARD",
    "info": {
      "cardNetwork": "VISA",
      "cardDetails": "1234",
      "billingAddress": {
        "phoneNumber": ...,
        ...
      }
    }
  }
}

Теперь вы можете использовать эту информацию о способе оплаты для выполнения фактической транзакции.

function processPayment(paymentData) {
  // TODO: Send a POST request to your processor with the payload
  // https://us-central1-devrel-payments.cloudfunctions.net/google-pay-server 
  // Sorry, this is out-of-scope for this codelab.
  return new Promise(function(resolve, reject) {
    // @todo pass payment token to your gateway to process payment
    const paymentToken = paymentData.paymentMethodData.tokenizationData.token;
    console.log('mock send token ' + paymentToken + ' to payment processor');
    setTimeout(function() {
      console.log('mock response from processor');
      alert('done');
      resolve({});
    }, 800);
  });
}

До сих пор мы рассматривали транзакции с фиксированными суммами платежей. Но предположим, что вы хотите обновить цену на основе выбора определенных свойств транзакции (например, сведений о доставке). Этого можно добиться, указав параметр paymentDataCallback при создании клиента. Этот обратный вызов используется для обработки изменений в транзакции и для соответствующего применения модификаций. Вы можете прослушивать изменения в адресе доставки, способе доставки и выбранном способе оплаты. В этом примере вы будете прослушивать изменения выбранного варианта доставки. Во-первых, определите переменные, содержащие всю информацию о доставке, и измените paymentDataRequest , чтобы включить их:

const shippingOptionParameters = {
  shippingOptions: [
    {
      id: 'shipping-001',
      label: '$1.99: Standard shipping',
      description: 'Delivered on May 15.'
    },
    {
      id: 'shipping-002',
      label: '$3.99: Expedited shipping',
      description: 'Delivered on May 12.'
    },
    {
      id: 'shipping-003',
      label: '$10: Express shipping',
      description: 'Delivered tomorrow.'
    }
  ]
};

// Shipping surcharges mapped to the IDs above.
const shippingSurcharges = {
  'shipping-001': 1.99,
  'shipping-002': 3.99,
  'shipping-003': 10
};

...

// Place inside of onGooglePaymentsButtonClicked()
paymentDataRequest.shippingAddressRequired = true;
paymentDataRequest.shippingOptionRequired = true;
paymentDataRequest.callbackIntents = ['SHIPPING_OPTION'];
paymentDataRequest.shippingOptionParameters =  shippingOptionParameters;

Затем вы модифицируете создание googlePayClient , включив в него paymentDataCallback , который вызывается всякий раз, когда в платежную операцию вносятся изменения, включенные в callbackIntents . Этот обратный вызов включает объект с измененными свойствами. Вы можете использовать эти изменения для создания обновленной платежной транзакции:

function onGooglePayLoaded() {
  googlePayClient = new google.payments.api.PaymentsClient({
    paymentDataCallbacks: { onPaymentDataChanged: paymentDataCallback },
    environment: 'TEST'
  });
  ...
}

function paymentDataCallback(callbackPayload) {

  const selectedShippingOptionId = callbackPayload.shippingOptionData.id;
  const shippingSurcharge = shippingSurcharges[selectedShippingOptionId];
  const priceWithSurcharges = 123.45 + shippingSurcharge;

  return {
    newTransactionInfo: {
      totalPriceStatus: 'FINAL',
      totalPrice: priceWithSurcharges.toFixed(2),
      totalPriceLabel: 'Total',
      currencyCode: 'USD',
      displayItems: [
        {
          label: 'Subtotal',
          type: 'SUBTOTAL',
          price: priceWithSurcharges.toFixed(2),
        },
        {
          label: 'Shipping',
          type: 'LINE_ITEM',
          price: shippingSurcharge.toFixed(2),
          status: 'FINAL'
        }]
    }
  }
};

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

Теперь, когда вы проверили, что интеграция работает должным образом, вы можете сделать еще один шаг и предварительно загрузить конфигурацию платежа, как только вы определите, что Google Pay можно использовать. Это происходит до того, как пользователь активирует (нажмет) кнопку оплаты Google Pay.

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

Этот метод ожидает тот же ввод, что и loadPaymentData . То есть вы можете использовать тот же объект paymentDataRequest , который был определен ранее. Теперь все, что вам нужно сделать, это включить вызов метода prefetch, как только вы определили, что пользователь может использовать Google Pay, после успешного возврата isReadyToPay :

googlePayClient.isReadyToPay(googlePayBaseConfiguration)
  .then(function(response) {
    if(response.result) {
      createAndAddButton();
      googlePayClient.prefetchPaymentData(paymentDataRequest);
    }
  });

Точно так же вы сократили время загрузки за счет предварительной загрузки платежных данных до того, как пользователь нажал кнопку. Улучшенная отзывчивость вашего сайта должна повысить коэффициент конверсии.

Вы успешно интегрировали Google Pay API в пример сайта в этой лаборатории кода или в свое собственное приложение.

Теперь, чтобы запустить это в производство, не забудьте взглянуть на контрольный список интеграции . После завершения и проверки вы получите идентификатор продавца для добавления в конфигурацию вашего клиента. Точно так же, если вы планируете использовать (или уже используете) сторонний платежный процессор или шлюз, ознакомьтесь со списком поддерживаемых поставщиков в Google Pay и настройте свой. Если вы интегрируетесь с Google Pay напрямую, ознакомьтесь с разделом документации по этой теме.

Что мы рассмотрели

  • Импортируйте и настройте Google API на своем сайте.
  • Определите поддержку API и отреагируйте соответствующим образом.
  • Добавьте кнопку, позволяющую пользователям платить с помощью Google Pay.
  • Загружать и обрабатывать ранее сохраненную платежную информацию пользователя.
  • Оптимизируйте время загрузки за счет предварительной загрузки платежной информации.

Следующие шаги

  • Узнайте больше о Google Pay .
  • Просмотрите контрольный список интеграции и получите идентификатор продавца.
  • Посмотрите на два разных типа интеграции и решите, что вам больше подходит: прямая интеграция или использование платежного шлюза или процессора.
  • Настройте авторизацию платежей , чтобы начать процесс оплаты и подтвердить статус авторизации платежа. (Авторизация или отклонение)

Учить больше

Вы нашли это полезным?

Очень полезно! Достаточно, чтобы оправдать ожидания. Не совсем.

Хотели бы вы, чтобы другие лаборатории кода помогли вам с другими типами интеграции (Android, прямая интеграция, API лояльности)?

Да пожалуйста, это было бы здорово! Я доволен тем, что получил.