Authorize Net (AIM) payment integration with rails

Authorize Net (AIM) method enables internet merchants to accept online payments via credit card. We shall see how to integrate authorize net payment gateway inside a rails app to accept online payments using activemerchant library.

  # Gemfile
  gem 'activemerchant', :require => 'active_merchant'

Register for authorize net sandbox account click here

Payment gateway credentials

# config/authorize_net.yml
development: &development
    mode: test
    login: 9gdLh6T
    key: 67fu45xw6VP92LX1

production:
   <<: *development

test:
   <<: *development

Payment & creditcard form

# app/views/payments/new
= form_for @payment, :url => payments_url do |f|
  = f.text_field :amount
  = fields_for :creditcard, @creditcard do |cc|
    = cc.text_field :name
    = cc.text_field :number
    = cc.select :month, Date::ABBR_MONTHNAMES.compact.each_with_index.collect{|m, i| [m, i+1]}, {:prompt => 'Select'}
    = cc.select :year, Array.new(15){|i| Date.current.year+i}, {:prompt => 'Select'}
    = cc.text_field :verification_value
  = f.submit 'Pay'

Payments Controller

# app/controllers/payments_controller.rb
class PaymentsController < ApplicationController

  def new
    @payment = Payment.new
    @creditcard = ActiveMerchant::Billing::CreditCard.new
  end

  def create
    @payment = Payment.new(params[:payment])
    @creditcard = ActiveMerchant::Billing::CreditCard.new(params[:creditcard])
    @payment.valid_card = @creditcard.valid?
    if @payment.valid?
      @payment = @payment.process_payment(@creditcard)
      if @payment.success?
        @payment.save
        flash[:notice] = I18n.t('payment.success')
        redirect_to payments_url and return
      else
        flash[:error] = I18n.t('payment.failed')
      end
    end
    render :action => :new
  end
end

Generate & Migrate Payment Model

  rails g model payment status:string amount:float transaction_number:string
  rake db:migrate

Payment Model

# app/models/payment.rb
class Payment < ActiveRecord::Base

  PROCESSING, FAILED, SUCCESS = 1, 2, 3

  validates :valid_card, :inclusion => {:in => [true], :message => 'Invalid Credit Card'}
  validates :amount, :presence => true, :numericality => { :greater_than => 0 }

  def process_payment(creditcard)
    ActiveMerchant::Billing::Base.mode = auth['mode'].to_sym
    self.status = PROCESSING
    response = gateway.purchase(amount * 100, creditcard)

    if response.success?
      self.transaction_number = response.subscription_id
      self.status = SUCCESS
    else
      self.status = FAILED
    end
    return self
  rescue Exception => e
    self.status = FAILED
    return self
  end

  def success?
    self.status == SUCCESS
  end

  private
  def gateway
    ActiveMerchant::Billing::AuthorizeNetGateway.new(
      :login    => auth['login'],
      :password => auth['key'])
  end

  def auth
    @@auth ||= YAML.load_file("#{Rails.root}/config/authorize_net.yml")[Rails.env]
  end
end
Advertisements

About sandipransing

Web Developer #ruby #rails #JS
This entry was posted in Ruby on Rails. Bookmark the permalink.

3 Responses to Authorize Net (AIM) payment integration with rails

  1. Miriam DeAna says:

    Have you ever done this with spree? I’m having more trouble integrating it with spree than doing it from scrap.

  2. Ashok says:

    In Rails application Authorize.net CIM is not created the customer profile id and customer payment profile id i used the below code could you please help what is i missed in the below code

    ———————————————————-
    def purchase
    options = {:profile => {
    :merchant_customer_id => self.ordid,
    :email => self.user.present? ? self.user.email.to_s : “ashok@dine-media.com”
    }
    }
    customer_profile = GATEWAY.create_customer_profile(options)
    customer_profile_id = customer_profile.params[“customer_profile_id”]
    payment_profile = {
    :bill_to => {
    :first_name => billing_first_name,
    :last_name => billing_last_name,
    :address => billing_address,
    :state => billing_state,
    :zip => billing_zip,
    :phone_number => billing_phone
    },
    :payment => {
    :credit_card => credit_card
    }
    }
    options = {
    :customer_profile_id => customer_profile_id,
    :payment_profile => payment_profile
    }
    payment_profile = GATEWAY.create_customer_payment_profile(options)
    customer_payment_profile_id = payment_profile.params[“customer_payment_profile_id”]
    transaction =
    {:transaction => {
    :type => :auth_capture,
    :amount => price_in_cents,
    :customer_profile_id => customer_profile_id,
    :customer_payment_profile_id => customer_payment_profile_id
    }
    }
    response = GATEWAY.create_customer_profile_transaction(transaction)
    response.success?
    end

    ———————————-

  3. Rana Azmat says:

    Awsome example, but i face some error that undefined method “valid_card” can you explain this .

    Thanks for the help

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s