Использование плагина 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 долларов.