Фото від Clay Banks на Unsplash
Маєте чудовий продукт і тепер хочете, щоб ваші споживачі почали за нього платити? Це здається цілком логічним і реалістичним, але як все це реалізувати? Як зробити, щоб гроші почали надходити на ваш рахунок? Якщо ви на тому етапі, де був я, то зараз у вас напевно є безліч питань!
Ця стаття описує шлях від надання послуг до того, щоб гроші почали надходити на ваш банківський рахунок. (Якщо ви ще не є учасником, ось посилання на мій блог, де ця стаття була опублікована вперше.)
Дисклеймер: Я не отримував жодних винагород чи рекламних бонусів за написання цієї статті і не є партнером жодного сервісу, згаданого в статті!
Хто збиратиме гроші від мого імені?
Перше питання, яке я поставив собі, було саме це! Я знав, що (я створив систему обміну чеками між міжнародними банками ще в 90-х, тому, мабуть, я міг би побудувати інтеграцію з банком — а точніше з кількома банками — використовуючи PSD2 (Директива ЄС 2015/2366), але це б вимагало від мене самому виконувати безліч регуляцій і забезпечувати відповідність вимогам!
Простіший (і значно швидший) спосіб — це заплатити іншому, щоб він зробив це для мене, так само як я планую отримати гроші від моїх клієнтів за надані послуги. Це і є платіжний шлюз. Один з найбільш відомих і часто згадуваних при пошуку в Інтернеті — це Stripe. Є й інші варіанти, що коштують дешевше, але однією з причин вибору Stripe є документація API, яку вони розробили на зовсім іншому рівні! 🥳
З чого почати?
Є кілька кроків, які потрібно пройти, і я склав список для вашої зручності:
- відкрийте банківський рахунок
- зареєструйтеся в Stripe
- встановіть гем ‘stripe’
- згенеруйте платіжне посилання
- додайте маршрут для зворотного виклику
Далі я детально розгляну кожен з цих кроків і поясню, як їх виконати.
Відкрийте банківський рахунок
Це може здатися дивним, але навіть у 2025 році вам все ще необхідно мати банківський рахунок! Я багато що думаю з цього приводу, але давайте зосередимося на головному.
Вам потрібен банківський рахунок, який підтримує платежі через IBAN/SWIFT (міжнародні грошові перекази). Я працюю з Данії, тому не знаю, чи можна обійтися лише з Apple Pay в США, але так чи інакше...
Обліковий запис у Stripe
Налаштування облікового запису в Stripe досить просте. Перейдіть на stripe.com, зареєструйтесь і слідуйте зручному посібнику для налаштування (дякую, Stripe — чудова робота).
Скріншот частини посібника налаштування Stripe
Встановіть гем ‘stripe’
Це був дуже легкий крок — я просто виконав команду bundle add stripe
і майже все було готово!
Згенеруйте платіжне посилання
Десь у UI ви викликаєте створення платіжного посилання, і можете зробити його таким, як вам хочеться (для цього є багато API викликів), або зосередитись на кількох важливих параметрах, таких як продукт, ціна — і все. Після генерації ви повинні показати посилання користувачу, наприклад, через модальне вікно або email, а потім просто чекаєте на зворотний виклик 😆
Додайте маршрут для зворотного виклику
Можна сказати, що маршрут для зворотного виклику має меншу важливість у такому асинхронному робочому процесі, як цей, але насправді він має сенс, якщо ви йдете моїм шляхом!
Я використовую API для створення платіжного посилання, щоб генерувати унікальне посилання для кожного нового клієнта (користувача, який вибирає одну з платних послуг на Mortimer) і це посилання може залишатися активним (довго?) поки користувач не вирішить ним скористатися.
Таким чином, я отримую можливість робити це, зрештою/надеюсь, завжди:
class Stripe::PaymentController < ApplicationController
# Зворотний виклик Stripe після завершення оплати
# GET "/stripe/payment?ci=cstesta1M01tZueaLHFtv...Cwn5tgV61"
#
# параметр
# ui = userid
# ci = checkoutsessionid
#
def new
Current.systemuser = User.find(params["ui"])
ss = Stripe::Service.new user: Current.getuser
if ss.confirmpayment(params["ci"])
redirectto edittenanturl(Current.gettenant),
success: t("paymentsuccessfullyconfirmed")
else
redirectto edittenanturl(Current.gettenant),
warning: t("paymentnotconfirmed")
end
end
end
Готово
Це, власне, все — вам потрібно тримати все разом (я тримаю все в папці під назвою ‘services’, а всередині неї маю папку ‘stripe’ з таким класом)
class Stripe::Service < SaasService
def paymentlink url, price
Stripe.apikey = settings["apikey"]
pl = Stripe::PaymentLink.create({
lineitems: [
{
price: price.id,
quantity: 1
}
],
after_completion: {
type: "redirect",
redirect: {
url: url
}
}
})
return pl.url if pl.active
false
end
def confirmpayment checkoutsessionid
Stripe.apikey = settings["apikey"]
scs = Stripe::Checkout::Session.retrieve checkoutsessionid
if scs["paymentstatus"] == "paid"
invoice = Stripe::Invoice.retrieve scs["invoice"]
prod = Stripe::Product.retrieve(invoice
.lines.data.first.pricing.pricedetails.product)
if prod.present?
case prod.name
when /pro/; Current.gettenant.update license: 3
when /essential/; Current.gettenant.update license: 2
end
end
TenantMailer.with(tenant: Current.gettenant,
user: Current.getuser,
recipient: Current.gettenant.email,
invoicepdf: invoice.invoicepdf)
.sendinvoice.deliverlater
Current.gettenant.update licensechangedat: Time.current,
licenseexpires_at: Time.at(invoice
.lines.data.first.period.end).utc
true
else
false
end
end
end
Але це лише ілюзія 😉 — насправді всю важку роботу виконує Stripe gem!
Перекладено з: How to get paid