В этом руководстве мы узнаем, как интегрировать платежный шлюз в VueJs с помощью Stripe в нашем демонстрационном приложении для электронной коммерции.

Введение

Мы создаем приложение для электронной коммерции с нуля, используя Vue.js во внешнем интерфейсе и Java со Springboot для внутреннего интерфейса. Вы можете ознакомиться с первым учебным пособием этой серии по интерфейсу здесь.



Платежный шлюз - важная функция для приложения электронной коммерции. В предыдущем руководстве мы интегрировали платежный шлюз с помощью Spring Boot и Stripe. Теперь мы создадим его внешнюю часть, такую ​​как прием товаров в тележке и данных карты.

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



Живая демонстрация

Https://infallible-swartz-b50174.netlify.app/

Вы можете найти полный код на Github.

Предварительные условия

  1. Знание Vuejs
  2. Visual Studio Code - с открытым исходным кодом (рекомендуется)
  3. Хороший браузер - (рекомендуется Chrome).

API, который мы будем использовать

getCartItems:

Это метод получения, и мы будем использовать его для хранения элементов корзины в массиве, чтобы мы могли передать его в качестве тела запроса нашему внутреннему API с помощью Axios.

checkoutList:

Это метод отправки, которому в качестве тела ответа мы передаем массив элементов корзины. Этот метод отвечает за создание идентификатора сеанса.

разместить заказ:

Это почтовый метод, и в случае успешной оплаты мы будем использовать его для добавления заказа в таблицу заказов в нашей базе данных. Итак, в качестве параметров метода публикации Axios мы передадим токен вошедшего в систему пользователя и сгенерированный идентификатор сеанса.

Структура проекта

Полоса

Stripe - один из лучших способов обработки платежей в Интернете, и недавно они выпустили Stripe Elements. Stripe Elements - это их предварительно созданная библиотека компонентов пользовательского интерфейса, которые помогут вам легко создавать свои собственные потоки оформления заказа. Теперь это упрощает, как никогда, настройку пользовательской формы оплаты для вашего приложения.

В этом уроке мы будем использовать Stripe.js для создания платежного шлюза.

В первую очередь, нам нужен собственный API-ключ Stripe test. Так что продолжайте и создайте учетную запись на полосе, а затем из панели управления получите ключ API для целей тестирования. Сохраните этот ключ в переменной среды. Сделать это:

Создайте файл в исходном каталоге с расширением .env

В этом файле создайте переменную, в которой будет храниться ключ API.

Назовите переменную VUE_APP_VARIABLENAME=YOURAPIKEY.

Ход учебника

Объявление необходимых переменных данных

Установка нашивки

Инициализация и настройка элемента Stripe

Реализовать метод получения товаров из корзины

Реализовать передачу элементов корзины в метод backend API и получение идентификатора сеанса в качестве ответа.

Навигация пользователя к успешному или неудачному платежному компоненту в соответствии со статусом платежа Stripe

А теперь давайте код

Создайте папку с именем Checkout и в этой папке создайте файл vue с именем Checkout, который будет содержать логику внешнего интерфейса для платежного шлюза.

1. создание переменных данных

stripeAPIToken: хранит ключ API

stripe: элемент полосы

Stripe Element - это набор компонентов с множеством элементов, которые вы можете использовать для создания форм оформления заказа, таких как кнопки и входы для сбора информации от пользователя. Мы сосредоточимся на карточном элементе. Элемент карты позволяет собирать информацию о карте в одном элементе. Он включает в себя динамически обновляемый значок бренда карты, а также поля для ввода электронной почты, срока действия, CVV, названия страны, имени держателя карты.

token: хранит токен пользователя

sessionId: сохраняет сгенерированный идентификатор сеанса полосой

checkoutBodyArray: тело ответа, которое мы отправим нашему внутреннему API

2. Установка Stripe

Элемент Stripe является частью Stripe.js, поэтому нам нужно включить скрипт с помощью includeStripe method (который мы реализуем далее), которому мы передаем URL-адрес источника скрипта, и поскольку includeStripe является функцией обратного вызова, мы вызываем configureStripe method, который мы реализуем заранее. Итак, когда мы назовем этот includeStripe метод? Когда компонент визуализируется в это время, мы инициализируем этот метод.

т.е. в mounted method мы вызываем эту функцию.

Мы связываем это, чтобы у нас был доступ к методам локального компонента внутри обратного вызова, и мы вызываем configureStripe после того, как все было загружено. Мы еще не реализовали это, но это дальше! Это наш метод обратного вызова, который настроит Stripe локально внутри компонента.

Кроме того, эта checkout страница будет отображаться, когда пользователь нажимает кнопку подтверждения заказа на странице корзины. Если хотите взглянуть, то можете обратиться к этому. Поэтому, когда пользователь нажимает кнопку подтверждения порядка, мы вызываем метод checkout в cart component, в котором мы перемещаем пользователя к Checkout component, используя метод маршрутизатора. И этому методу маршрутизатора мы передаем params id как размер корзины (количество товаров в корзине).

checkout(){ 
this.$router.push({ name: ‘Checkout’,params:{id:this.len}}) 
}
//from the Cart.vue

Теперь почему мы передаем идентификатор параметров?

Мы передаем идентификатор, чтобы проверить, вызывается ли checkout page тогда и только тогда, когда пользователь нажимает confirm order button. Предположим, пользователь находится на какой-либо другой странице, например, на странице продуктов, и оттуда он переходит на страницу оформления заказа, явно указав в URL-адресе, пользователь не сможет это сделать, потому что тогда идентификатор по умолчанию будет передан как undefined. И в mounted method Checkout компонента мы сначала проверяем, что если идентификатор имеет допустимый тип данных (в данном случае это должна быть строка, поскольку мы передаем идентификатор в качестве параметров в методе маршрутизатора компонента Cart), тогда только мы визуализируем Checkout component .

