billing in saas applications on rails
DESCRIPTION
TRANSCRIPT
21 сентября 2013 годаАлександров Игорь
Биллинг в SaaS-системах на Rails
http://www.jetrockets.ru
Как организовать биллинг для SaaS-приложения?
Как организовать биллинг для SaaS-приложения?
• Арендовать биллинг
Как организовать биллинг для SaaS-приложения?
• Арендовать биллинг
• Написать самим
PCI Сompliance
PCI Сompliance
https://www.pcisecuritystandards.org/Набор требований для организаций, сервиса и оборудования, которое работает с платёжными данными пользователей.
PCI Сompliance
https://www.pcisecuritystandards.org/Набор требований для организаций, сервиса и оборудования, которое работает с платёжными данными пользователей.
3 стандарта:
• Data Security Standard (PCI DSS),
• Payment Application Data Security Standard (PA-DSS)
• PIN Transaction Security (PTS)
PCI Сompliance
https://www.pcisecuritystandards.org/Набор требований для организаций, сервиса и оборудования, которое работает с платёжными данными пользователей.
3 стандарта:
• Data Security Standard (PCI DSS),
• Payment Application Data Security Standard (PA-DSS)
• PIN Transaction Security (PTS)
Scanning Vendors (> 130 компаний)• https://www.securitymetrics.com
Аренда биллинга у другого SaaS-приложения
Аренда биллинга у другого SaaS-приложения
Аренда биллинга: плюсы
Скорость внедрения
Аренда биллинга: плюсы
Скорость внедрения
Наличие API и библиотек (Ruby)
Аренда биллинга: плюсы
Скорость внедрения
Наличие API и библиотек (Ruby)
“Проверенная работоспособность”
Аренда биллинга: плюсы
Скорость внедрения
Наличие API и библиотек (Ruby)
“Проверенная работоспособность”
Ослабленные требования PCI Compliance
Аренда биллинга: плюсы
Аренда биллинга: минусы
Сложность внесения изменений
Аренда биллинга: минусы
Сложность внесения изменений
Зависимость от внешнего сервиса
Аренда биллинга: минусы
Сложность внесения изменений
Зависимость от внешнего сервиса
Сложность в использовании нескольких вариантов
платежей
Аренда биллинга: минусы
Сложность внесения изменений
Зависимость от внешнего сервиса
Сложность в использовании нескольких вариантов
платежей
Постоплатный биллинг
Аренда биллинга: минусы
Разработка биллинга: плюсы
Различные варианты оплаты
Разработка биллинга: плюсы
Различные варианты оплаты
Любая логика работы подписки
Разработка биллинга: плюсы
Различные варианты оплаты
Любая логика работы подписки
Централизация данных
Разработка биллинга: плюсы
Различные варианты оплаты
Любая логика работы подписки
Централизация данных
Слабая зависимость от сторонних сервисов
Разработка биллинга: плюсы
Разработка биллинга: минусы
Страшно!
Разработка биллинга: минусы
Страшно!
Заказчик боится
Разработка биллинга: минусы
Страшно!
Заказчик боится
Долгая разработка и тестирование
Разработка биллинга: минусы
Страшно!
Заказчик боится
Долгая разработка и тестирование
Полное соблюдение правил PCI Compliance
Разработка биллинга: минусы
https://github.com/igor-alexandrov/spaceship
SpaceShip
SpaceShip• Тарифный план
• Подписка
• Процесс биллинга
• Биллинговый интервал
• Инвойс
• Оплата и транзакции
• Хранение кредитных карт
Тарифный планapp/models/billing/plan.rb
Тарифный план
app/models/billing/plan.rb
Тарифный план
• Стоимости услуг за единицу времени
app/models/billing/plan.rb
Тарифный план
• Стоимости услуг за единицу времени– месячная стоимость
app/models/billing/plan.rb
Тарифный план
• Стоимости услуг за единицу времени– месячная стоимость– годовая стоимость
app/models/billing/plan.rb
Тарифный план
• Стоимости услуг за единицу времени– месячная стоимость– годовая стоимость– квартальная стоимость
app/models/billing/plan.rb
Тарифный план
• Стоимости услуг за единицу времени– месячная стоимость– годовая стоимость– квартальная стоимость– …
app/models/billing/plan.rb
Тарифный план
• Стоимости услуг за единицу времени– месячная стоимость– годовая стоимость– квартальная стоимость– …
• Набор ресурсов, который может быть доступен пользователю
app/models/billing/plan.rb
Тарифный план
• Стоимости услуг за единицу времени– месячная стоимость– годовая стоимость– квартальная стоимость– …
• Набор ресурсов, который может быть доступен пользователю
• Длительность (наличие) триального периода
app/models/billing/plan.rb
Подпискаapp/models/billing/subscriptions/base.rb
Подпискаapp/models/billing/subscriptions/base.rb
Подписка
• Пользователь
app/models/billing/subscriptions/base.rb
Подписка
• Пользователь• Тарифный план
app/models/billing/subscriptions/base.rb
Подписка
• Пользователь• Тарифный план• Биллинговый интервал
app/models/billing/subscriptions/base.rb
Подписка
• Пользователь• Тарифный план• Биллинговый интервал
• Выбранные параметры
app/models/billing/subscriptions/base.rb
Подписка
• Пользователь• Тарифный план• Биллинговый интервал
• Выбранные параметры– максимальное число пользователей, товаров, места на диске…
app/models/billing/subscriptions/base.rb
Подписка
• Пользователь• Тарифный план• Биллинговый интервал
• Выбранные параметры– максимальное число пользователей, товаров, места на диске…
• Набор дополнительных сервисов (тарифицируются отдельно)
app/models/billing/subscriptions/base.rb
Подписка
• Пользователь• Тарифный план• Биллинговый интервал
• Выбранные параметры– максимальное число пользователей, товаров, места на диске…
• Набор дополнительных сервисов (тарифицируются отдельно)– интеграция с внешним источником данных
app/models/billing/subscriptions/base.rb
Подписка
• Пользователь• Тарифный план• Биллинговый интервал
• Выбранные параметры– максимальное число пользователей, товаров, места на диске…
• Набор дополнительных сервисов (тарифицируются отдельно)– интеграция с внешним источником данных– дополнителные услуги, входящие в более премиальные планы
app/models/billing/subscriptions/base.rb
Подписка (стоимость)
app/models/billing/subscriptions/base.rb
Сколько стоит минимальный биллинговый интервал (1 день)
Подписка (стоимость)
app/models/billing/subscriptions/base.rb
Сколько стоит минимальный биллинговый интервал (1 день)
• сколько стоит полный интервал обслуживания пользователя
Подписка (стоимость)
app/models/billing/subscriptions/base.rb
Сколько стоит минимальный биллинговый интервал (1 день)
• сколько стоит полный интервал обслуживания пользователя
• сколько средств уже потрачено
Подписка (стоимость)
app/models/billing/subscriptions/base.rb
Сколько стоит минимальный биллинговый интервал (1 день)
• сколько стоит полный интервал обслуживания пользователя
• сколько средств уже потрачено
• сколько средств можно вернуть
Подписка (стоимость)
app/models/billing/subscriptions/base.rb
Подписка (биллинговый интервал)app/models/billing/subscriptions/base.rb
Подписка (биллинговый интервал)app/models/billing/subscriptions/base.rb
Подписка (биллинговый интервал)app/models/billing/subscriptions/base.rb
Подписка (биллинговый интервал)app/models/billing/subscriptions/base.rb
Подписка (биллинговый интервал)app/models/billing/subscriptions/base.rb
Подписка (процесс биллинга)app/models/billing/subscriptions/base.rb
• Выставляется дата следующего биллинга
Подписка (процесс биллинга)app/models/billing/subscriptions/base.rb
• Выставляется дата следующего биллинга
• сдвиг на 30, 365 дней и так далее.
Подписка (процесс биллинга)app/models/billing/subscriptions/base.rb
• Выставляется дата следующего биллинга
• сдвиг на 30, 365 дней и так далее.
• Расчитывается стоимость полученного интервала;
Подписка (процесс биллинга)app/models/billing/subscriptions/base.rb
• Выставляется дата следующего биллинга
• сдвиг на 30, 365 дней и так далее.
• Расчитывается стоимость полученного интервала;
• Создаётся инвойс
Подписка (процесс биллинга)app/models/billing/subscriptions/base.rb
• Выставляется дата следующего биллинга
• сдвиг на 30, 365 дней и так далее.
• Расчитывается стоимость полученного интервала;
• Создаётся инвойс
• Оповещение пользователя (email, sms).
Подписка (процесс биллинга)app/models/billing/subscriptions/base.rb
Инвойс (счёт)app/models/billing/invoice.rb
Инвойс (счёт)
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)• срок оплаты (due date)
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)• срок оплаты (due date)• общая сумма, которую должен заплатить клиент
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)• срок оплаты (due date)• общая сумма, которую должен заплатить клиент
• человеко-понятная информация:
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)• срок оплаты (due date)• общая сумма, которую должен заплатить клиент
• человеко-понятная информация:• описание услуг
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)• срок оплаты (due date)• общая сумма, которую должен заплатить клиент
• человеко-понятная информация:• описание услуг• стоимость
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)• срок оплаты (due date)• общая сумма, которую должен заплатить клиент
• человеко-понятная информация:• описание услуг• стоимость• скидки
app/models/billing/invoice.rb
Инвойс (счёт)
• дата создания (issue date)• срок оплаты (due date)• общая сумма, которую должен заплатить клиент
• человеко-понятная информация:• описание услуг• стоимость• скидки• …
app/models/billing/invoice.rb
Инвойс (счёт)
app/models/billing/invoice.rb
• ничего не знает о том, в результате чего он был создан;
Инвойс (счёт)
app/models/billing/invoice.rb
• ничего не знает о том, в результате чего он был создан;• знает о транзакциях, которые проводились с ним;
Инвойс (счёт)
app/models/billing/invoice.rb
• ничего не знает о том, в результате чего он был создан;• знает о транзакциях, которые проводились с ним;
1. class Billing::Invoice < ActiveRecord::Base2. 3. belongs_to :account, :inverse_of => :billing_transactions4. has_many :transactions, :class_name => "Billing::Transaction"5. 6. end
Инвойс (счёт)
app/models/billing/invoice.rb
• могут быть применены скидочные купоны;• основание для совершения действий над аккаунтом
пользователя:– перевод на более другой план при отсутвии оплаты;– блокировка функциональности;
Инвойс (счёт)
app/models/billing/invoice.rb
Оплата
Active Merchant
• code extraction из Shopify• > около 100 платёжных провайдеров• в production с 2006 года
• есть интеграция с Robokassa
http://activemerchant.org/
Оплата
Оплата (мир)
Оплата (мир)
https://www.braintreepayments.com/
Оплата (мир)
https://www.braintreepayments.com/
Оплата (мир)
Оплата (Braintree)https://www.braintreepayments.com/
• USA, Europe, Canada, Australia;
Оплата (Braintree)https://www.braintreepayments.com/
• USA, Europe, Canada, Australia;• До сих пор нет в России;
Оплата (Braintree)https://www.braintreepayments.com/
• USA, Europe, Canada, Australia;• До сих пор нет в России;• > 130 валют;
Оплата (Braintree)https://www.braintreepayments.com/
• USA, Europe, Canada, Australia;• До сих пор нет в России;• > 130 валют;
• PCI Compliance за 15 минут;
Оплата (Braintree)https://www.braintreepayments.com/
Безопасное хранение информации о кредитных картах
1. class Billing::Card2. ...3. result = Braintree::CreditCard.create({4. :customer_id => self.user.try(:braintree_customer_id),5. :number => self.number,6. :expiration_date => self.expiration_date.strftime('%m/%Y'),7. :cardholder_name => [self.first_name, self.last_name].compact.join(' ')8. })9. 10. if result.success?11. self.token = result.credit_card.token 12. else13. self.errors.add(:base, result.errors.first.message)14. return false15. end16.end
https://www.braintreepayments.com/
Оплата (Braintree)
Оплата (Россия)
Оплата (Россия)
https://paysio.com/
Оплата (Россия)
Транзакция
app/models/billing/transaction.rb
Транзакция
• зачисление средств на внутренний счёт
app/models/billing/transaction.rb
Транзакция
• зачисление средств на внутренний счёт• списание средств с внутреннего счёта
app/models/billing/transaction.rb
Транзакция
• зачисление средств на внутренний счёт• списание средств с внутреннего счёта• оплата через Braintree
app/models/billing/transaction.rb
Транзакция
• зачисление средств на внутренний счёт• списание средств с внутреннего счёта• оплата через Braintree
• оплата через PayPal (авторизация + списание средств)
app/models/billing/transaction.rb
Транзакция
app/models/billing/transaction.rb
Транзакция
• Хранит информацию о всех манипуляциях со средствами пользователя: удачных и неудачных.
app/models/billing/transaction.rb
Транзакция
• Хранит информацию о всех манипуляциях со средствами пользователя: удачных и неудачных.
• В зависимости от типа может инициировать оплату с помощью выбранного провайдера платежей.
app/models/billing/transaction.rb
Транзакция
• Хранит информацию о всех манипуляциях со средствами пользователя: удачных и неудачных.
• В зависимости от типа может инициировать оплату с помощью выбранного провайдера платежей.
• В некоторых случаях может быть отменена.
app/models/billing/transaction.rb