Въведение в Stripe API за Java

1. Общ преглед

Stripe е услуга, базирана на облак, която позволява на бизнеса и физическите лица да получават плащания през интернет и предлага както клиентски библиотеки (JavaScript и родния мобилен), така и сървърни библиотеки (Java, Ruby, Node.js и др.).

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

В този урок ще създадем примерен проект Spring Boot, който позволява на потребителите да въведат кредитна карта и по-късно ще таксуваме картата за определена сума, използвайки Stripe API за Java.

2. Зависимости

За да използваме Stripe API за Java в проекта, добавяме съответната зависимост към нашия pom.xml :

 com.stripe stripe-java 4.2.0  

Можем да намерим най-новата му версия в хранилището на Maven Central.

За нашия примерен проект ще използваме spring-boot-starter-parent :

 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE 

Също така ще използваме Lombok, за да намалим кода на шаблона, а 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 акаунт и да получим тайни / публични Stripe API ключове .

След потвърждаване на акаунта, ние ще влезем в системата за достъп до таблото на Stripe. След това избираме „API ключове“ в лявото странично меню:

Ще има два чифта тайни / публични ключове - един за тест и един за живо. Нека оставим този раздел отворен, за да можем да използваме тези клавиши по-късно.

4. Общ поток

Зареждането на кредитната карта ще се извърши в пет прости стъпки, включващи предния край (стартиран в браузър), задния край (нашето приложение Spring Boot) и Stripe:

  1. Потребителят отива на страницата за плащане и щраква върху „Плащане с карта“.
  2. Потребителят се представя с диалогов прозорец за наслагване Stripe Checkout, където попълва данните за кредитната карта.
  3. Потребителят потвърждава с „Плащане“, което ще:
    • Изпратете кредитната карта на Stripe
    • Вземете знак в отговора, който ще бъде добавен към съществуващия формуляр
    • Изпратете този формуляр със сумата, публичния API ключ, имейл и токена в нашия back-end
  4. Нашите бек-ендове контакти Stripe с токена, сумата и секретния API ключ.
  5. Back-end проверява Stripe response и предоставя на потребителя обратна връзка за операцията.

Ще разгледаме всяка стъпка по-подробно в следващите раздели.

5. Форма за плащане

Stripe Checkout е приспособима, готова за мобилни устройства и локализируема джаджа, която изобразява формуляр за въвеждане на данни за кредитна карта. Чрез включването и конфигурирането на „ checkout.js “ той отговаря за:

  • Предаване на бутон „Плащане с карта“

  • Оказване на диалогов прозорец за наслагване на плащане (задейства се след кликване върху „Плащане с карта“)

  • Валидиране на кредитна карта
  • Функция „Запомни ме“ (свързва картата с мобилен номер)
  • Изпращане на кредитната карта на Stripe и заменянето й с токен във придружаващата форма (задейства се след щракване върху „Плащане“)

Ако трябва да упражним повече контрол върху формуляра за плащане, отколкото се предоставя от Stripe Checkout, тогава можем да използваме Stripe Elements.

След това ще анализираме контролера, който подготвя формуляра и след това самия формуляр.

5.1. Контролер

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

Първо ще трябва да копираме тестовата версия на нашия публичен ключ от таблото за управление на Stripe и да го използваме, за да дефинираме STRIPE_PUBLIC_KEY като променлива на средата. След това използваме тази стойност в полето stripePublicKey .

Тук също ръчно задаваме валута и сума (изразени в центове) само за демонстрационни цели, но в реално приложение може да зададем идентификатор на продукт / продажба, който да се използва за извличане на действителните стойности.

След това ще изпратим към изгледа за плащане, който съдържа формуляра за плащане:

@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"; } }

Regarding the Stripe API keys, you can define them as environment variables per application (test vs. live).

As is the case with any password or sensitive information, it is best to keep the secret key out of your version control system.

5.2. Form

The “Pay with Card” button and the checkout dialog are included by adding a form with a script inside, correctly configured with data attributes:

  Price:    

The “checkout.js” script automatically triggers a request to Stripe right before the submit, which then appends the Stripe token and the Stripe user email as the hidden fields “stripeToken” and “stripeEmail“.

These will be submitted to our back-end along with the other form fields. The script data attributes are not submitted.

We use Thymeleaf to render the attributes “data-key“, “data-amount“, and “data-currency“.

The amount (“data-amount“) is used only for display purposes (along with “data-currency“). Its unit is cents of the used currency, so we divide it by 100 to display it.

The Stripe public key is passed to Stripe after the user asks to pay. Do not use the secret key here, as this is sent to the browser.

6. Charge Operation

For server-side processing, we need to define the POST request handler used by the checkout form. Let's take a look at the classes we will need for the charge operation.

6.1. ChargeRequest Entity

Let's define the ChargeRequest POJO that we will use as a business entity during the charge operation:

@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. Service

Let's write a StripeService class to communicate the actual charge operation to 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 { Map chargeParams = 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); } }

As was shown in the CheckoutController, the secretKey field is populated from the STRIPE_SECRET_KEY environment variable that we copied from the Stripe dashboard.

Once the service has been initialized, this key is used in all subsequent Stripe operations.

The object returned by the Stripe library represents the charge operation and contains useful data like the operation id.

6.3. Controller

Finally, let's write the controller that will receive the POST request made by the checkout form and submit the charge to Stripe via our StripeService.

Note that the “ChargeRequest” parameter is automatically initialized with the request parameters “amount“, “stripeEmail“, and “stripeToken” included in the form:

@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"; } }

On success, we add the status, the operation id, the charge id, and the balance transaction id to the model so that we can show them later to the user (Section 7). This is done to illustrate some of the contents of the charge object.

Our ExceptionHandler will deal with exceptions of type StripeException that are thrown during the charge operation.

If we need more fine-grained error handling, we can add separate handlers for the subclasses of StripeException, such as CardException, RateLimitException, or AuthenticationException.

The “result” view renders the result of the charge operation.

7. Showing the Result

The HTML used to display the result is a basic Thymeleaf template that displays the outcome of a charge operation. The user is sent here by the ChargeController whether the charge operation was successful or not:

   Result   

Success!

Id.: Status: Charge id.: Balance transaction id.: Checkout again

При успех потребителят ще види някои подробности за операцията по зареждане:

При грешка на потребителя ще се покаже съобщението за грешка, връщано от Stripe:

8. Заключение

В този урок показахме как да използваме Stripe Java API за таксуване на кредитна карта. В бъдеще бихме могли да използваме повторно кода си от страна на сървъра, за да обслужваме собствено мобилно приложение.

За да тестваме целия поток от такси, не е нужно да използваме истинска кредитна карта (дори в тестов режим). Вместо това можем да разчитаме на тестови карти Stripe.

Операцията за зареждане е една от многото възможности, предлагани от Stripe Java API. Официалната справка за API ще ни води през целия набор от операции.

Примерен код, използван в този урок, може да бъде намерен в проекта GitHub.