Перейти до основного вмісту

Фіктивний платіжний шлюз для тестування: Фіктивний провайдер Casdoor, тестовий режим Stripe та пісочниця PayPal

· Читання за 9 хв
Yang Luo
Casdoor Maintainer

Фіктивний платіжний шлюз — це платіжний провайдер, який приймає кожне оформлення замовлення як оплачене без звернення до банку чи платіжної мережі, що дозволяє тестувати замовлення, підписки та виконання зобов'язань без реальних грошей та рахунку у шлюзі. Casdoor поставляється з таким провайдером: Фіктивний платіжний провайдер. Додайте його до продукту, купіть продукт, і Casdoor запише платіж та замовлення як Paid, запустить підписку та створить транзакцію, все це не залишаючи ваш сервер. Використовуйте Dummy у розробці та переходьте на пісочницю вендора (тестовий режим Stripe, пісочниця PayPal, пісочниця Paddle) на етапі staging, де також потрібні відхилені картки, 3-D Secure та реальні редіректи.

Dummy, Balance та пісочниці вендорів оглядово​

ПровайдерТестове середовищеЯк Casdoor вибирає тестове або робоче середовищеТип провайдера Casdoor
DummyНе потрібно, кожен платіж успішнийЗавжди симулюєтьсяDummy
BalanceВнутрішній, поповнюється через продукт rechargeЗавжди внутрішнійBalance
StripeПісочниця з ключами sk_test_ / pk_test_Залежно від введених вами ключівStripe
PayPalДодатки та акаунти пісочниціЯкщо runmode не дорівнює prod, використовується пісочницяPayPal
PaddleОкремий акаунт пісочниці на sandbox-vendors.paddle.comЯкщо runmode не дорівнює prod, використовується sandbox-api.paddle.comPaddle
AdyenТестове середовище (checkout-test.adyen.com)Якщо runmode не дорівнює prod, використовується тестове середовищеAdyen
AirWallexSeparate sandbox accountrunmode other than prod calls api.sandbox.airwallex.comAirWallex
Lemon SqueezyТестовий режим магазину з тестовими API-ключамиЗалежно від введеного вами API-ключаLemon Squeezy
FastSpringТестовий магазин з .test. у хостіЗалежно від введеного вами HostFastSpring
PolarSandbox at sandbox.polar.shSet the provider's Host to https://sandbox-api.polar.shPolar

runmode — це опція у conf/app.conf (або змінна оточення runmode), описана у довіднику конфігурації. Його значення за замовчуванням — dev, тому свіжий інстанс Casdoor спілкується з пісочницями PayPal, Paddle, Adyen та AirWallex, поки ви не встановите prod.

Що означає фіктивна транзакція​

Фіктивна транзакція проходить через ті самі записи, що й реальна покупка (замовлення, платіж, підписка, запис у бухгалтерії), але не рухає гроші. Це відрізняється від транзакції у пісочниці. Пісочниця все одно викликає API вендора, показує сторінку оформлення замовлення вендора та надсилає вебхуки; лише гроші є фальшивими. Фіктивна транзакція ніколи не залишає вашу систему.

Ця різниця визначає, що саме можна тестувати. Фіктивний шлюз добре підходить для вашої власної логіки: чи надає план правильну роль, чи з'являється замовлення, чи купон рахується використаним, чи потрапляє користувач на правильну сторінку. Пісочниця добре підходить для інтеграції: облікові дані, редіректи, відхилення карток, виклики автентифікації та доставка вебхуків. Вам потрібні обидва варіанти, на різних етапах.

Як працює фіктивний провайдер Casdoor​

Провайдер Dummy не має налаштувань і сторінки оплати. Ось повний потік у Casdoor master:

  1. Коли користувач платить, виклик Pay провайдера повертає сторінку результату Casdoor як URL оплати. Він упаковує ціну та валюту в ID замовлення замість створення чогось у постачальника.
  2. Casdoor зберігає платіж у стані Created і одразу перенаправляє браузер на сторінку результату. Немає форми введення картки, ні справжньої, ні фіктивної.
  3. Сторінка результату бачить платіж у стані Created і приблизно через секунду викликає POST /api/notify-payment.
  4. Виклик Notify провайдера завжди відповідає Paid, використовуючи раніше упаковану ціну, тому перевірка ціни проходить успішно.
  5. Потім Casdoor виконує стандартний шлях успіху: платіж і замовлення переходять у стан Paid, оновлюються підписки, створені для цього платежу, записується транзакція Purchase, залишок товару зменшується, а купон у замовленні позначається як використаний. Якщо це товар для поповнення балансу, транзакція Recharge також додає суму до балансу користувача.

Отже, так, Dummy відразу позначає замовлення як оплачене, і користувач бачить сторінку успіху без проміжних кроків.

З цього випливають два обмеження. Dummy не може завершитися помилкою: немає способу змусити його повернути Canceled, Timeout або Error, тому для тестування сценаріїв невдачі потрібна пісочниця. І Dummy не може продовжувати підписку: Casdoor дозволяє автоматичне продовження лише для Balance і Stripe, тому підписка, куплена через Dummy, завжди матиме вимкнене автоматичне продовження.

У новій базі даних Casdoor створює вбудований провайдер Dummy з ім'ям provider_payment_dummy в організації admin, поряд із вбудованим провайдером Balance. Ви також можете додати свій власний: у Identity > Providers встановіть Category у значення Payment, а Type — у Dummy.

Не використовуйте Dummy у продакшені​

