Money gem - работа с деньгами

Posted on December 22, 2008
Если есть необходимость работать с разными валютами, да и вообще с деньгами, то есть специальный gem - Money
Например, для конвертации одной валюты в другую можно использовать следующий код:

Money.bank = VariableExchangeBank.new
  Money.bank.add_rate("USD", "CAD", 1.24515)
  Money.bank.add_rate("CAD", "USD", 0.803115)
  Money.us_dollar(100).exchange_to("CAD") => Money.ca_dollar(124)
  Money.ca_dollar(100).exchange_to("USD") => Money.us_dollar(80)
Так-же при необходимости можно легко конвертировать из долларов в центы и обратно.

irb(main):004:0> 100.to_money
=> #<Money:0xb7893db8 @bank=#<Money::VariableExchangeBank:0xb7899024 @mutex=#<Mutex:0xb7898fd4>, @rates={}>, @currency="USD", @cents=10000>
Таким образом, если вы делаете интеграцию с несколькими платежными системами, работающими в разных валютах, то сможете для каждого пользователя показывать ту валюту которую он выбрал Блогун - монетизируем блоги

Webgen - генерируйте статические сайты

Posted on December 11, 2008
Несмотря на всеобщую рекламу всяких CMS зачастую для простого сайта визитки они являются overkill. Для этой цели можно использовать шаблоны написанные с использованием SSI. Но не всегда им удобно пользоваться, да и меню придется делать вручную. Одним из способов генерации сайтов является WebGen. Начать работу с ним довольно просто:
webgen create /path/to/site
После чего создасться структура сайта с шаблонами и css.
Для создания страниц используются файлы .page
Меню автогенерируется(довольно гибко конфигурируется). Есть некоторое количество встроенных модулей и можно расширять функционал своими.
P.S. хинт, позиция страницы в меню указывается директивой sort_info: 1

Использование плагина active_merchant для работы с кредитными картами

Posted on December 07, 2008
Одним из лучших плагинов для интеграции с платежными системами является плагин Active Merchant. В нем реализовано большое количество различных гейтов в популярные зарубежные платежные системы. Одной из таких платежных систем является Authorize.net которая позволяет проводить операции с банковскими картами.
Для начала нам необходимо установить сам плагин в приложение

script/plugin install http://activemerchant.googlecode.com/svn/trunk/active_merchant
После установки можно приступать к его настройке, а именно получению тестового аккаунта на Authorize.net и настройкой поведения при различных environment в rails.
В файле environment.rb необходимо дописать следующий код:

unless RAILS_ENV == 'production'
  ActiveMerchant::Billing::Base.mode = :test
end
Который сообщит приложению что надо использовать тестовый интерфейс если приложение не в production режиме.
Для успешной транзакции необходимо проделать следующие проверки:
  • проверить верность номера карты
  • Авторизовать карту на authorize.net
  • Списать средства

Проверка верности карты


creditcard = ActiveMerchant::Billing::CreditCard.new(
      :number => params[:cc_number], 
      :month => params[:cc_month],
      :year => params[:cc_year],              
      :first_name => params[:first_name],      
      :last_name => params[:last_name],
      :type => params[:cc_type],
      :verification_value => params[:cvv]
    )
    if creditcard.valid?
       #Данные карты верны
   end
При неудачной проверке ошибки сходны с ошибками ActiveRecord

Авторизация карты на Authorize.net


 options = {
      :address => {},
      :billing_address => { 
        :name => params[:full_name],
        :address1 => params[:address],
        :city     => params[:city],
        :state    => params[:state],
        :country  => params[:country],
        :zip      => params[:zip],
        :phone    => params[:phone]
      }
    }
   
    gateway = AuthorizeNetGateway.new(
      :login => 'APILOGINLOGINLOGIN',         #API Login ID
      :password => 'APIPASSWORD' #API Password
    )

    response = gateway.authorize(1000, creditcard, options)
    unless response.success?
      @message = response.message.to_s
      render :action => 'error'
    end
Следует помнить, что суммы списываются в центах.

Списание средств


 gateway.capture(1000, response.authorization)
После чего с карты будет списано 10 долларов.