Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Billing in Rails SaaS-applications

Billing in Rails SaaS-applications

Presentation for my speech on DevConf 2013

Igor Alexandrov

June 14, 2013
Tweet

More Decks by Igor Alexandrov

Other Decks in Programming

Transcript

  1. 2

  2. PCI Сompliance https://www.pcisecuritystandards.org/ Набор требований для организаций, сервиса и оборудования,

    которое работает с платёжными данными пользователей. 3 стандарта: • Data Security Standard (PCI DSS), • Payment Application Data Security Standard (PA-DSS) • PIN Transaction Security (PTS)
  3. 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
  4. Аренда биллинга: плюсы Скорость внедрения Наличие API и библиотек (Ruby)

    “Проверенная работоспособность” Ослабленные требования PCI Compliance
  5. Сложность внесения изменений Зависимость от внешнего сервиса Сложность в использовании

    нескольких вариантов платежей Постоплатный биллинг Аренда биллинга: минусы
  6. Разработка биллинга: плюсы Различные варианты оплаты Любая логика работы подписки

    Централизация данных Слабая зависимость от сторонних сервисов
  7. SpaceShip • Тарифный план • Подписка • Процесс биллинга •

    Биллинговый интервал • Инвойс • Оплата и транзакции • Хранение кредитных карт
  8. Тарифный план • Стоимости услуг за единицу времени – месячная

    стоимость – годовая стоимость – квартальная стоимость – … app/models/billing/plan.rb
  9. Тарифный план • Стоимости услуг за единицу времени – месячная

    стоимость – годовая стоимость – квартальная стоимость – … • Набор ресурсов, который может быть доступен пользователю app/models/billing/plan.rb
  10. Тарифный план • Стоимости услуг за единицу времени – месячная

    стоимость – годовая стоимость – квартальная стоимость – … • Набор ресурсов, который может быть доступен пользователю • Длительность (наличие) триального периода app/models/billing/plan.rb
  11. Подписка • Пользователь • Тарифный план • Биллинговый интервал •

    Выбранные параметры – максимальное число пользователей, товаров, места на диске… app/models/billing/subscriptions/base.rb
  12. Подписка • Пользователь • Тарифный план • Биллинговый интервал •

    Выбранные параметры – максимальное число пользователей, товаров, места на диске… • Набор дополнительных сервисов (тарифицируются отдельно) – интеграция с внешним источником данных – дополнителные услуги, входящие в более премиальные планы app/models/billing/subscriptions/base.rb
  13. Сколько стоит минимальный биллинговый интервал (1 день) • сколько стоит

    полный интервал обслуживания пользователя Подписка (стоимость) app/models/billing/subscriptions/base.rb
  14. Сколько стоит минимальный биллинговый интервал (1 день) • сколько стоит

    полный интервал обслуживания пользователя • сколько средств уже потрачено Подписка (стоимость) app/models/billing/subscriptions/base.rb
  15. Сколько стоит минимальный биллинговый интервал (1 день) • сколько стоит

    полный интервал обслуживания пользователя • сколько средств уже потрачено • сколько средств можно вернуть Подписка (стоимость) app/models/billing/subscriptions/base.rb
  16. • Выставляется дата следующего биллинга • сдвиг на 30, 365

    дней и так далее. Подписка (процесс биллинга) app/models/billing/subscriptions/base.rb
  17. • Выставляется дата следующего биллинга • сдвиг на 30, 365

    дней и так далее. • Расчитывается стоимость полученного интервала; Подписка (процесс биллинга) app/models/billing/subscriptions/base.rb
  18. • Выставляется дата следующего биллинга • сдвиг на 30, 365

    дней и так далее. • Расчитывается стоимость полученного интервала; • Создаётся инвойс • Оповещение пользователя (email, sms). Подписка (процесс биллинга) app/models/billing/subscriptions/base.rb
  19. Инвойс (счёт) • дата создания (issue date) • срок оплаты

    (due date) • общая сумма, которую должен заплатить клиент app/models/billing/invoice.rb
  20. Инвойс (счёт) • дата создания (issue date) • срок оплаты

    (due date) • общая сумма, которую должен заплатить клиент • человеко-понятная информация: • описание услуг • стоимость • скидки • … app/models/billing/invoice.rb
  21. • ничего не знает о том, в результате чего он

    был создан; Инвойс (счёт) app/models/billing/invoice.rb
  22. • ничего не знает о том, в результате чего он

    был создан; • знает о транзакциях, которые проводились с ним; Инвойс (счёт) app/models/billing/invoice.rb
  23. • ничего не знает о том, в результате чего он

    был создан; • знает о транзакциях, которые проводились с ним; 1. class Billing::Invoice < ActiveRecord::Base 2. 3. belongs_to :user, :inverse_of => :billing_transactions 4. has_many :transactions, :class_name => "Billing::Transaction" 5. 6. end Инвойс (счёт) app/models/billing/invoice.rb
  24. • могут быть применены скидочные купоны; • основание для совершения

    действий над аккаунтом пользователя: – перевод на более другой план при отсутвии оплаты; – блокировка функциональности; Инвойс (счёт) app/models/billing/invoice.rb
  25. Active Merchant • code extraction из Shopify • > около

    100 платёжных провайдеров • в production с 2006 года • есть интеграция с Robokassa http://activemerchant.org/
  26. Braintree • USA, Europe, Canada, Australia; • До сих пор

    нет в России; • > 130 валют;
  27. Braintree • USA, Europe, Canada, Australia; • До сих пор

    нет в России; • > 130 валют; • PCI Compliance за 15 минут;
  28. Braintree Безопасное хранение информации о кредитных картах 1. class Billing::Card

    2. ... 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. else 13. self.errors.add(:base, result.errors.first.message) 14. return false 15. end 16.end https://www.braintreepayments.com/
  29. Транзакция • зачисление средств на внутренний счёт • списание средств

    с внутреннего счёта • оплата через Braintree app/models/billing/transaction.rb
  30. Транзакция • зачисление средств на внутренний счёт • списание средств

    с внутреннего счёта • оплата через Braintree • оплата через PayPal (авторизация + списание средств) app/models/billing/transaction.rb
  31. Транзакция • Хранит информацию о всех манипуляциях со средствами пользователя:

    удачных и неудачных. • В зависимости от типа может инициировать оплату с помощью выбранного провайдера платежей. app/models/billing/transaction.rb
  32. Транзакция • Хранит информацию о всех манипуляциях со средствами пользователя:

    удачных и неудачных. • В зависимости от типа может инициировать оплату с помощью выбранного провайдера платежей. • В некоторых случаях может быть отменена. app/models/billing/transaction.rb