Рубрики
Без рубрики

Интеграция Stripe с Java Spring для обработки платежей

Автор оригинала: David Landup.

Вступление

Это не ложь, что “все становится цифровым”. Многие товары никогда не попадают на полки магазинов, а продаются онлайн.

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

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

На помощь нам приходят такие сервисы, как PayPal и Stripe . Обе услуги великолепны, и у каждой есть свои плюсы и минусы. В то время как PayPal, безусловно, был более популярным, Stripe предлагает больше способов оплаты и более простые сборы, хотя для вывода средств требуется больше времени – хотя для многих это не так важно.

Что такое полоса?

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

Как и во многих других полезных сервисах, Spring предлагает поддержку интеграции API Stripe и реализации функций оплаты в ваших приложениях Spring.

Интеграция Stripe с приложением Spring Boot

Учетная запись Stripe

В первую очередь, чтобы иметь дело с API Stripe, нам нужно открыть учетную запись на Stripe .

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

Прямо на панели мониторинга вы сможете найти живые/тестовые ключи для API:

Эти ключи будут использоваться нашим приложением Spring для доступа к API. А пока давайте просто сохраним их в файле application.properties :

STRIPE_PUBLIC_KEY = pk_test_abc123
STRIPE_SECRET_KEY = sk_test_abc123

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

Применение Пружинной Загрузки

Как всегда, для нашего приложения Spring Boot мы будем использовать Spring Initializr для создания начального проекта. На данный момент нам нужны только spring-web-starter и spring-boot-starter-thymeleaf зависимости:

Поскольку зависимости stripe-java нет в списке инициализации Spring, мы добавим ее непосредственно в ваш pom.xml файл:


    com.stripe
    stripe-java
    10.12.1

Наше приложение предложит два варианта для потенциальных покупателей:

  • Одноразовая покупка : Они могут приобрести курс по злоупотреблению стеком за единовременную оплату
  • Подписка : Они могут подписаться на место в нашем списке электронной почты, куда мы отправляем еженедельные мини-курсы ( в ближайшее время в следующей статье )

Кроме того, мы будем отправлять квитанции по электронной почте нашим клиентам.

API-интерфейс Stripe

API Stripe работает простым способом. Он принимает тела запросов, закодированные в форме, и отправляет ответы, закодированные в формате JSON.

Для целей тестирования/обучения мы можем использовать его в режиме “тест” с тестовыми ключами. Эти транзакции на самом деле не будут выполнять никаких реальных транзакций.

Вы можете просмотреть их на панели управления Stripe :

С учетом настройки нашей учетной записи и наших ключей мы могли бы даже сделать запрос прямо сейчас, используя curl :

$ curl https://api.stripe.com/v1/charges \
  -u {SECRET_kEY}: \
  -d amount=999 \
  -d currency=usd \
  -d description="Example charge" \
  -d source=tok_visa

Выполнение этого приведет к ответу, закодированному в JSON:

{
  "id": "ch_1F3WU7DEYNNUvOkfbHegnPia",
  "object": "charge",
  "amount": 999,
  "amount_refunded": 0,
  "application": null,
  "application_fee": null,
  "application_fee_amount": null,
  ...
  ...
  ...
}

И если мы проверим нашу панель мониторинга, мы получим 9,99 доллара от платы:

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

Общий поток запросов на полосу выглядит примерно так:

  • Интерфейс: Интерфейс используется для отправки данных кредитной карты, закодированных в форме, в Stripe
  • Полоса: Полоса отвечает, отправляя обратно маркер в ответе
  • Интерфейс: Интерфейс взаимодействует с нашим бэкендом, предоставляя токен и сумму, необходимую для оплаты
  • Серверная часть: Использует закрытый (секретный) ключ полосы, а также токен, сумму и валюту для обработки платежа

Поэтому вполне логично, что мы начнем с интерфейса.

Интерфейс

Stripe предоставляет нам Stripe.js , их основная библиотека для построения платежных потоков. Наряду с библиотекой, он предоставляет нам Элементы полосы , которые являются предварительно встроенными элементами, используемыми для сбора конфиденциальных потребительских данных, таких как номер кредитной карты.

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

Есть несколько элементов, которые они предлагают для быстрой оплаты-сбор информации:

Stripe автоматически добавит предпочтительный элемент Stripe в ваш HTML, где вы его пометите. Например, чтобы добавить элемент карты :