/api/notify-payment is open to anonymous callers, because real gateways call it without a Casdoor session. For a real provider that is safe, since Notify checks the payment with the vendor. Dummy checks nothing and reports Paid, so for a Dummy payment Casdoor only accepts the call from the payment's own user or an admin of its organization. That still leaves the main risk: any product that lists Dummy in its Payment providers shows it at checkout, and any signed-in user who picks it gets the product for free. Remove Dummy from every product before you go live, and do not put it on products in an organization that real users can reach.

Balance: внутрішній гаманець, який можна поповнити через Dummy​

Провайдер Balance дозволяє користувачам платити з балансу свого облікового запису. Casdoor спочатку перевіряє баланс, списує ціну та переводить платіж і замовлення в стан Paid в одному запиті. Balance — це реальна функція для продакшену, а не інструмент тестування, але вона добре поєднується з Dummy: додайте Dummy до продукту для поповнення, «поповніть» тестового користувача, і баланс буде зараховано без фактичних грошей.

Це важливо для підписок, оскільки Balance є одним із двох провайдерів, які підтримують автоматичне продовження. Використовуючи Dummy разом із Balance, ви можете протестувати весь цикл продовження на ноутбуці без облікового запису платіжного шлюзу.

Пісочниці постачальників для стадінгу​

Stripe. Stripe розділяє тестові та робочі дані за допомогою ключів: ключі пісочниці починаються з pk_test_ та sk_test_, робочі ключі — з pk_live_ та sk_live_, а об'єкти в одному режимі невидимі в іншому. Casdoor використовує ті ключі, які ви вказали у провайдері Stripe; runmode нічого не змінює для Stripe. Тестові картки Stripe покривають сценарії, недоступні для Dummy: 4242 4242 4242 4242 успішна оплата, 4000 0000 0000 0002 відхилено, а 4000 0000 0000 3220 вимагає 3-D Secure. Використовуйте будь-який майбутній термін дії та будь-який CVC. Умови використання Stripe забороняють тестування в робочому режимі з реальними даними карток.

PayPal. Пісочниця PayPal — це окреме середовище зі своїми додатками та тестовими обліковими записами. PayPal створює типовий особистий і типовий бізнес-обліковий запис у пісочниці при першому вході до панелі розробника; ви платите з особистого. Створіть додаток у режимі пісочниці, вставте його облікові дані у провайдер PayPal і залиште runmode на рівні dev.

Paddle. Пісочниця — це окремий обліковий запис на sandbox-vendors.paddle.com зі своїми ключами та продуктами; нічого не спільного з робочим середовищем. Тестові карти Paddle включають 4242 4242 4242 4242 (успіх) та 4000 0000 0000 0002 (відмова).

Lemon Squeezy has a test mode per store, and API keys created in test mode only see test data. FastSpring test orders go through a test storefront: insert .test. into the store host, for example yourstore.test.onfastspring.com, and enter that as the provider's Host. Polar has a sandbox with its own tokens; set the provider's Host to https://sandbox-api.polar.sh to use it, and leave Host empty for live Polar. Alipay in Casdoor is also hard-wired to production.

План тестування для продуктів, тарифних планів і підписок Casdoor​

Розробка з використанням Dummy​

  1. Створіть продукт і додайте Dummy до його Payment providers.
  2. Створіть тарифний план для цього продукту та сторінку цін, де він перелічений (див. огляд цін).
  3. Як тестовий користувач, відкрийте сторінку цін і купіть тарифний план. Перевірте, що платіж і замовлення мають статус Paid, підписка — Active, а на користувачі з'явилася транзакція Purchase.
  4. Увійдіть як користувач і перевірте, чи роль тарифного плану почала діяти у вашому додатку.
  5. Якщо в тарифному плані увімкнено Is exclusive, купіть його ще раз і очікуйте помилку про те, що користувач уже має активну підписку.
  6. Застосуйте купон при оформленні замовлення та перевірте, що його використання зафіксовано.
  7. Створіть продукт для поповнення балансу з Dummy, поповніть тестового користувача, а потім купіть тарифний план через Balance з увімкненим Auto renew.
  8. Щоб протестувати продовження, не чекаючи місяця, відредагуйте поле End time підписки на її сторінці редагування так, щоб вона закінчувалася протягом 24 годин. Casdoor перевіряє підписки щогодини; очікуйте статус Renewal state Renewed і нову підписку на наступний період. Потім купіть тарифний план знову, маючи недостатньо низький баланс для наступного періоду, аналогічно змістіть час закінчення і очікуйте статус Failed з причиною у полі Renewal message. Документація про підписки описує точні правила.

Стадінг з використанням пісочниці​

  1. Запустіть середовище staging з runmode = dev та використовуйте лише пісочниці або тестові облікові дані.
  2. Замініть Dummy на провайдера, який ви будете використовувати в продакшені, налаштований із його ключами для пісочниці.
  3. Повторіть покупку та перевірте, що браузер переходить до чекаута постачальника і повертається на сторінку результатів Casdoor.
  4. Для Stripe сплатіть один раз картою, яка відхиляється, і один раз картою з 3-D Secure, перевіривши стани платежу та замовлення для кожного випадку.
  5. Якщо у Stripe увімкнено Auto renew, Casdoor зберігає картку під час оформлення замовлення та сам списує кошти при поновленні, тому трюк із закінченням терміну дії, описаний вище, працює і в пісочниці.

Перехід у продакшн​

Видаліть Dummy з усіх продуктів, встановіть runmode = prod, якщо ви використовуєте PayPal, Paddle, Adyen або AirWallex, та замініть ключі на бойові. Перевірте записи про платежі перших реальних замовлень.

Якщо ви також тестуєте електронну пошту для реєстрації в тому ж середовищі, локальний перехоплювач пошти збереже ці повідомлення від надходження на реальні поштові скриньки; див. MailHog vs Mailpit.

Посилання​