Вирішили приймати оплату на сайті через 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 і всі будуть щасливі.