Alex
Алекс

WayForPay. Оплата і обробка результату оплати на Node.js

wayforpay
Джерело: psm7.com

Вирішили приймати оплату на сайті через WayForPay, а бекенд у вас на Node.js, наприклад на Firebase Cloud Functions? Є деякі труднощі? Давайте спробуємо їх вирішити.

Приймання оплати WayForPay

У цьому дописі я не буду чіпати тему реєстрації та валідації вашого сайту у вищевказаному сервісі. Думаю, ви з цим розберетеся самі. Отже, вихідні дані:

  • сайт складається з front-end на React/Next.js тощо (у даному випадку це неважливо) і back-end на Node.js, який працює на Firebase Cloud Functions
  • тестові реквізити WayForPay

Принцип приймання і перевірки оплати складається у формуванні та обробці запитів по лінії API платіжної системи. На back-end’і ми прописуємо дві хмаринкові функції, у яких формуємо посилання на оплату та обробляємо відповідь по результатам оплати.

І тут ми стикаємося з проблемою №1: у WayForPay немає готових рішень для роботи з Node.js. А це означає, що бібліотеку потрібно буде писати самому. Згідно документації я створив просту бібліотеку, можете користуватися нею.

Оскільки повноцінної “пісочниці” у WayForPay наразі немає, можна користуватися лише даними для тестування. Тестові дані є в документації, в моєму репозиторії (посилання вище), але на всяк випадок наведу їх і тут:

Домен/аккаунт/логін - "test_merch_n1"
Секретний ключ - "flk3409refn54t54t*FNJRET"

Увага! Навіть для тестування потрібно вводити реальні дані картки для оплати. Втім, гроші хоч і спишуться, та будуть повернені протягом дня.

Отже, за допомогою моєї бібліотеки та тестових реквізитів можна отримати посилання на сторінку оплати. А що робити з цим посиланням – це вже справа ваша. Front-end, отримавши посилання, може перенаправити користувача відразу на сторінку оплати. А от, щоб зрозуміти, чи оплата вдала, чи ні – потрібно написати функцію для обробки.

Перевірка платежу

Для того, щоб розуміти, чи було оплачене замовлення, WayForPay відправляє POST-запит на URL, який вказаний у значенні ключа serviceUrl при виконанні запиту для отримання посилання на сторінку оплати. І тут ми стикаємося з проблемою №2. WayForPay надсилає запит закодований як x-www-form-urlencoded. Тому на сервер Node.js вам прийде “хтознашо” і ви звичним способом не зможете отримати потрібні вам дані, прочитавши їх як ключі request.body.

const transactionStatus = request.body.transactionStatus; // помилка, бо request.body є undefined

Чесно кажучи, я вбив багато годин на пошуки рішень цієї проблеми, але рішення виявилося настільки простим, що стало трохи соромно. Отже, ми повинні мати об’єкт відповіді, де головний ключ є transactionStatus. Щоб його отримати, слід робити так:

…
const reqBody = JSON.parse(req.rawBody);
if (reqBody.transactionStatus) {
…

Тепер ми маємо доступ до справжніх даних результату оплати і можемо на back-end`і обробляти його для взаємодії з front-end.

Висновок

Насправді, WayForPay – непогана платіжна система, але в сучасних реаліях потрібно трохи більше приділяти увагу підтримці Javascript, тому що зараз бекенди на цій мові пишуться чи не в такій же кількості, як і на PHP. Маю надію, що розробники виправляться та дадуть повноцінний SDK для Node.js і всі будуть щасливі.

Якщо вам сподобався чи став у нагоді текст, ви завжди можете віддячити! На каву

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

*
*
*