Мы будем использовать checkout.js так как это очень часто используемый элемент. Это немного отличается от добавления элемента Карты:

Price:

Для краткости и простоты, это просто форма, указывающая на нашу /плату конечную точку. Не обращайте внимания на атрибуты Thymeleaf на данный момент, мы рассмотрим их в разделе контроллера.

На данный момент важно отметить, что мы просто добавляем скрипт на нашу страницу, в результате чего появится кнопка “Оплатить картой”.:

Нажав на нее, мы увидим наше окно оформления заказа:

Контроллер

С передним концом, в стороне, давайте немного сосредоточимся на задней части. Нажатие кнопки “Отправить” в окне оформления заказа отправит информацию в Stripe, которая вернет токен, необходимый нам для аутентификации. Давайте определим простой Платежный контроллер :

@Controller
public class PaymentController {
    // Reading the value from the application.properties file
    @Value("${STRIPE_PUBLIC_KEY}")
    private String stripePublicKey;

    @RequestMapping("/")
    public String home(Model model) {
        model.addAttribute("amount", 50 * 100); // In cents
        model.addAttribute("stripePublicKey", stripePublicKey);
        return "index";
    }
}

То, что мы здесь делаем, очень просто. Мы присваиваем значение STRIPE_PUBLIC_KEY строке для последующего использования и добавляем его в модель, чтобы мы могли использовать его в интерфейсе. В приведенной выше форме мы используем сумму и открытый ключ stripe для отправки запроса в Stripe, который в ответ генерирует маркер stripe для нас.

Давайте создадим конечную точку для возвращенного ответа:

@Autowired
private StripeService stripeService;

@RequestMapping(value = "/charge", method = RequestMethod.POST)
public String chargeCard(HttpServletRequest request) throws Exception {
    String token = request.getParameter("stripeToken");
    Double amount = Double.parseDouble(request.getParameter("amount"));
    stripeService.chargeNewCard(token, amount);
    return "result";
}

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

Услуга

Уровень обслуживания знакомит нас с несколькими новыми классами:

@Service
public class StripeService {

    @Value("${STRIPE_SECRET_KEY}")
    private String API_SECRET_KEY;

    @Autowired
    public StripeService() {
        Stripe.apiKey = API_SECRET_KEY;
    }

    public Charge chargeNewCard(String token, double amount) throws Exception {
        Map chargeParams = new HashMap();
        chargeParams.put("amount", (int)(amount * 100));
        chargeParams.put("currency", "USD");
        chargeParams.put("source", token);
        Charge charge = Charge.create(chargeParams);
        return charge;
    }
}

Как правило, класс обслуживания будет содержать гораздо больше методов, таких как получение клиента () , создание клиента () , списание средств с карты клиента () и т.д. Хотя сейчас и для простоты давайте просто воспользуемся этим единственным методом.

Здесь мы используем наш секретный ключ. С помощью класса Плата , предоставляемого Stripe, мы устанавливаем параметры оплаты, такие как сумма и валюта.

Сумма умножается на 100, так как Stripe имеет дело с наименьшим вариантом, когда дело доходит до валюты – в данном случае центов. Чтобы выразить это в долларах, мы умножаем их.

На этом этапе мы можем запустить приложение и протестировать его.

Запуск приложения

Запустив приложение, мы увидим нашу индексную страницу:

После нажатия на кнопку нам будет предложено открыть окно оформления заказа. Для целей тестирования вы можете использовать номер тестовой карты , например 4242 4242 4242 4242 :

После этого нас встретит страница результатов, и мы также сможем подтвердить платеж на панели мониторинга:

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

Отправка Квитанций По Электронной Почте

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

Примечание: Тестовый API будет не отправлять подтверждения/квитанции по электронной почте. Вы можете прочитать больше об этом здесь .

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

Вывод

С ростом онлайн-зависимости и платежей наиболее вероятно, что в какой-то момент вашему веб-приложению придется обрабатывать/обрабатывать некоторые платежи. Поскольку это щекотливая тема, проще и безопаснее всего позволить стороннему процессору, такому как Stripe или PayPal, обрабатывать фактическую транзакцию и выступать в качестве надежного посредника.

В этой статье мы продемонстрировали, как интегрировать API Stripe в приложение Spring Boot и как успешно списать средства с карты клиента.