Если идентификатор не определен, т.е. пользователь пытается перейти на checkout page, не подтверждая порядок, он будет перенаправлен на Home page. Кроме того, если корзина пуста, кнопка подтверждения заказа отключена, но также, если пользователь пытается перейти на checkout page, явно указав в URL-адресе, пользователь все равно будет перемещен на Home page, потому что в этом случае идентификатор также передается в Checkout component будет неопределенным.

Таким образом, идентификатор params (размер корзины) передается от компонента Cart, чтобы просто подтвердить, переходит ли пользователь к Checkout component, подтверждая заказ.

3.Инициализация и настройка элемента Stripe

Включить Stripe.js динамически

3.1 includeStripe:

Он создаст тег скрипта, загрузит наш javascript-файл Stripe и добавит его в заголовок нашего приложения. Этот метод принимает 2 параметра: URL-адрес файла, который мы загружаем динамически, который будет файлом Stripe JS, и функцию обратного вызова, которая будет запускаться при загрузке файла.

Теперь, когда мы правильно загрузили файл, мы выполним обратный вызов, и Stripe будет настроен.

Настроить элемент полосы

3.2 configureStripe:

Помните, что в mounted method мы вызвали метод includeStripe, а затем в качестве функции обратного вызова мы вызвали метод configureStripe, который отвечает за создание объекта Stripe для конкретного сеанса оплаты.

stripe, который мы объявили ранее как переменная данных, будет содержать локальный экземпляр объекта Stripe, который находится в загруженном нами Stripe JS API.

4.Выполнить метод получения товаров из корзины.

Во-первых, нам нужно сохранить элементы корзины в массиве, который мы объявили как переменную данных с именем checkoutBodyArray.

Итак, как мы хотим хранить элементы корзины в переменной данных?

Поскольку API сообщений, который мы реализовали в предыдущем руководстве, требует список элементов корзины в качестве тела запроса, мы сохраняем элементы корзины в checkoutBodyArray.

Получение товаров из корзины

Мы реализуем метод getAllItems, который вызывает метод get API / cart, который возвращает товары в корзине в качестве ответа. Таким образом, мы сохраняем этот ответ в checkoutBodyArray и передаем этот массив в качестве тела запроса в API серверной части оформления заказа.

Мы вызываем getAllItems method в смонтированном методе, поскольку мы хотим получить элементы корзины при визуализации компонента Checkout. Поэтому вызовите этот метод в установленном нами ранее методе.

5.Выполнить передачу элементов корзины в метод API серверной части.

Передача элементов корзины в API серверной части

Теперь, когда у нас есть элементы корзины в checkoutBodyArray, нам нужно передать это методу post. Итак, мы реализуем функцию goToCheckout, которая вызывает сообщение Axios. После передачи массива элементов корзины в API серверной части мы получаем в качестве ответа идентификатор сеанса.

Таким образом, мы сохраняем идентификатор сеанса в локальном хранилище, а затем вызываем redirectToCheckout метод Stripe, в котором мы сохраняем идентификатор сеанса, который мы получили из данных ответа в нашем sessionId, который перенаправит пользователя на страницу, размещенную в Stripe, для безопасного сбора платежей. Информация. Когда пользователь совершает покупку, он перенаправляется обратно на наш веб-сайт.

Так выглядит страница оформления заказа Stripe

6. Перемещение пользователя к успешному или неудачному платежному компоненту в соответствии со статусом платежа Stripe.

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

Так где же обрабатывается результат платежа? Мы не определяли его здесь, во внешнем интерфейсе, поэтому, если вы помните, в предыдущем руководстве по бэкэнду (точнее, в классе OrderService) мы определили, что было установлено success URL и failure URL , как показано ниже.

SessionCreateParams params = SessionCreateParams.builder()
        .addPaymentMethodType(SessionCreateParams.PaymentMethodType.CARD)
        .setMode(SessionCreateParams.Mode.PAYMENT)
        .setCancelUrl(failedURL)
        .addAllLineItem(sessionItemsList)
        .setSuccessUrl(successURL)
        .build();

И failedURL и successURL были определены как

String successURL = baseURL + "payment/success";
String failedURL = baseURL + "payment/failed";

а baseURL был URL-адресом внешнего интерфейса Vuejs, над которым мы работаем.

Навигация пользователя к успешному или неудачному платежному компоненту в соответствии со статусом платежа Stripe

Во-первых, нам нужно создать папку в исходном каталоге с именем helper , и в этой папке мы создадим другую папку с именем payment. В этой папке создайте два компонента vue Failed.vue и Success.vue.

Компонент успешного платежа

Таким образом, в компоненте «Успех» мы создаем токен переменных данных и идентификатор сеанса и определяем метод для сохранения текущего порядка в нашей базе данных.

Итак, в saveOrder method мы используем backend API / order / add

который мы обсудим в следующем руководстве.

Чтобы получить представление о том, что делает API, обратитесь к описанию API выше:

В случае успеха мы перенаправляем пользователя в компонент истории заказов, где видны текущие и старые заказы.

Компонент сбоя платежа

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

Поздравляем !!!

Вы успешно реализовали интерфейсную часть платежного шлюза с помощью Vuejs и Stripe. Вы можете найти полный код на Github.