1. Обзор
Stripe -это облачный сервис, который позволяет компаниям и частным лицам получать платежи через Интернет и предлагает как клиентские библиотеки (JavaScript и native mobile), так и серверные библиотеки (Java, Ruby, Node.js и т.д.).
Stripe обеспечивает уровень абстракции, который снижает сложность получения платежей. В результате нам не нужно напрямую обрабатывать данные кредитной карты – вместо этого мы имеем дело с токеном, символизирующим разрешение на списание .
В этом уроке мы создадим пример проекта Spring Boot, который позволит пользователям вводить кредитную карту, а затем взимать с нее определенную сумму с помощью API Stripe для Java .
2. Зависимости
Чтобы использовать API Stripe для Java в проекте, мы добавим соответствующую зависимость в ваш pom.xml :
com.stripe stripe-java 4.2.0
Мы можем найти его последнюю версию в центральном репозитории Maven .
Для нашего примера проекта мы будем использовать spring-boot-starter-parent :
org.springframework.boot spring-boot-starter-parent 2.4.0
Мы также будем использовать Ломбок для сокращения шаблонного кода, а Thymeleaf станет шаблоном для доставки динамических веб-страниц.
Поскольку мы используем spring-boot-starter-parent для управления версиями этих библиотек, нам не нужно включать их версии в pom.xml :
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf org.projectlombok lombok
Обратите внимание, что если вы используете NetBeans, вы можете явно использовать Lombok с версией 1.16.16 , так как ошибка в версии Lombok, поставляемой с Spring Boot 1.5.2, приводит к тому, что NetBeans генерирует много ошибок.
3. Ключи API
Прежде чем мы сможем связаться с Stripe и выполнить платежи по кредитной карте, нам необходимо зарегистрировать учетную запись Stripe и получить секретные/открытые ключи API Stripe .
После подтверждения учетной записи мы войдем в систему, чтобы получить доступ к панели мониторинга Stripe . Затем мы выбираем “Ключи API” в левом боковом меню:
Там будет две пары секретных/открытых ключей — один для теста и один для живого . Давайте оставим эту вкладку открытой, чтобы мы могли использовать эти ключи позже.
4. Общий поток
Списание средств с кредитной карты будет осуществляться в пять простых шагов, включая интерфейс (запуск в браузере), серверную часть (наше приложение Spring Boot) и полосу:
- Пользователь переходит на страницу оформления заказа и нажимает кнопку “Оплатить картой”.
- Пользователю открывается диалоговое окно “Наложение проверки”, в котором заполняются данные кредитной карты.
- Пользователь подтверждает с помощью “Оплатить <сумма>”, что будет:
- Отправьте кредитную карту в Stripe
- Получите маркер в ответе, который будет добавлен в существующую форму
- Отправьте эту форму с суммой, открытым ключом API, электронной почтой и токеном на наш сервер
- Наш сервер связывается с Stripe с токеном, суммой и секретным ключом API.
- Серверная часть проверяет реакцию полосы и предоставляет пользователю обратную связь об операции.
Мы рассмотрим каждый шаг более подробно в следующих разделах.
5. Форма оформления заказа
Stripe Checkout – это настраиваемый, готовый для мобильных устройств и локализуемый виджет , который отображает форму для ввода данных кредитной карты. Посредством включения и настройки “ checkout.js “, он отвечает за:
- Рендеринг кнопки “Оплатить картой”
- Отображение диалогового окна наложения платежей (запускается после нажатия кнопки “Оплатить картой”)
- Проверка кредитной карты
- Функция “Запомни меня” (связывает карту с номером мобильного телефона)
- Отправка кредитной карты в Stripe и замена ее токеном в прилагаемой форме (срабатывает после нажатия кнопки “Оплатить <сумма>”)
Если нам нужно осуществлять больший контроль над формой оформления заказа, чем это предусмотрено Stripe Checkout, мы можем использовать Если нам нужно осуществлять больший контроль над формой оформления заказа, чем это предусмотрено Stripe Checkout, мы можем использовать .
Далее мы проанализируем контроллер, который готовит форму, а затем саму форму.
5.1. Контроллер
Давайте начнем с создания контроллера, чтобы подготовить модель с необходимой информацией, необходимой для формы оформления заказа|/.
Во-первых, нам нужно скопировать тестовую версию нашего открытого ключа с панели мониторинга Stripe и использовать ее для определения STRIPE_PUBLIC_KEY в качестве переменной среды. Затем мы используем это значение в поле stripe Public Key .
Мы также устанавливаем валюту и сумму (выраженную в центах) вручную здесь только для демонстрационных целей, но в реальном приложении мы можем установить идентификатор продукта/продажи, который можно использовать для получения фактических значений.
Затем мы отправимся в представление оформления заказа, в котором находится форма оформления заказа:
@Controller public class CheckoutController { @Value("${STRIPE_PUBLIC_KEY}") private String stripePublicKey; @RequestMapping("/checkout") public String checkout(Model model) { model.addAttribute("amount", 50 * 100); // in cents model.addAttribute("stripePublicKey", stripePublicKey); model.addAttribute("currency", ChargeRequest.Currency.EUR); return "checkout"; } }
Что касается ключей API Stripe, вы можете определить их как переменные среды для каждого приложения (тест или live).
Как и в случае с любым паролем или конфиденциальной информацией, лучше всего хранить секретный ключ вне вашей системы контроля версий.
5.2. Форма
Кнопка “Оплатить картой” и диалоговое окно оформления заказа включаются путем добавления формы со скриптом внутри, правильно настроенным с атрибутами данных:
В ” checkout.js “скрипт автоматически запускает запрос на Stripe прямо перед отправкой, который затем добавляет маркер Stripe и электронное письмо пользователя Stripe в качестве скрытых полей” stripeToken ” и ” stripeEmail “.
Они будут отправлены в наш сервер вместе с другими полями формы. Атрибуты данных скрипта не передаются.
Мы используем Thymeleaf для отображения атрибутов ” ключ данных “, ” объем данных ” и ” валюта данных “.
Сумма (” data-amount “) используется только для целей отображения (наряду с ” data-currency “). Его единица измерения-центы используемой валюты, поэтому мы делим ее на 100, чтобы отобразить ее.
Открытый ключ Stripe передается Stripe после того, как пользователь попросит оплатить. Не используйте здесь секретный ключ, так как он отправляется в браузер.
6. Операция Зарядки
Для обработки на стороне сервера нам необходимо определить обработчик запроса POST, используемый формой оформления заказа. Давайте взглянем на классы, которые нам понадобятся для операции зарядки.
6.1. Субъект запроса на взимание платы
Давайте определим запрос Charge POJO, который мы будем использовать в качестве бизнес-объекта во время операции charge:
@Data public class ChargeRequest { public enum Currency { EUR, USD; } private String description; private int amount; private Currency currency; private String stripeEmail; private String stripeToken; }
6.2. Обслуживание
Давайте напишем Stripe Service class, чтобы сообщить фактическую операцию зарядки Stripe :
@Service public class StripeService { @Value("${STRIPE_SECRET_KEY}") private String secretKey; @PostConstruct public void init() { Stripe.apiKey = secretKey; } public Charge charge(ChargeRequest chargeRequest) throws AuthenticationException, InvalidRequestException, APIConnectionException, CardException, APIException { MapchargeParams = new HashMap<>(); chargeParams.put("amount", chargeRequest.getAmount()); chargeParams.put("currency", chargeRequest.getCurrency()); chargeParams.put("description", chargeRequest.getDescription()); chargeParams.put("source", chargeRequest.getStripeToken()); return Charge.create(chargeParams); } }
Как было показано в CheckoutController , поле секретный ключ заполняется из переменной среды STRIPE_SECRET_KEY, которую мы скопировали с панели мониторинга Stripe .
После инициализации службы этот ключ используется во всех последующих операциях Stripe.
Объект, возвращаемый библиотекой Stripe, представляет операцию charge и содержит полезные данные, такие как идентификатор операции.
6.3. Контроллер
Наконец, давайте напишем контроллер, который получит запрос POST, сделанный в форме оформления заказа, и отправим плату в Stripe через наш StripeService .
Обратите внимание, что параметр ” Запрос на оплату “автоматически инициализируется с параметрами запроса” сумма “, ” stripeEmail ” и ” stripeToken “, включенными в форму:
@Controller public class ChargeController { @Autowired private StripeService paymentsService; @PostMapping("/charge") public String charge(ChargeRequest chargeRequest, Model model) throws StripeException { chargeRequest.setDescription("Example charge"); chargeRequest.setCurrency(Currency.EUR); Charge charge = paymentsService.charge(chargeRequest); model.addAttribute("id", charge.getId()); model.addAttribute("status", charge.getStatus()); model.addAttribute("chargeId", charge.getId()); model.addAttribute("balance_transaction", charge.getBalanceTransaction()); return "result"; } @ExceptionHandler(StripeException.class) public String handleError(Model model, StripeException ex) { model.addAttribute("error", ex.getMessage()); return "result"; } }
В случае успеха мы добавляем статус, идентификатор операции, идентификатор начисления и идентификатор транзакции баланса в модель, чтобы позже показать их пользователю (Раздел 7). Это делается для того, чтобы проиллюстрировать часть содержимого объекта charge .
Наш обработчик исключений будет иметь дело с исключениями типа StripeException , которые возникают во время операции зарядки.
Если нам нужна более детальная обработка ошибок, мы можем добавить отдельные обработчики для подклассов StripeException , таких как CardException , RateLimitException или AuthenticationException .
Представление ” результат ” отображает результат операции зарядки.
7. Отображение результата
HTML, используемый для отображения результата, является базовым шаблоном Thymeleaf, который отображает результат операции зарядки. Пользователь отправляется сюда Контроллером заряда независимо от того, была ли операция зарядки успешной или нет:
Result Success!
Id.: Checkout again
При успешном выполнении пользователь увидит некоторые детали операции зарядки:
При ошибке пользователю будет представлено сообщение об ошибке, возвращенное Stripe:
8. Заключение
В этом уроке мы показали, как использовать API Java Stripe для списания средств с кредитной карты. В будущем мы могли бы повторно использовать наш серверный код для обслуживания собственного мобильного приложения.
Чтобы проверить весь поток платежей, нам не нужно использовать настоящую кредитную карту (даже в тестовом режиме). Вместо этого мы можем положиться на Карты тестирования полос .
Операция зарядки является одной из многих возможностей, предлагаемых API Java Stripe. Официальная ссылка на API проведет нас через весь набор операций.
Пример кода, используемого в этом руководстве, можно найти в проекте GitHub .